diff --git a/ledger/deltas.go b/ledger/deltas.go index 31d598b..0f1b3a4 100644 --- a/ledger/deltas.go +++ b/ledger/deltas.go @@ -6,6 +6,14 @@ import ( type Deltas []Delta +func (deltas Deltas) Group(group ...Group) Deltas { + result := make(Deltas, 0, len(deltas)) + for i := range deltas { + result = append(result, Groups(group).Each(deltas[i])) + } + return result +} + func (deltas Deltas) Like(like ...Like) Deltas { result := make(Deltas, 0, len(deltas)) for i := range deltas { diff --git a/ledger/deltas_test.go b/ledger/deltas_test.go index 3f13859..859e639 100644 --- a/ledger/deltas_test.go +++ b/ledger/deltas_test.go @@ -3,6 +3,32 @@ package ledger import "testing" func TestDeltas(t *testing.T) { + t.Run("Groups", func(t *testing.T) { + deltas := Deltas{ + {Name: "a1"}, + {Name: "b1"}, + {Name: "b2"}, + {Name: "b3"}, + } + + deltas = deltas.Group(GroupName("^.")) + if len(deltas) != 4 { + t.Error(len(deltas)) + } + if deltas[0].Name != "a" { + t.Error(deltas[0].Name) + } + if deltas[1].Name != "b" { + t.Error(deltas[1].Name) + } + if deltas[2].Name != "b" { + t.Error(deltas[2].Name) + } + if deltas[3].Name != "b" { + t.Error(deltas[3].Name) + } + }) + t.Run("balances", func(t *testing.T) { deltas := Deltas{ {Name: "a", Value: 0}, diff --git a/ledger/group.go b/ledger/group.go index 82ea816..abe5b83 100644 --- a/ledger/group.go +++ b/ledger/group.go @@ -4,6 +4,15 @@ import "regexp" type Group func(Delta) Delta +type Groups []Group + +func (groups Groups) Each(d Delta) Delta { + for i := range groups { + d = groups[i](d) + } + return d +} + func GroupDate(pattern string) Group { p := regexp.MustCompile(pattern) return func(d Delta) Delta {