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:10:20 +00:00
|
|
|
let create = (
|
2022-03-29 14:04:08 +00:00
|
|
|
numbers: array<float>,
|
2022-03-29 19:10:20 +00:00
|
|
|
~minimum=?,
|
|
|
|
~maximum=?,
|
|
|
|
()
|
2022-03-29 06:13:52 +00:00
|
|
|
) => {
|
|
|
|
// Unlike reference impl, we assume that all numbers are finite, i.e. no NaN.
|
2022-03-29 15:05:27 +00:00
|
|
|
|
2022-03-29 14:40:38 +00:00
|
|
|
let ticks = [`▁`, `▂`, `▃`, `▄`, `▅`, `▆`, `▇`, `█`]
|
2022-03-29 14:55:36 +00:00
|
|
|
|
2022-03-29 19:10:20 +00:00
|
|
|
let minimum = E.O.default(Js.Math.minMany_float(numbers), minimum)
|
|
|
|
let maximum = E.O.default(Js.Math.maxMany_float(numbers), maximum)
|
2022-03-29 15:05:27 +00:00
|
|
|
|
2022-03-29 19:10:20 +00:00
|
|
|
// // Use a high tick if data is constant and max is not equal to min or zero
|
|
|
|
// let ticks = if minimum == maximum && maximum != 0.0 {
|
|
|
|
// [ticks[4]]
|
|
|
|
// } else {
|
|
|
|
// ticks
|
|
|
|
// }
|
2022-03-29 06:13:52 +00:00
|
|
|
|
2022-03-29 19:10:20 +00:00
|
|
|
let toHeight = (number: float) => {
|
|
|
|
let tickIndex = Js.Math.ceil_int((number /. maximum) *. (ticks -> Belt.Array.length -> Belt.Int.toFloat)) - 1
|
2022-03-29 06:13:52 +00:00
|
|
|
|
2022-03-29 15:05:27 +00:00
|
|
|
let tickIndex = if maximum == 0.0 || tickIndex < 0 {
|
2022-03-29 06:13:52 +00:00
|
|
|
0
|
|
|
|
} else {
|
|
|
|
tickIndex
|
|
|
|
}
|
2022-03-29 15:05:27 +00:00
|
|
|
|
|
|
|
ticks[tickIndex]
|
2022-03-29 06:13:52 +00:00
|
|
|
}
|
2022-03-29 19:10:20 +00:00
|
|
|
toHeight -> E.A.fmap(numbers) -> (arr => E.A.joinWith("", arr))
|
2022-03-29 06:13:52 +00:00
|
|
|
}
|