From 1c6d5e9917e49a52bba331d7dee8275d8b0e1b1c Mon Sep 17 00:00:00 2001 From: Sam Fredrickson Date: Wed, 20 Mar 2024 23:40:38 -0700 Subject: [PATCH] Simplify projection table generation. 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. --- moon/moon.go | 25 +++++++++++++++++++++++++ tui/tui.go | 51 +++++++++++++++++++-------------------------------- 2 files changed, 44 insertions(+), 32 deletions(-) diff --git a/moon/moon.go b/moon/moon.go index 24b8595..6572a9d 100644 --- a/moon/moon.go +++ b/moon/moon.go @@ -2,6 +2,7 @@ package moon import ( "context" + "fmt" "math" "time" @@ -14,6 +15,7 @@ type Math struct { CurrentPrice coindesk.Price Columns []Column Goals []Goal + Labels []string } 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.Goals = goals + m.Labels = []string{"Starting", "CDPR"} m.Columns = make([]Column, len(bases)) for i := range bases { m.Columns[i].Base = bases[i] } + for i := range goals { + m.Labels = append(m.Labels, goals[i].Name) + } return } @@ -106,6 +112,25 @@ type Column struct { 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{ {"$100k", 100000}, {"$150k", 150000}, diff --git a/tui/tui.go b/tui/tui.go index 49bdac5..50b78e7 100644 --- a/tui/tui.go +++ b/tui/tui.go @@ -49,19 +49,9 @@ func New(cfg config.Data) Model { 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( table.WithColumns(projectionCols), - table.WithRows(projectionRows), - table.WithHeight(len(math.Goals)+2), + table.WithHeight(len(math.Labels)), table.WithStyles(tableStyle), ) @@ -106,30 +96,27 @@ func refillPrice(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 { - _ = col - never := false - if m.math.Columns[col].CDPR <= 1 { - never = true - } - - rows[0][col+1] = fmt.Sprintf("$%.2f", m.math.Columns[col].StartingPrice) - rows[1][col+1] = fmt.Sprintf("%.2f%%", (m.math.Columns[col].CDPR-1)*100) - for row := 0; row < len(m.math.Goals); row++ { - 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 +func transpose(slice []table.Row) []table.Row { + xl := len(slice[0]) + yl := len(slice) + result := make([]table.Row, xl) + for i := range result { + result[i] = make(table.Row, yl) + } + for i := 0; i < xl; i++ { + for j := 0; j < yl; j++ { + result[i][j] = slice[j][i] } } - m.projections.SetRows(rows) + return result } func (m Model) View() string {