ledger balances helpers like Sub, Sum, Invert

main
Bel LaPointe 2024-12-12 22:17:08 -07:00
parent 849a8696f5
commit eb3af4b54f
2 changed files with 58 additions and 9 deletions

View File

@ -4,7 +4,6 @@ import (
"flag"
"fmt"
"io"
"maps"
"os"
"slices"
@ -101,14 +100,7 @@ func Main() {
for _, date := range register.Dates() {
balances := register[date]
newBalances := make(ledger.Balances)
for k, v := range balances {
if got := prev[k]; !maps.Equal(v, got) {
newBalances[k] = v
}
}
if len(newBalances) > 0 {
if newBalances := balances.Sub(prev).Nonzero(); len(newBalances) > 0 {
fmt.Println(date)
FPrintBalances(os.Stdout, newBalances)
}

View File

@ -11,6 +11,30 @@ type Balances map[string]Balance
type Balance map[Currency]float64
func (balances Balances) Sub(other Balances) Balances {
result := make(Balances)
for k, v := range balances {
result[k] = v.Sub(other[k])
}
for k, v := range other {
if _, ok := balances[k]; ok {
continue
}
result[k] = v.Invert()
}
return result
}
func (balances Balances) Nonzero() Balances {
result := make(Balances)
for k, v := range balances {
if nonzero := v.Nonzero(); len(nonzero) > 0 {
result[k] = nonzero
}
}
return result
}
func (balances Balances) NotLike(pattern string) Balances {
result := make(Balances)
p := regexp.MustCompile(pattern)
@ -98,6 +122,39 @@ func (balances Balances) Push(d Delta) {
balances[d.Name].Push(d)
}
func (balance Balance) Sub(other Balance) Balance {
return balance.Sum(other.Invert())
}
func (balance Balance) Sum(other Balance) Balance {
result := make(Balance)
for k, v := range balance {
result[k] += v
}
for k, v := range other {
result[k] += v
}
return result
}
func (balance Balance) Nonzero() Balance {
result := make(Balance)
for k, v := range balance {
if v != 0 {
result[k] = v
}
}
return result
}
func (balance Balance) Invert() Balance {
result := make(Balance)
for k, v := range balance {
result[k] = v * -1.0
}
return result
}
func (balance Balance) Push(d Delta) {
if _, ok := balance[d.Currency]; !ok {
balance[d.Currency] = 0