package ana import ( "maps" "math" "regexp" "time" "gogs.inhome.blapointe.com/ana-ledger/ledger" ) func RegisterWithCompoundingInterestPrediction(reg ledger.Register, window time.Duration, pattern string, apy float64) (ledger.Register, error) { lastBalances := make(ledger.Balances) p := regexp.MustCompile(pattern) for _, d := range reg.Dates() { if t, _ := dateToTime(d); time.Now().Before(t) { continue } for name := range reg[d] { if p.MatchString(name) { lastBalances[name] = reg[d][name] } } } predictedTimes := predictionTimes(window) result := maps.Clone(reg) for _, predictionTime := range predictedTimes { k := predictionTime.Format("2006-01") if _, ok := result[k]; !ok { result[k] = make(ledger.Balances) } for k2, v2 := range lastBalances { if _, ok := result[k][k2]; !ok { result[k][k2] = maps.Clone(v2) } } } addedSoFar := make(ledger.Balances) for _, predictionTime := range predictedTimes { k := predictionTime.Format("2006-01") for name := range lastBalances { if _, ok := addedSoFar[name]; !ok { addedSoFar[name] = make(ledger.Balance) } for currency := range result[k][name] { // A = P(1 + r/n)**nt p := result[k][name][currency] + addedSoFar[name][currency] r := apy n := 12.0 t := 1.0 / 12.0 result[k][name][currency] = p * math.Pow(1.0+(r/n), n*t) addedSoFar[name][currency] += (result[k][name][currency] - p) } } } return result, nil }