diff --git a/src/ledger/balances.go b/src/ledger/balances.go index 94c6233..01533a5 100644 --- a/src/ledger/balances.go +++ b/src/ledger/balances.go @@ -22,6 +22,29 @@ func (balances Balances) Like(pattern string) Balances { return result } +func (balances Balances) Group(pattern string) Balances { + result := make(Balances) + p := regexp.MustCompile(pattern) + for k, v := range balances { + k2 := p.FindString(k) + if k2 == "" { + k2 = k + } + + was := result[k2] + if was == nil { + was = make(Balance) + } + + for k3, v3 := range v { + was[k3] += v3 + } + + result[k2] = was + } + return result +} + func (balances Balances) WithBPIs(bpis BPIs) Balances { return balances.WithBPIsAt(bpis, "9") } diff --git a/src/ledger/balances_test.go b/src/ledger/balances_test.go index 7d4e938..1356b77 100644 --- a/src/ledger/balances_test.go +++ b/src/ledger/balances_test.go @@ -51,4 +51,33 @@ func TestBalances(t *testing.T) { t.Error("didnt sum other", b["ab"]) } }) + + t.Run("like", func(t *testing.T) { + was := make(Balances) + was.Push(Delta{Name: "a", Currency: USD, Value: 0.1}) + was.Push(Delta{Name: "ab", Currency: USD, Value: 1.2}) + + got := was.Like(`^ab$`) + if len(got) != 1 || got["ab"][USD] != 1.2 { + t.Error(got) + } + }) + + t.Run("group", func(t *testing.T) { + was := make(Balances) + was.Push(Delta{Name: "a:1", Currency: USD, Value: 0.1}) + was.Push(Delta{Name: "a:2", Currency: USD, Value: 1.2}) + was.Push(Delta{Name: "b:1", Currency: USD, Value: 2.2}) + + got := was.Group(`^[^:]*`) + if len(got) != 2 { + t.Error(got) + } + if got["a"][USD] != 1.3 { + t.Error(got) + } + if got["b"][USD] != 2.2 { + t.Error(got) + } + }) }