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 }