package ledger type Files []string func NewFiles(p string, q ...string) (Files, error) { f := Files(append([]string{p}, q...)) _, err := f.Deltas() return f, err } func (files Files) Deltas(like ...Like) (Deltas, error) { transactions, err := files.transactions() if err != nil { return nil, err } result := make(Deltas, 0, len(transactions)*2) for _, transaction := range transactions { sums := map[string]float64{} for _, recipient := range transaction.recipients { sums[recipient.currency] += recipient.value delta := newDelta( transaction.date, transaction.description, recipient.name, recipient.value, recipient.currency, ) result = append(result, delta) } for currency, value := range sums { if value == 0 { continue } if transaction.payee == "" { //return nil, fmt.Errorf("didnt find net zero and no dumping ground payee set: %+v", transaction) } else { delta := newDelta( transaction.date, transaction.description, transaction.payee, -1.0*value, currency, ) result = append(result, delta) } } } return result.Like(like...), nil }