test balances push
parent
29fec124af
commit
a76e7b5546
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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"])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in New Issue