From a76e7b55461364b89259bb33cec9c5a9689bd090 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Wed, 25 Oct 2023 07:16:42 -0600 Subject: [PATCH] test balances push --- ledger/balances.go | 16 ++++++++++++++++ ledger/balances_test.go | 19 +++++++++++++++++++ ledger/deltas.go | 24 ++++++++++++++++++++++++ todo.yaml | 1 + 4 files changed, 60 insertions(+) create mode 100644 ledger/balances_test.go diff --git a/ledger/balances.go b/ledger/balances.go index 4b108da..b88f88a 100644 --- a/ledger/balances.go +++ b/ledger/balances.go @@ -9,6 +9,22 @@ type Balances map[string]Balance type Balance map[Currency]float64 +func (balances Balances) PushAll(other Balances) { + for k, v := range other { + if _, ok := balances[k]; !ok { + balances[k] = v + } else { + for k2, v2 := range v { + if _, ok := balances[k][k2]; !ok { + balances[k][k2] = v2 + } else { + balances[k][k2] += v2 + } + } + } + } +} + func (balances Balances) Push(d Delta) { if _, ok := balances[d.Name]; !ok { balances[d.Name] = make(Balance) diff --git a/ledger/balances_test.go b/ledger/balances_test.go new file mode 100644 index 0000000..d534f58 --- /dev/null +++ b/ledger/balances_test.go @@ -0,0 +1,19 @@ +package ledger + +import "testing" + +func TestBalances(t *testing.T) { + t.Run("push", func(t *testing.T) { + b := make(Balances) + b.Push(Delta{Name: "x", Currency: "y", Value: 0.1}) + b.Push(Delta{Name: "x", Currency: "y", Value: 1.2}) + b.Push(Delta{Name: "x", Currency: "z", Value: 2.3}) + ba := b["x"] + if ba["y"] != 1.3 { + t.Error(ba["y"]) + } + if ba["z"] != 2.3 { + t.Error(ba["z"]) + } + }) +} diff --git a/ledger/deltas.go b/ledger/deltas.go index e842795..d69d280 100644 --- a/ledger/deltas.go +++ b/ledger/deltas.go @@ -1,5 +1,7 @@ package ledger +import "slices" + type Deltas []Delta func (deltas Deltas) Like(like ...Like) Deltas { @@ -12,6 +14,28 @@ func (deltas Deltas) Like(like ...Like) Deltas { return result } +func (deltas Deltas) Register() (map[string]Balances, error) { + dateToBalances := map[string]Balances{} + for _, delta := range deltas { + if _, ok := dateToBalances[delta.Date]; !ok { + dateToBalances[delta.Date] = make(Balances) + } + dateToBalances[delta.Date].Push(delta) + } + dates := make([]string, 0, len(dateToBalances)+1) + for k := range dateToBalances { + dates = append(dates, k) + } + slices.Sort(dates) + for i := range dates { + if i == 0 { + continue + } + dateToBalances[dates[i]].PushAll(dateToBalances[dates[i-1]]) + } + return dateToBalances, nil +} + func (deltas Deltas) Balances() (Balances, error) { result := make(Balances) for _, delta := range deltas { diff --git a/todo.yaml b/todo.yaml index 2a16ef6..21dea49 100755 --- a/todo.yaml +++ b/todo.yaml @@ -1,4 +1,5 @@ todo: +- balances over time window - = VAL - bpi.dat scheduled: []