diff --git a/ana/predictor.go b/ana/predictor.go index 5f66e71..5e6efb1 100644 --- a/ana/predictor.go +++ b/ana/predictor.go @@ -36,3 +36,13 @@ func NewInterestPredictor(namePattern string, currencyPattern string, apy float6 return result } } + +func NewContributionPredictor(reg ledger.Register) Predictor { + monthlyRate := getMonthlyContributionRate(reg) + return func(given ledger.Balances, delta time.Duration) ledger.Balances { + panic(nil) + } +} + +func getMonthlyContributionRate(reg ledger.Register) map[string]ledger.Balance { +} diff --git a/ledger/register.go b/ledger/register.go index f207104..9dc66c0 100644 --- a/ledger/register.go +++ b/ledger/register.go @@ -2,6 +2,7 @@ package ledger import ( "fmt" + "maps" "slices" "time" ) @@ -50,6 +51,18 @@ func (register Register) Dates() []string { return result } +func (register Register) Between(start, end time.Time) Register { + result := make(Register) + for k := range register { + t := mustDateToTime(k) + if t.Before(start) || t.After(end) { + continue + } + result[k] = maps.Clone(register[k]) + } + return result +} + func (register Register) Times() []time.Time { dates := register.Dates() result := make([]time.Time, len(dates)) diff --git a/ledger/register_test.go b/ledger/register_test.go new file mode 100644 index 0000000..455a2c6 --- /dev/null +++ b/ledger/register_test.go @@ -0,0 +1,31 @@ +package ledger + +import ( + "testing" + "time" +) + +func TestRegisterBetween(t *testing.T) { + reg := make(Register) + reg["2001-01"] = make(Balances) + reg["2002-01"] = make(Balances) + reg["2003-01"] = make(Balances) + reg["2004-01"] = make(Balances) + reg["2005-01"] = make(Balances) + + start, _ := time.ParseInLocation("2006-01", "2002-01", time.Local) + end, _ := time.ParseInLocation("2006-01", "2004-01", time.Local) + got := reg.Between(start, end) + if len(got) != 3 { + t.Error(len(got)) + } + if _, ok := got["2002-01"]; !ok { + t.Error("2002-01") + } + if _, ok := got["2003-01"]; !ok { + t.Error("2003-01") + } + if _, ok := got["2004-01"]; !ok { + t.Error("2004-01") + } +}