2022-03-29 06:13:52 +00:00
|
|
|
// Port of Sindre Sorhus' Sparkly to Rescript
|
|
|
|
// reference implementation: https://github.com/sindresorhus/sparkly
|
|
|
|
// Omitting rgb "fire" style, so no `chalk` dependency
|
2022-03-29 19:27:23 +00:00
|
|
|
// Omitting: NaN handling, special consideration for constant data.
|
2022-03-29 06:13:52 +00:00
|
|
|
|
2022-03-29 20:31:08 +00:00
|
|
|
let ticks = [`▁`, `▂`, `▃`, `▄`, `▅`, `▆`, `▇`, `█`]
|
2022-03-29 14:55:36 +00:00
|
|
|
|
2022-03-29 20:31:08 +00:00
|
|
|
let _ticksLength = E.A.length(ticks)
|
2022-03-29 15:05:27 +00:00
|
|
|
|
2022-03-29 20:31:08 +00:00
|
|
|
let _heightToTickIndex = (maximum: float, v: float) => {
|
|
|
|
let v = Js.Math.ceil_int(v /. maximum *. Belt.Int.toFloat(_ticksLength)) - 1
|
|
|
|
min(v, 0)
|
|
|
|
}
|
2022-03-29 19:27:23 +00:00
|
|
|
|
2022-03-29 20:31:08 +00:00
|
|
|
let create = (relativeHeights: array<float>, ~maximum=?, ()) => {
|
|
|
|
if E.A.length(relativeHeights) === 0 {
|
|
|
|
""
|
|
|
|
} else {
|
|
|
|
let maximum = maximum |> E.O.default(E.A.max(relativeHeights) |> E.O.toExn(""))
|
|
|
|
|
|
|
|
relativeHeights
|
|
|
|
|> E.A.fmap(_heightToTickIndex(maximum))
|
|
|
|
|> E.A.fmap(r => E.A.get(ticks, r) |> E.O.toExn(""))
|
|
|
|
|> E.A.joinWith("")
|
|
|
|
}
|
2022-03-29 06:13:52 +00:00
|
|
|
}
|