Starting to add conditionals

This commit is contained in:
Ozzie Gooen 2020-02-10 23:10:03 +00:00
parent fc3108c289
commit b44073140f
3 changed files with 78 additions and 10 deletions

View File

@ -1,14 +1,25 @@
module Value = { module Value = {
type binaryConditional =
| Selected(bool)
| Unselected;
type t = type t =
| BinaryConditional(binaryConditional)
| SelectSingle(string) | SelectSingle(string)
| DateTime(MomentRe.Moment.t) | DateTime(MomentRe.Moment.t)
| FloatPoint(float) | FloatPoint(float)
| Probability(float)
| FloatCdf(string); | FloatCdf(string);
let to_string = (t: t) => { let to_string = (t: t) => {
switch (t) { switch (t) {
| BinaryConditional(binaryConditional) =>
switch (binaryConditional) {
| Selected(r) => r ? "True" : "False"
| Unselected => ""
}
| SelectSingle(r) => r | SelectSingle(r) => r
| FloatCdf(r) => r | FloatCdf(r) => r
| Probability(r) => (r *. 100. |> Js.Float.toFixed) ++ "%"
| DateTime(r) => r |> MomentRe.Moment.defaultFormat | DateTime(r) => r |> MomentRe.Moment.defaultFormat
| FloatPoint(r) => r |> Js.Float.toFixed | FloatPoint(r) => r |> Js.Float.toFixed
}; };
@ -34,17 +45,23 @@ module Type = {
max: option('a), max: option('a),
}; };
type withDefault('a) = {default: option('a)};
type t = type t =
| BinaryConditional
| SelectSingle(selectSingle) | SelectSingle(selectSingle)
| FloatPoint(withDefaultMinMax(float)) | FloatPoint(withDefaultMinMax(float))
| Probability(withDefault(float))
| DateTime(withDefaultMinMax(MomentRe.Moment.t)) | DateTime(withDefaultMinMax(MomentRe.Moment.t))
| Year(withDefaultMinMax(float)) | Year(withDefaultMinMax(float))
| FloatCdf; | FloatCdf;
let default = (t: t) => let default = (t: t) =>
switch (t) { switch (t) {
| BinaryConditional => Some(Value.BinaryConditional(Unselected))
| Year(r) => r.default->Belt.Option.map(p => Value.FloatPoint(p)) | Year(r) => r.default->Belt.Option.map(p => Value.FloatPoint(p))
| FloatPoint(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)) | DateTime(r) => r.default->Belt.Option.map(p => Value.DateTime(p))
| SelectSingle(r) => | SelectSingle(r) =>
r.default->Belt.Option.map(p => Value.SelectSingle(p)) r.default->Belt.Option.map(p => Value.SelectSingle(p))

View File

@ -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(_), _) | (Year(_), _)
| (FloatPoint(_), _) => <input type_="number" value="" /> | (FloatPoint(_), _) => <input type_="number" value="" />
| (SelectSingle(t), Some(SelectSingle(r))) => | (SelectSingle(t), Some(SelectSingle(r))) =>

View File

@ -11,8 +11,12 @@ module Data = {
type output = type output =
| DONATIONS | DONATIONS
| CHANCE_OF_EXISTENCE
| PAYOUTS; | PAYOUTS;
type conditionals =
| WORLD_CATASTROPHE;
type fundWithInfo = { type fundWithInfo = {
group, group,
name: string, name: string,
@ -93,6 +97,7 @@ module Model = {
| (Fund(META), DONATIONS) => 9300000.0 | (Fund(META), DONATIONS) => 9300000.0
| (Fund(META), PAYOUTS) => 830000.0 | (Fund(META), PAYOUTS) => 830000.0
| (All, _) => sum() | (All, _) => sum()
| (_, CHANCE_OF_EXISTENCE) => 0.0
}; };
}; };
let make = let make =
@ -102,14 +107,21 @@ module Model = {
currentDateTime: MomentRe.Moment.t, currentDateTime: MomentRe.Moment.t,
output: output, output: output,
) => { ) => {
Prop.Value.FloatCdf( switch (output) {
calculateDifference( | DONATIONS
currentValue(group, output), | PAYOUTS =>
dateTime, Prop.Value.FloatCdf(
currentDateTime, calculateDifference(
yearlyMeanGrowthRateIfNotClosed(group), 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) => let outputFromString = (s: string) =>
switch (s) { switch (s) {
| "donations" => DONATIONS | "donations" => DONATIONS
| "exists" => CHANCE_OF_EXISTENCE
| _ => PAYOUTS | _ => PAYOUTS
}; };
@ -136,6 +149,7 @@ module Interface = {
Some(DateTime(intendedYear)), Some(DateTime(intendedYear)),
Some(DateTime(currentYear)), Some(DateTime(currentYear)),
Some(SelectSingle(output)), Some(SelectSingle(output)),
Some(BinaryConditional(r)),
|] => |] =>
choiceFromString(fund) choiceFromString(fund)
|> E.O.fmap(fund => |> E.O.fmap(fund =>
@ -206,12 +220,19 @@ module Interface = {
SelectSingle({ SelectSingle({
default: Some("Output"), default: Some("Output"),
options: [ options: [
{name: "Donations", id: "donations"}, {name: "Donations | Exists", id: "donations"},
{name: "Funding", id: "funding"}, {name: "Funding | Exists", id: "funding"},
{name: "Exists", id: "exists"},
], ],
}), }),
(), (),
), ),
TypeWithMetadata.make(
~name="Conditional on World Ending",
~id="worldEnd",
~type_=BinaryConditional,
(),
),
|], |],
outputTypes: [||], outputTypes: [||],
run, run,