ok that is pretty nice

main
Bel LaPointe 2023-10-25 09:58:55 -06:00
parent f436a6d046
commit 12e5c37ba3
1 changed files with 66 additions and 25 deletions

View File

@ -7,7 +7,6 @@ import (
"log" "log"
"net/http" "net/http"
"os" "os"
"path"
"slices" "slices"
"sort" "sort"
"strings" "strings"
@ -50,43 +49,85 @@ func main() {
like = append(like, ledger.LikeAfter(*likeAfter)) like = append(like, ledger.LikeAfter(*likeAfter))
foo := func(w http.ResponseWriter, r *http.Request) { foo := func(w http.ResponseWriter, r *http.Request) {
switch path.Dir(r.URL.Path) { foolike := make(ledger.Likes, 0)
case "/bal": for _, v := range r.URL.Query()["likeName"] {
register := deltas.Like(like...).Register() foolike = append(foolike, ledger.LikeName(v))
nameCurrencyDateValue := map[string]map[ledger.Currency]map[string]float64{} }
dates := []string{} for _, v := range r.URL.Query()["likeAfter"] {
for date, balances := range register { foolike = append(foolike, ledger.LikeAfter(v))
dates = append(dates, date) }
for name, balance := range balances { for _, v := range r.URL.Query()["likeBefore"] {
for currency, value := range balance { foolike = append(foolike, ledger.LikeBefore(v))
if _, ok := nameCurrencyDateValue[name]; !ok { }
nameCurrencyDateValue[name] = make(map[ledger.Currency]map[string]float64) if len(foolike) == 0 {
} foolike = like
if _, ok := nameCurrencyDateValue[name][currency]; !ok { }
nameCurrencyDateValue[name][currency] = make(map[string]float64)
} register := deltas.Like(foolike...).Register()
nameCurrencyDateValue[name][currency][date] += value nameCurrencyDateValue := map[string]map[ledger.Currency]map[string]float64{}
dates := []string{}
for date, balances := range register {
dates = append(dates, date)
for name, balance := range balances {
for currency, value := range balance {
if _, ok := nameCurrencyDateValue[name]; !ok {
nameCurrencyDateValue[name] = make(map[ledger.Currency]map[string]float64)
} }
if _, ok := nameCurrencyDateValue[name][currency]; !ok {
nameCurrencyDateValue[name][currency] = make(map[string]float64)
}
nameCurrencyDateValue[name][currency][date] += value
} }
} }
slices.Sort(dates) }
slices.Sort(dates)
line := charts.NewLine() line := charts.NewLine()
line.AddXAxis(dates) line.AddXAxis(dates)
switch r.URL.Path {
default:
http.NotFound(w, r)
return
case "/bal":
for name, currencyDateValue := range nameCurrencyDateValue { for name, currencyDateValue := range nameCurrencyDateValue {
for currency, dateValue := range currencyDateValue { for currency, dateValue := range currencyDateValue {
series := make([]int, len(dates)) series := make([]int, len(dates))
for i, date := range dates { for i := range dates {
series[i] = int(dateValue[date]) var lastValue float64
for j := range dates[:i+1] {
if newLastValue, ok := dateValue[dates[j]]; ok {
lastValue = newLastValue
}
}
series[i] = int(lastValue)
} }
key := fmt.Sprintf("%s (%s)", name, currency) key := fmt.Sprintf("%s (%s)", name, currency)
line.AddYAxis(key, series) line.AddYAxis(key, series)
} }
} }
if err := line.Render(w); err != nil {
panic(err)
}
case "/reg": case "/reg":
for name, currencyDateValue := range nameCurrencyDateValue {
for currency, dateValue := range currencyDateValue {
series := make([]int, len(dates))
for i := range dates {
var prevValue float64
var lastValue float64
for j := range dates[:i+1] {
if newLastValue, ok := dateValue[dates[j]]; ok {
prevValue = lastValue
lastValue = newLastValue
}
}
series[i] = int(lastValue - prevValue)
}
key := fmt.Sprintf("%s (%s)", name, currency)
line.AddYAxis(key, series)
}
}
}
if err := line.Render(w); err != nil {
panic(err)
} }
} }