diff --git a/ledger/deltas.go b/ledger/deltas.go new file mode 100644 index 0000000..61d1848 --- /dev/null +++ b/ledger/deltas.go @@ -0,0 +1,28 @@ +package ledger + +type Deltas []Delta + +func (deltas Deltas) Like(like ...Like) Deltas { + result := make(Deltas, 0, len(deltas)) + for i := range deltas { + if likes(like).all(deltas[i]) { + result = append(result, deltas[i]) + } + } + return result +} + +func (deltas Deltas) Balances() (map[string]map[Currency]float64, error) { + result := make(map[string]map[Currency]float64) + for _, delta := range deltas { + if _, ok := result[delta.Account]; !ok { + result[delta.Account] = make(map[Currency]float64) + } + if _, ok := result[delta.Account][delta.Currency]; !ok { + result[delta.Account][delta.Currency] = 0 + } + result[delta.Account][delta.Currency] += delta.Value + } + + return result, nil +} diff --git a/ledger/file.go b/ledger/file.go index e3ba278..da48f8e 100644 --- a/ledger/file.go +++ b/ledger/file.go @@ -12,27 +12,12 @@ func NewFiles(p string, q ...string) (Files, error) { return f, err } -func Balances(deltas []Delta) (map[string]map[Currency]float64, error) { - result := make(map[string]map[Currency]float64) - for _, delta := range deltas { - if _, ok := result[delta.Account]; !ok { - result[delta.Account] = make(map[Currency]float64) - } - if _, ok := result[delta.Account][delta.Currency]; !ok { - result[delta.Account][delta.Currency] = 0 - } - result[delta.Account][delta.Currency] += delta.Value - } - - return result, nil -} - -func (files Files) Deltas(like ...Like) ([]Delta, error) { +func (files Files) Deltas(like ...Like) (Deltas, error) { transactions, err := files.transactions() if err != nil { return nil, err } - result := make([]Delta, 0, len(transactions)*2) + result := make(Deltas, 0, len(transactions)*2) for _, transaction := range transactions { sums := map[string]float64{} for _, acc := range transaction.recipients { @@ -44,9 +29,7 @@ func (files Files) Deltas(like ...Like) ([]Delta, error) { acc.value, acc.currency, ) - if likes(like).all(delta) { - result = append(result, delta) - } + result = append(result, delta) } for currency, value := range sums { if value == 0 { @@ -62,10 +45,8 @@ func (files Files) Deltas(like ...Like) ([]Delta, error) { -1.0*value, currency, ) - if likes(like).all(delta) { - result = append(result, delta) - } + result = append(result, delta) } } - return result, nil + return result.Like(like...), nil } diff --git a/ledger/file_test.go b/ledger/file_test.go index a43633d..3d867a3 100644 --- a/ledger/file_test.go +++ b/ledger/file_test.go @@ -36,7 +36,7 @@ func TestFileTestdata(t *testing.T) { t.Fatal(err) } - balances, err := Balances(deltas) + balances, err := deltas.Balances() if err != nil { t.Fatal(err) } @@ -51,7 +51,7 @@ func TestFileTestdata(t *testing.T) { t.Fatal(err) } - balances, err := Balances(deltas) + balances, err := deltas.Balances() if err != nil { t.Fatal(err) }