112 lines
2.7 KiB
ReasonML
112 lines
2.7 KiB
ReasonML
type chartConfig = {
|
|
xLog: bool,
|
|
yLog: bool,
|
|
isCumulative: bool,
|
|
height: int,
|
|
};
|
|
|
|
type state = {
|
|
showStats: bool,
|
|
showPercentiles: bool,
|
|
showParams: bool,
|
|
distributions: list(chartConfig),
|
|
};
|
|
|
|
type action =
|
|
| CHANGE_SHOW_STATS
|
|
| CHANGE_SHOW_PARAMS
|
|
| CHANGE_SHOW_PERCENTILES
|
|
| REMOVE_DIST(int)
|
|
| ADD_DIST
|
|
| CHANGE_X_LOG(int)
|
|
| CHANGE_Y_LOG(int)
|
|
| CHANGE_IS_CUMULATIVE(int, bool)
|
|
| HEIGHT_INCREMENT(int)
|
|
| HEIGHT_DECREMENT(int);
|
|
|
|
let changeHeight = (currentHeight, foo: [ | `increment | `decrement]) =>
|
|
switch (currentHeight, foo) {
|
|
| (1, `decrement) => 1
|
|
| (2, `decrement) => 1
|
|
| (3, `decrement) => 2
|
|
| (4, `decrement) => 3
|
|
| (5, `decrement) => 4
|
|
| (1, `increment) => 2
|
|
| (2, `increment) => 3
|
|
| (3, `increment) => 4
|
|
| (4, `increment) => 5
|
|
| (5, `increment) => 5
|
|
| _ => 1
|
|
};
|
|
|
|
let heightToPix =
|
|
fun
|
|
| 1 => 80
|
|
| 2 => 140
|
|
| 3 => 240
|
|
| 4 => 340
|
|
| 5 => 440
|
|
| _ => 140;
|
|
|
|
let distributionReducer = (index, state: list(chartConfig), action) => {
|
|
switch (action, E.L.get(state, index)) {
|
|
| (HEIGHT_INCREMENT(_), Some(dist)) =>
|
|
E.L.update(
|
|
{...dist, height: changeHeight(dist.height, `increment)},
|
|
index,
|
|
state,
|
|
)
|
|
| (HEIGHT_DECREMENT(_), Some(dist)) =>
|
|
E.L.update(
|
|
{...dist, height: changeHeight(dist.height, `decrement)},
|
|
index,
|
|
state,
|
|
)
|
|
| (CHANGE_IS_CUMULATIVE(_, isCumulative), Some(dist)) =>
|
|
E.L.update({...dist, isCumulative}, index, state)
|
|
| (CHANGE_X_LOG(_), Some(dist)) =>
|
|
E.L.update({...dist, xLog: !dist.xLog}, index, state)
|
|
| (CHANGE_Y_LOG(_), Some(dist)) =>
|
|
E.L.update({...dist, yLog: !dist.yLog}, index, state)
|
|
| (REMOVE_DIST(_), Some(_)) => E.L.remove(index, 1, state)
|
|
| (ADD_DIST, Some(_)) =>
|
|
E.L.append(
|
|
state,
|
|
[{yLog: false, xLog: false, isCumulative: false, height: 4}],
|
|
)
|
|
| _ => state
|
|
};
|
|
};
|
|
|
|
let reducer = (state: state, action: action) =>
|
|
switch (action) {
|
|
| CHANGE_X_LOG(i)
|
|
| CHANGE_Y_LOG(i)
|
|
| CHANGE_IS_CUMULATIVE(i, _)
|
|
| HEIGHT_DECREMENT(i)
|
|
| REMOVE_DIST(i)
|
|
| HEIGHT_INCREMENT(i) => {
|
|
...state,
|
|
distributions: distributionReducer(i, state.distributions, action),
|
|
}
|
|
| ADD_DIST => {
|
|
...state,
|
|
distributions: distributionReducer(0, state.distributions, action),
|
|
}
|
|
| CHANGE_SHOW_STATS => {...state, showStats: !state.showStats}
|
|
| CHANGE_SHOW_PARAMS => {...state, showParams: !state.showParams}
|
|
| CHANGE_SHOW_PERCENTILES => {
|
|
...state,
|
|
showPercentiles: !state.showPercentiles,
|
|
}
|
|
};
|
|
|
|
let init = {
|
|
showStats: false,
|
|
showParams: false,
|
|
showPercentiles: true,
|
|
distributions: [
|
|
{yLog: false, xLog: false, isCumulative: false, height: 4},
|
|
{yLog: false, xLog: false, isCumulative: true, height: 1},
|
|
],
|
|
}; |