Deltas does Balances and Like

main
Bel LaPointe 2023-10-24 12:57:17 -06:00
parent 480d358f5a
commit b93de87db4
3 changed files with 35 additions and 26 deletions

28
ledger/deltas.go Normal file
View File

@ -0,0 +1,28 @@
package ledger
type Deltas []Delta
func (deltas Deltas) Like(like ...Like) Deltas {
result := make(Deltas, 0, len(deltas))
for i := range deltas {
if likes(like).all(deltas[i]) {
result = append(result, deltas[i])
}
}
return result
}
func (deltas Deltas) Balances() (map[string]map[Currency]float64, error) {
result := make(map[string]map[Currency]float64)
for _, delta := range deltas {
if _, ok := result[delta.Account]; !ok {
result[delta.Account] = make(map[Currency]float64)
}
if _, ok := result[delta.Account][delta.Currency]; !ok {
result[delta.Account][delta.Currency] = 0
}
result[delta.Account][delta.Currency] += delta.Value
}
return result, nil
}

View File

@ -12,27 +12,12 @@ func NewFiles(p string, q ...string) (Files, error) {
return f, err
}
func Balances(deltas []Delta) (map[string]map[Currency]float64, error) {
result := make(map[string]map[Currency]float64)
for _, delta := range deltas {
if _, ok := result[delta.Account]; !ok {
result[delta.Account] = make(map[Currency]float64)
}
if _, ok := result[delta.Account][delta.Currency]; !ok {
result[delta.Account][delta.Currency] = 0
}
result[delta.Account][delta.Currency] += delta.Value
}
return result, nil
}
func (files Files) Deltas(like ...Like) ([]Delta, error) {
func (files Files) Deltas(like ...Like) (Deltas, error) {
transactions, err := files.transactions()
if err != nil {
return nil, err
}
result := make([]Delta, 0, len(transactions)*2)
result := make(Deltas, 0, len(transactions)*2)
for _, transaction := range transactions {
sums := map[string]float64{}
for _, acc := range transaction.recipients {
@ -44,9 +29,7 @@ func (files Files) Deltas(like ...Like) ([]Delta, error) {
acc.value,
acc.currency,
)
if likes(like).all(delta) {
result = append(result, delta)
}
result = append(result, delta)
}
for currency, value := range sums {
if value == 0 {
@ -62,10 +45,8 @@ func (files Files) Deltas(like ...Like) ([]Delta, error) {
-1.0*value,
currency,
)
if likes(like).all(delta) {
result = append(result, delta)
}
result = append(result, delta)
}
}
return result, nil
return result.Like(like...), nil
}

View File

@ -36,7 +36,7 @@ func TestFileTestdata(t *testing.T) {
t.Fatal(err)
}
balances, err := Balances(deltas)
balances, err := deltas.Balances()
if err != nil {
t.Fatal(err)
}
@ -51,7 +51,7 @@ func TestFileTestdata(t *testing.T) {
t.Fatal(err)
}
balances, err := Balances(deltas)
balances, err := deltas.Balances()
if err != nil {
t.Fatal(err)
}