Simplify projection table generation.
All checks were successful
Build & Test / Main (push) Successful in 1m28s

Instead of pre-allocating the grid and using tricky indexing to fill in
the cells, just fully regenerate it. But do it columnwise first, and
then transpose it.
This commit is contained in:
Sam Fredrickson 2024-03-20 23:40:38 -07:00
parent 8b8307cc57
commit 1c6d5e9917
2 changed files with 44 additions and 32 deletions

View File

@ -2,6 +2,7 @@ package moon
import ( import (
"context" "context"
"fmt"
"math" "math"
"time" "time"
@ -14,6 +15,7 @@ type Math struct {
CurrentPrice coindesk.Price CurrentPrice coindesk.Price
Columns []Column Columns []Column
Goals []Goal Goals []Goal
Labels []string
} }
func NewMath(asset coindesk.Asset, goals []Goal, bases []Base) (m Math) { func NewMath(asset coindesk.Asset, goals []Goal, bases []Base) (m Math) {
@ -22,10 +24,14 @@ func NewMath(asset coindesk.Asset, goals []Goal, bases []Base) (m Math) {
} }
m.Asset = asset m.Asset = asset
m.Goals = goals m.Goals = goals
m.Labels = []string{"Starting", "CDPR"}
m.Columns = make([]Column, len(bases)) m.Columns = make([]Column, len(bases))
for i := range bases { for i := range bases {
m.Columns[i].Base = bases[i] m.Columns[i].Base = bases[i]
} }
for i := range goals {
m.Labels = append(m.Labels, goals[i].Name)
}
return return
} }
@ -106,6 +112,25 @@ type Column struct {
Projections Projection Projections Projection
} }
func (c *Column) Column() (entries []string) {
entries = append(entries, fmt.Sprintf("$%.2f", c.StartingPrice))
entries = append(entries, fmt.Sprintf("%.2f%%", (c.CDPR-1)*100))
never := c.CDPR <= 1
for i := range c.Projections.Dates {
var cell string
if never {
cell = "NEVER!!!!!"
} else {
cell = c.
Projections.
Dates[i].
Format("2006-01-02")
}
entries = append(entries, cell)
}
return
}
var DefaultGoals = []Goal{ var DefaultGoals = []Goal{
{"$100k", 100000}, {"$100k", 100000},
{"$150k", 150000}, {"$150k", 150000},

View File

@ -49,19 +49,9 @@ func New(cfg config.Data) Model {
Width: 10, Width: 10,
}) })
} }
projectionRows := make([]table.Row, len(math.Goals)+2)
for i := range projectionRows {
projectionRows[i] = make(table.Row, len(projectionCols))
}
projectionRows[0][0] = "Starting"
projectionRows[1][0] = "CDPR"
for i := range math.Goals {
projectionRows[i+2][0] = math.Goals[i].Name
}
projections := table.New( projections := table.New(
table.WithColumns(projectionCols), table.WithColumns(projectionCols),
table.WithRows(projectionRows), table.WithHeight(len(math.Labels)),
table.WithHeight(len(math.Goals)+2),
table.WithStyles(tableStyle), table.WithStyles(tableStyle),
) )
@ -106,30 +96,27 @@ func refillPrice(m *Model) {
} }
func refillProjections(m *Model) { func refillProjections(m *Model) {
rows := m.projections.Rows() rows := []table.Row{m.math.Labels}
for i := range m.math.Columns {
rows = append(rows, m.math.Columns[i].Column())
}
rows = transpose(rows)
m.projections.SetRows(rows)
}
for col := range m.math.Columns { func transpose(slice []table.Row) []table.Row {
_ = col xl := len(slice[0])
never := false yl := len(slice)
if m.math.Columns[col].CDPR <= 1 { result := make([]table.Row, xl)
never = true for i := range result {
} result[i] = make(table.Row, yl)
}
rows[0][col+1] = fmt.Sprintf("$%.2f", m.math.Columns[col].StartingPrice) for i := 0; i < xl; i++ {
rows[1][col+1] = fmt.Sprintf("%.2f%%", (m.math.Columns[col].CDPR-1)*100) for j := 0; j < yl; j++ {
for row := 0; row < len(m.math.Goals); row++ { result[i][j] = slice[j][i]
var cell string
if never {
cell = "NEVER!!!!!"
} else {
cell = m.math.Columns[col].
Projections.Dates[row].
Format("2006-01-02")
}
rows[row+2][col+1] = cell
} }
} }
m.projections.SetRows(rows) return result
} }
func (m Model) View() string { func (m Model) View() string {