Simplify projection table generation.
All checks were successful
Build & Test / Main (push) Successful in 1m28s
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:
parent
8b8307cc57
commit
1c6d5e9917
25
moon/moon.go
25
moon/moon.go
@ -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},
|
||||||
|
51
tui/tui.go
51
tui/tui.go
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user