Starting to add conditionals
This commit is contained in:
parent
fc3108c289
commit
b44073140f
|
@ -1,14 +1,25 @@
|
|||
module Value = {
|
||||
type binaryConditional =
|
||||
| Selected(bool)
|
||||
| Unselected;
|
||||
type t =
|
||||
| BinaryConditional(binaryConditional)
|
||||
| SelectSingle(string)
|
||||
| DateTime(MomentRe.Moment.t)
|
||||
| FloatPoint(float)
|
||||
| Probability(float)
|
||||
| FloatCdf(string);
|
||||
|
||||
let to_string = (t: t) => {
|
||||
switch (t) {
|
||||
| BinaryConditional(binaryConditional) =>
|
||||
switch (binaryConditional) {
|
||||
| Selected(r) => r ? "True" : "False"
|
||||
| Unselected => ""
|
||||
}
|
||||
| SelectSingle(r) => r
|
||||
| FloatCdf(r) => r
|
||||
| Probability(r) => (r *. 100. |> Js.Float.toFixed) ++ "%"
|
||||
| DateTime(r) => r |> MomentRe.Moment.defaultFormat
|
||||
| FloatPoint(r) => r |> Js.Float.toFixed
|
||||
};
|
||||
|
@ -34,17 +45,23 @@ module Type = {
|
|||
max: option('a),
|
||||
};
|
||||
|
||||
type withDefault('a) = {default: option('a)};
|
||||
|
||||
type t =
|
||||
| BinaryConditional
|
||||
| SelectSingle(selectSingle)
|
||||
| FloatPoint(withDefaultMinMax(float))
|
||||
| Probability(withDefault(float))
|
||||
| DateTime(withDefaultMinMax(MomentRe.Moment.t))
|
||||
| Year(withDefaultMinMax(float))
|
||||
| FloatCdf;
|
||||
|
||||
let default = (t: t) =>
|
||||
switch (t) {
|
||||
| BinaryConditional => Some(Value.BinaryConditional(Unselected))
|
||||
| Year(r) => r.default->Belt.Option.map(p => Value.FloatPoint(p))
|
||||
| FloatPoint(r) => r.default->Belt.Option.map(p => Value.FloatPoint(p))
|
||||
| Probability(r) => r.default->Belt.Option.map(p => Value.Probability(p))
|
||||
| DateTime(r) => r.default->Belt.Option.map(p => Value.DateTime(p))
|
||||
| SelectSingle(r) =>
|
||||
r.default->Belt.Option.map(p => Value.SelectSingle(p))
|
||||
|
|
|
@ -33,6 +33,36 @@ let make =
|
|||
}
|
||||
)}
|
||||
/>
|
||||
| (BinaryConditional, Some(BinaryConditional(r))) =>
|
||||
switch (r) {
|
||||
| Unselected =>
|
||||
<div
|
||||
onClick={_ => onChange(Some(BinaryConditional(Selected(true))))}>
|
||||
{"Select" |> ReasonReact.string}
|
||||
</div>
|
||||
| Selected(true) =>
|
||||
<div>
|
||||
{"YES!" |> ReasonReact.string}
|
||||
<div
|
||||
onClick={_ => onChange(Some(BinaryConditional(Selected(false))))}>
|
||||
{"No" |> ReasonReact.string}
|
||||
</div>
|
||||
<div onClick={_ => onChange(Some(BinaryConditional(Unselected)))}>
|
||||
{"Deselect" |> ReasonReact.string}
|
||||
</div>
|
||||
</div>
|
||||
| Selected(false) =>
|
||||
<div>
|
||||
{"NO!" |> ReasonReact.string}
|
||||
<div
|
||||
onClick={_ => onChange(Some(BinaryConditional(Selected(true))))}>
|
||||
{"Yes" |> ReasonReact.string}
|
||||
</div>
|
||||
<div onClick={_ => onChange(Some(BinaryConditional(Unselected)))}>
|
||||
{"Deselect" |> ReasonReact.string}
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
| (Year(_), _)
|
||||
| (FloatPoint(_), _) => <input type_="number" value="" />
|
||||
| (SelectSingle(t), Some(SelectSingle(r))) =>
|
||||
|
|
|
@ -11,8 +11,12 @@ module Data = {
|
|||
|
||||
type output =
|
||||
| DONATIONS
|
||||
| CHANCE_OF_EXISTENCE
|
||||
| PAYOUTS;
|
||||
|
||||
type conditionals =
|
||||
| WORLD_CATASTROPHE;
|
||||
|
||||
type fundWithInfo = {
|
||||
group,
|
||||
name: string,
|
||||
|
@ -93,6 +97,7 @@ module Model = {
|
|||
| (Fund(META), DONATIONS) => 9300000.0
|
||||
| (Fund(META), PAYOUTS) => 830000.0
|
||||
| (All, _) => sum()
|
||||
| (_, CHANCE_OF_EXISTENCE) => 0.0
|
||||
};
|
||||
};
|
||||
let make =
|
||||
|
@ -102,14 +107,21 @@ module Model = {
|
|||
currentDateTime: MomentRe.Moment.t,
|
||||
output: output,
|
||||
) => {
|
||||
Prop.Value.FloatCdf(
|
||||
calculateDifference(
|
||||
currentValue(group, output),
|
||||
dateTime,
|
||||
currentDateTime,
|
||||
yearlyMeanGrowthRateIfNotClosed(group),
|
||||
),
|
||||
);
|
||||
switch (output) {
|
||||
| DONATIONS
|
||||
| PAYOUTS =>
|
||||
Prop.Value.FloatCdf(
|
||||
calculateDifference(
|
||||
currentValue(group, output),
|
||||
dateTime,
|
||||
currentDateTime,
|
||||
yearlyMeanGrowthRateIfNotClosed(group),
|
||||
),
|
||||
)
|
||||
| CHANCE_OF_EXISTENCE =>
|
||||
let yearDiff = MomentRe.diff(dateTime, currentDateTime, `days) /. 365.;
|
||||
Prop.Value.Probability((100. -. yearDiff) /. 100.);
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -126,6 +138,7 @@ module Interface = {
|
|||
let outputFromString = (s: string) =>
|
||||
switch (s) {
|
||||
| "donations" => DONATIONS
|
||||
| "exists" => CHANCE_OF_EXISTENCE
|
||||
| _ => PAYOUTS
|
||||
};
|
||||
|
||||
|
@ -136,6 +149,7 @@ module Interface = {
|
|||
Some(DateTime(intendedYear)),
|
||||
Some(DateTime(currentYear)),
|
||||
Some(SelectSingle(output)),
|
||||
Some(BinaryConditional(r)),
|
||||
|] =>
|
||||
choiceFromString(fund)
|
||||
|> E.O.fmap(fund =>
|
||||
|
@ -206,12 +220,19 @@ module Interface = {
|
|||
SelectSingle({
|
||||
default: Some("Output"),
|
||||
options: [
|
||||
{name: "Donations", id: "donations"},
|
||||
{name: "Funding", id: "funding"},
|
||||
{name: "Donations | Exists", id: "donations"},
|
||||
{name: "Funding | Exists", id: "funding"},
|
||||
{name: "Exists", id: "exists"},
|
||||
],
|
||||
}),
|
||||
(),
|
||||
),
|
||||
TypeWithMetadata.make(
|
||||
~name="Conditional on World Ending",
|
||||
~id="worldEnd",
|
||||
~type_=BinaryConditional,
|
||||
(),
|
||||
),
|
||||
|],
|
||||
outputTypes: [||],
|
||||
run,
|
||||
|
|
Loading…
Reference in New Issue
Block a user