test balances push

main
Bel LaPointe 2023-10-25 07:16:42 -06:00
parent 29fec124af
commit a76e7b5546
4 changed files with 60 additions and 0 deletions

View File

@ -9,6 +9,22 @@ type Balances map[string]Balance
type Balance map[Currency]float64 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) { func (balances Balances) Push(d Delta) {
if _, ok := balances[d.Name]; !ok { if _, ok := balances[d.Name]; !ok {
balances[d.Name] = make(Balance) balances[d.Name] = make(Balance)

19
ledger/balances_test.go Normal file
View File

@ -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"])
}
})
}

View File

@ -1,5 +1,7 @@
package ledger package ledger
import "slices"
type Deltas []Delta type Deltas []Delta
func (deltas Deltas) Like(like ...Like) Deltas { func (deltas Deltas) Like(like ...Like) Deltas {
@ -12,6 +14,28 @@ func (deltas Deltas) Like(like ...Like) Deltas {
return result 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) { func (deltas Deltas) Balances() (Balances, error) {
result := make(Balances) result := make(Balances)
for _, delta := range deltas { for _, delta := range deltas {

View File

@ -1,4 +1,5 @@
todo: todo:
- balances over time window
- = VAL - = VAL
- bpi.dat - bpi.dat
scheduled: [] scheduled: []