From 54913b21c996c989f9a98acb94cbacdb8758610d Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Wed, 25 Oct 2023 08:21:16 -0600 Subject: [PATCH] deltas.Group(GroupName("^[^:]*")) --- ledger/deltas.go | 8 ++++++++ ledger/deltas_test.go | 26 ++++++++++++++++++++++++++ ledger/group.go | 9 +++++++++ 3 files changed, 43 insertions(+) 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 {