First attempt at Prop file
This commit is contained in:
parent
b5db94c5b7
commit
1d6a28cd43
64
src/Model2.re
Normal file
64
src/Model2.re
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
type model = {
|
||||||
|
name: string,
|
||||||
|
author: string,
|
||||||
|
assumptions: list(Input.parameter),
|
||||||
|
inputs: list(Input.parameter),
|
||||||
|
outputs: list(Output.parameter),
|
||||||
|
outputConfig: Output.outputConfig,
|
||||||
|
};
|
||||||
|
|
||||||
|
let gatherInputs = (m: model, a: list(InputTypes.withName)) => {
|
||||||
|
let getItem = (p: Input.parameter) => InputTypes.getName(a, p.id);
|
||||||
|
[
|
||||||
|
m.assumptions |> List.map(getItem),
|
||||||
|
m.inputs |> List.map(getItem),
|
||||||
|
[InputTypes.getName(a, "output")],
|
||||||
|
]
|
||||||
|
|> List.flatten;
|
||||||
|
};
|
||||||
|
|
||||||
|
module MS = Belt.Map.String;
|
||||||
|
|
||||||
|
type modelMaps = {
|
||||||
|
assumptions: MS.t((Input.parameter, option(InputTypes.t))),
|
||||||
|
inputs: MS.t((Input.parameter, option(InputTypes.t))),
|
||||||
|
output: (Output.parameter, option(InputTypes.t)),
|
||||||
|
};
|
||||||
|
|
||||||
|
let toMaps = (m: model): modelMaps => {
|
||||||
|
assumptions:
|
||||||
|
MS.fromArray(
|
||||||
|
m.assumptions
|
||||||
|
|> List.map((r: Input.parameter) =>
|
||||||
|
(r.id, (r, Input.toInput(r.parameterType)))
|
||||||
|
)
|
||||||
|
|> Array.of_list,
|
||||||
|
),
|
||||||
|
inputs:
|
||||||
|
MS.fromArray(
|
||||||
|
m.inputs
|
||||||
|
|> List.map((r: Input.parameter) =>
|
||||||
|
(r.id, (r, Input.toInput(r.parameterType)))
|
||||||
|
)
|
||||||
|
|> Array.of_list,
|
||||||
|
),
|
||||||
|
output: (Output.make(~name="Payouts", ~parameterType=FloatCdf, ()), None),
|
||||||
|
};
|
||||||
|
|
||||||
|
type modelParams = {
|
||||||
|
assumptions: list(option(InputTypes.t)),
|
||||||
|
inputs: list(option(InputTypes.t)),
|
||||||
|
output: option(InputTypes.t),
|
||||||
|
};
|
||||||
|
|
||||||
|
let response = (m: model, a: list(InputTypes.withName)) => {
|
||||||
|
let getItem = (p: Input.parameter) =>
|
||||||
|
InputTypes.getName(a, p.id)->Belt.Option.map(InputTypes.withoutName);
|
||||||
|
{
|
||||||
|
assumptions: m.assumptions |> List.map(getItem),
|
||||||
|
inputs: m.inputs |> List.map(getItem),
|
||||||
|
output:
|
||||||
|
InputTypes.getName(a, "output")
|
||||||
|
->Belt.Option.map(InputTypes.withoutName),
|
||||||
|
};
|
||||||
|
};
|
150
src/Prop.re
Normal file
150
src/Prop.re
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
module Value = {
|
||||||
|
type t =
|
||||||
|
| SelectSingle(string)
|
||||||
|
| FloatPoint(float)
|
||||||
|
| FloatCdf(string);
|
||||||
|
|
||||||
|
let to_string = (t: t) => {
|
||||||
|
switch (t) {
|
||||||
|
| SelectSingle(r) => r
|
||||||
|
| FloatCdf(r) => r
|
||||||
|
| FloatPoint(r) => r |> Js.Float.toFixed
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
module Type = {
|
||||||
|
type selectOption = {
|
||||||
|
id: string,
|
||||||
|
name: string,
|
||||||
|
};
|
||||||
|
|
||||||
|
type selectSingle = {
|
||||||
|
options: list(selectOption),
|
||||||
|
default: option(string),
|
||||||
|
};
|
||||||
|
|
||||||
|
type floatPoint = {validatations: list(float => bool)};
|
||||||
|
|
||||||
|
type withDefaultMinMax('a) = {
|
||||||
|
default: option('a),
|
||||||
|
min: option('a),
|
||||||
|
max: option('a),
|
||||||
|
};
|
||||||
|
|
||||||
|
type t =
|
||||||
|
| SelectSingle(selectSingle)
|
||||||
|
| FloatPoint(withDefaultMinMax(float))
|
||||||
|
| Year(withDefaultMinMax(float))
|
||||||
|
| FloatCdf;
|
||||||
|
|
||||||
|
let default = (t: t) =>
|
||||||
|
switch (t) {
|
||||||
|
| Year(r) => r.default->Belt.Option.map(p => Value.FloatPoint(p))
|
||||||
|
| SelectSingle(r) =>
|
||||||
|
r.default->Belt.Option.map(p => Value.SelectSingle(p))
|
||||||
|
| FloatPoint(r) => r.default->Belt.Option.map(p => Value.FloatPoint(p))
|
||||||
|
| FloatCdf => None
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
module TypeWithMetadata = {
|
||||||
|
// TODO: Figure out a better name for assumptionType
|
||||||
|
type assumptionType =
|
||||||
|
| INPUT
|
||||||
|
| ASSUMPTION;
|
||||||
|
|
||||||
|
type t = {
|
||||||
|
id: string,
|
||||||
|
name: string,
|
||||||
|
description: option(string),
|
||||||
|
type_: Type.t,
|
||||||
|
assumptionType,
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO: Change default here
|
||||||
|
let currentYear = {
|
||||||
|
id: "currentyear",
|
||||||
|
name: "Current Year",
|
||||||
|
description: None,
|
||||||
|
type_: FloatPoint({default: None, min: None, max: None}),
|
||||||
|
assumptionType: ASSUMPTION,
|
||||||
|
};
|
||||||
|
|
||||||
|
let make =
|
||||||
|
(~name, ~type_, ~id=name, ~description=None, ~assumptionType=INPUT, ()) => {
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
type_,
|
||||||
|
description,
|
||||||
|
assumptionType,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
module ValueMap = {
|
||||||
|
module MS = Belt.Map.String;
|
||||||
|
module Combination = {
|
||||||
|
type t = {
|
||||||
|
typeWithMetadata: TypeWithMetadata.t,
|
||||||
|
value: option(Value.t),
|
||||||
|
};
|
||||||
|
let make = (typeWithMetadata, value) => {typeWithMetadata, value};
|
||||||
|
let makeWithDefaults = typeWithMetadata => {
|
||||||
|
typeWithMetadata,
|
||||||
|
value: Type.default(typeWithMetadata.type_),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
type t = MS.t(Combination.t);
|
||||||
|
let get = MS.get;
|
||||||
|
let keys = MS.keysToArray;
|
||||||
|
let map = MS.map;
|
||||||
|
let fromArray = MS.fromArray;
|
||||||
|
let values = t =>
|
||||||
|
t |> MS.valuesToArray |> Array.map((r: Combination.t) => r.value);
|
||||||
|
let types = t =>
|
||||||
|
t
|
||||||
|
|> MS.valuesToArray
|
||||||
|
|> Array.map((r: Combination.t) => r.typeWithMetadata);
|
||||||
|
|
||||||
|
let fromTypesWithMetadata = (c: array(TypeWithMetadata.t)) =>
|
||||||
|
c->Belt.Array.map((b: TypeWithMetadata.t) =>
|
||||||
|
(b.name, Combination.makeWithDefaults(b))
|
||||||
|
)
|
||||||
|
|> fromArray;
|
||||||
|
|
||||||
|
let getValue = (t: t, key: MS.key) =>
|
||||||
|
t->MS.get(key)->Belt.Option.flatMap(r => r.value);
|
||||||
|
|
||||||
|
let getType = (t: t, key: MS.key) =>
|
||||||
|
t->MS.get(key)->Belt.Option.map(r => r.typeWithMetadata);
|
||||||
|
};
|
||||||
|
|
||||||
|
module Model = {
|
||||||
|
type t = {
|
||||||
|
name: string,
|
||||||
|
author: string,
|
||||||
|
inputTypes: list(TypeWithMetadata.t),
|
||||||
|
ouputTypes: list(TypeWithMetadata.t),
|
||||||
|
};
|
||||||
|
type inputValues = {
|
||||||
|
inputs: ValueMap.t,
|
||||||
|
outputSelection: string,
|
||||||
|
};
|
||||||
|
type outputValues = ValueMap.t;
|
||||||
|
|
||||||
|
let toInputDefaults = (t: t): inputValues => {
|
||||||
|
inputs: t.inputTypes |> Array.of_list |> ValueMap.fromTypesWithMetadata,
|
||||||
|
outputSelection: "",
|
||||||
|
};
|
||||||
|
|
||||||
|
let run = (inputs: inputValues, f) => f(inputs);
|
||||||
|
};
|
||||||
|
|
||||||
|
module InputValues = {
|
||||||
|
type t = Model.inputValues;
|
||||||
|
let update = (t, str, newValue) => t |>
|
||||||
|
};
|
||||||
|
|
||||||
|
module OutputValues = {
|
||||||
|
type t = ValueMap.t;
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user