Deltas does Balances and Like
parent
480d358f5a
commit
b93de87db4
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -12,27 +12,12 @@ func NewFiles(p string, q ...string) (Files, error) {
|
||||||
return f, err
|
return f, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func Balances(deltas []Delta) (map[string]map[Currency]float64, error) {
|
func (files Files) Deltas(like ...Like) (Deltas, 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) {
|
|
||||||
transactions, err := files.transactions()
|
transactions, err := files.transactions()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
result := make([]Delta, 0, len(transactions)*2)
|
result := make(Deltas, 0, len(transactions)*2)
|
||||||
for _, transaction := range transactions {
|
for _, transaction := range transactions {
|
||||||
sums := map[string]float64{}
|
sums := map[string]float64{}
|
||||||
for _, acc := range transaction.recipients {
|
for _, acc := range transaction.recipients {
|
||||||
|
|
@ -44,9 +29,7 @@ func (files Files) Deltas(like ...Like) ([]Delta, error) {
|
||||||
acc.value,
|
acc.value,
|
||||||
acc.currency,
|
acc.currency,
|
||||||
)
|
)
|
||||||
if likes(like).all(delta) {
|
result = append(result, delta)
|
||||||
result = append(result, delta)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
for currency, value := range sums {
|
for currency, value := range sums {
|
||||||
if value == 0 {
|
if value == 0 {
|
||||||
|
|
@ -62,10 +45,8 @@ func (files Files) Deltas(like ...Like) ([]Delta, error) {
|
||||||
-1.0*value,
|
-1.0*value,
|
||||||
currency,
|
currency,
|
||||||
)
|
)
|
||||||
if likes(like).all(delta) {
|
result = append(result, delta)
|
||||||
result = append(result, delta)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result, nil
|
return result.Like(like...), nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ func TestFileTestdata(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
balances, err := Balances(deltas)
|
balances, err := deltas.Balances()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
@ -51,7 +51,7 @@ func TestFileTestdata(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
balances, err := Balances(deltas)
|
balances, err := deltas.Balances()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue