Simple cleanup

This commit is contained in:
Ozzie Gooen 2020-02-07 20:50:16 +00:00
parent db12e64c98
commit 8d42aaacd0
9 changed files with 121 additions and 75 deletions

View File

@ -8,7 +8,7 @@ type group =
| Fund(fund) | Fund(fund)
| All; | All;
type parameter = type output =
| DONATIONS | DONATIONS
| PAYOUTS; | PAYOUTS;

View File

@ -12,24 +12,64 @@ function handleChange(handleChange$1, $$event) {
return Curry._1(handleChange$1, $$event.target.value); return Curry._1(handleChange$1, $$event.target.value);
} }
function get(state, field) {
switch (field) {
case /* Group */0 :
return state[/* group */0];
case /* Year */1 :
return state[/* year */1];
case /* Output */2 :
return state[/* output */2];
}
}
function set(state, field, value) {
switch (field) {
case /* Group */0 :
return /* record */[
/* group */value,
/* year */state[/* year */1],
/* output */state[/* output */2]
];
case /* Year */1 :
return /* record */[
/* group */state[/* group */0],
/* year */value,
/* output */state[/* output */2]
];
case /* Output */2 :
return /* record */[
/* group */state[/* group */0],
/* year */state[/* year */1],
/* output */value
];
}
}
var Form = {
get: get,
set: set
};
function EAFunds_Form(Props) { function EAFunds_Form(Props) {
var match = React.useState((function () { var match = React.useState((function () {
return "Animal Welfare Fund"; return /* record */[
/* group */"Animal Welfare Fund",
/* year */2021,
/* output */"Donations"
];
})); }));
var setGroup = match[1]; var setForm = match[1];
var group = match[0]; var form = match[0];
var match$1 = React.useState((function () { var match$1 = React.useState((function () {
return 2021;
}));
var setYear = match$1[1];
var year = match$1[0];
var match$2 = React.useState((function () {
return "Donations"; return "Donations";
})); }));
var setProperty = match$2[1]; var setProperty = match$1[1];
var property = match$2[0]; var property = match$1[0];
var foundGroup = Belt_Array.getBy(EAFunds_Data$ProbExample.funds, (function (r) { var foundGroup = Belt_Array.getBy(EAFunds_Data$ProbExample.funds, (function (r) {
return r[/* name */1] === group; return r[/* name */1] === form[/* group */0];
})); }));
var foundProperty; var foundProperty;
switch (property) { switch (property) {
@ -44,22 +84,25 @@ function EAFunds_Form(Props) {
} }
return React.createElement(React.Fragment, undefined, React.createElement("input", { return React.createElement(React.Fragment, undefined, React.createElement("input", {
type: "number", type: "number",
value: year.toString(), value: form[/* year */1].toString(),
onChange: (function (param) { onChange: (function (param) {
var r = param.target.value; var r = param.target.value;
var r$1 = Number(r); var r$1 = Number(r);
if (r$1 >= 2020.0 && r$1 <= 2050.0) { if (r$1 >= 2020.0 && r$1 <= 2050.0) {
return Curry._1(setYear, (function (param) { return Curry._1(setForm, (function (param) {
return r$1; return set(form, /* Year */1, r$1);
})); }));
} else { } else {
return /* () */0; return /* () */0;
} }
}) })
}), React.createElement(Antd_Radio.Group.make, { }), React.createElement(Antd_Radio.Group.make, {
value: group, value: form[/* group */0],
onChange: (function (param) { onChange: (function (param) {
return Curry._1(setGroup, param.target.value); var r = param.target.value;
return Curry._1(setForm, (function (param) {
return set(form, /* Group */0, r);
}));
}), }),
children: $$Array.map((function (f) { children: $$Array.map((function (f) {
return React.createElement(Antd_Radio.make, { return React.createElement(Antd_Radio.make, {
@ -79,11 +122,12 @@ function EAFunds_Form(Props) {
}), React.createElement(Antd_Radio.make, { }), React.createElement(Antd_Radio.make, {
value: "Payouts", value: "Payouts",
children: "Payouts" children: "Payouts"
})), foundGroup !== undefined && foundProperty !== undefined ? EAFunds_Model$ProbExample.run(foundGroup[/* group */0], year, foundProperty) : ""); })), foundGroup !== undefined && foundProperty !== undefined ? EAFunds_Model$ProbExample.run(foundGroup[/* group */0], form[/* year */1], foundProperty) : "");
} }
var make = EAFunds_Form; var make = EAFunds_Form;
exports.handleChange = handleChange; exports.handleChange = handleChange;
exports.Form = Form;
exports.make = make; exports.make = make;
/* react Not a pure module */ /* react Not a pure module */

View File

@ -3,12 +3,23 @@ open EAFunds_Data;
let handleChange = (handleChange, event) => let handleChange = (handleChange, event) =>
handleChange(ReactEvent.Form.target(event)##value); handleChange(ReactEvent.Form.target(event)##value);
module Form = [%lenses
type state = {
group: string,
year: float,
output: string,
}
];
[@react.component] [@react.component]
let make = () => { let make = () => {
let (group, setGroup) = React.useState(() => "Animal Welfare Fund"); let (form, setForm) =
let (year, setYear) = React.useState(() => 2021.); React.useState(() =>
{Form.group: "Animal Welfare Fund", year: 2021., output: "Donations"}
);
let (property, setProperty) = React.useState(() => "Donations"); let (property, setProperty) = React.useState(() => "Donations");
let foundGroup = Belt.Array.getBy(EAFunds_Data.funds, r => r.name === group); let foundGroup =
Belt.Array.getBy(EAFunds_Data.funds, r => r.name === form.group);
let foundProperty = let foundProperty =
switch (property) { switch (property) {
| "Donations" => Some(DONATIONS) | "Donations" => Some(DONATIONS)
@ -18,15 +29,20 @@ let make = () => {
<> <>
<input <input
type_="number" type_="number"
value={year |> Js.Float.toString} value={Form.get(form, Year) |> Js.Float.toString}
onChange={handleChange(r => onChange={handleChange(r =>
switch (Js.Float.fromString(r)) { switch (Js.Float.fromString(r)) {
| r when r >= 2020.0 && r <= 2050.0 => setYear(_ => r) | r when r >= 2020.0 && r <= 2050.0 =>
setForm(_ => Form.set(form, Form.Year, r))
| _ => () | _ => ()
} }
)} )}
/> />
<Antd.Radio.Group value=group onChange={handleChange(r => setGroup(r))}> <Antd.Radio.Group
value={Form.get(form, Group)}
onChange={handleChange(r =>
setForm(_ => Form.set(form, Form.Group, r))
)}>
{EAFunds_Data.funds {EAFunds_Data.funds
|> Array.map(f => |> Array.map(f =>
<Antd.Radio value={f.name}> <Antd.Radio value={f.name}>
@ -46,7 +62,8 @@ let make = () => {
</Antd.Radio.Group> </Antd.Radio.Group>
{( {(
switch (foundGroup, foundProperty) { switch (foundGroup, foundProperty) {
| (Some(g), Some(f)) => EAFunds_Model.run(g.group, year, f) | (Some(g), Some(f)) =>
EAFunds_Model.run(g.group, Form.get(form, Year), f)
| _ => "" | _ => ""
} }
) )

View File

@ -1,16 +1,5 @@
open BsReform;
open EAFunds_Data; open EAFunds_Data;
module FormConfig = [%lenses
type state = {
group: string,
year: float,
parameter: string,
}
];
module Form = ReForm.Make(FormConfig);
let handleChange = (handleChange, event) => let handleChange = (handleChange, event) =>
handleChange(ReactEvent.Form.target(event)##value); handleChange(ReactEvent.Form.target(event)##value);
@ -18,6 +7,7 @@ let handleChange = (handleChange, event) =>
let make = () => { let make = () => {
let (year, setYear) = React.useState(() => 2021.); let (year, setYear) = React.useState(() => 2021.);
<> <>
<h1> {"EA Funds Forecasting Model 0.1" |> ReasonReact.string} </h1>
<input <input
type_="number" type_="number"
value={year |> Js.Float.toString} value={year |> Js.Float.toString}

View File

@ -20,29 +20,29 @@ function calculateDifference(currentValue, yearInQuestion, y) {
return Math$ProbExample.normal(currentValue * meanDiff, 0.2 * stdDevDiff); return Math$ProbExample.normal(currentValue * meanDiff, 0.2 * stdDevDiff);
} }
function currentValue(group, parameter) { function currentValue(group, output) {
if (group) { if (group) {
switch (group[0]) { switch (group[0]) {
case /* ANIMAL_WELFARE */0 : case /* ANIMAL_WELFARE */0 :
if (parameter) { if (output) {
return 2300000.0; return 2300000.0;
} else { } else {
return 300000.0; return 300000.0;
} }
case /* GLOBAL_HEALTH */1 : case /* GLOBAL_HEALTH */1 :
if (parameter) { if (output) {
return 500000.0; return 500000.0;
} else { } else {
return 1000000.0; return 1000000.0;
} }
case /* LONG_TERM_FUTURE */2 : case /* LONG_TERM_FUTURE */2 :
if (parameter) { if (output) {
return 120000.0; return 120000.0;
} else { } else {
return 600000.0; return 600000.0;
} }
case /* META */3 : case /* META */3 :
if (parameter) { if (output) {
return 830000.0; return 830000.0;
} else { } else {
return 9300000.0; return 9300000.0;
@ -50,7 +50,7 @@ function currentValue(group, parameter) {
} }
} else { } else {
return currentValue(/* Fund */[/* ANIMAL_WELFARE */0], parameter) + currentValue(/* Fund */[/* GLOBAL_HEALTH */1], parameter) + currentValue(/* Fund */[/* LONG_TERM_FUTURE */2], parameter) + currentValue(/* Fund */[/* META */3], parameter); return currentValue(/* Fund */[/* ANIMAL_WELFARE */0], output) + currentValue(/* Fund */[/* GLOBAL_HEALTH */1], output) + currentValue(/* Fund */[/* LONG_TERM_FUTURE */2], output) + currentValue(/* Fund */[/* META */3], output);
} }
} }
@ -63,8 +63,8 @@ var PayoutsIfAround = {
currentValue: currentValue currentValue: currentValue
}; };
function run(group, year, parameter) { function run(group, year, output) {
return calculateDifference(currentValue(group, parameter), year, /* record */[ return calculateDifference(currentValue(group, output), year, /* record */[
/* meanDiff */1.1, /* meanDiff */1.1,
/* stdDiff */1.1 /* stdDiff */1.1
]); ]);

View File

@ -22,13 +22,13 @@ module PayoutsIfAround = {
Math.normal(currentValue *. meanDiff, firstYearStdDev *. stdDevDiff); Math.normal(currentValue *. meanDiff, firstYearStdDev *. stdDevDiff);
}; };
let rec currentValue = (group: group, parameter) => { let rec currentValue = (group: group, output) => {
let sum = (): float => let sum = (): float =>
currentValue(Fund(ANIMAL_WELFARE), parameter) currentValue(Fund(ANIMAL_WELFARE), output)
+. currentValue(Fund(GLOBAL_HEALTH), parameter) +. currentValue(Fund(GLOBAL_HEALTH), output)
+. currentValue(Fund(LONG_TERM_FUTURE), parameter) +. currentValue(Fund(LONG_TERM_FUTURE), output)
+. currentValue(Fund(META), parameter); +. currentValue(Fund(META), output);
switch (group, parameter) { switch (group, output) {
| (Fund(ANIMAL_WELFARE), DONATIONS) => 300000.0 | (Fund(ANIMAL_WELFARE), DONATIONS) => 300000.0
| (Fund(ANIMAL_WELFARE), PAYOUTS) => 2300000.0 | (Fund(ANIMAL_WELFARE), PAYOUTS) => 2300000.0
| (Fund(GLOBAL_HEALTH), DONATIONS) => 1000000.0 | (Fund(GLOBAL_HEALTH), DONATIONS) => 1000000.0
@ -42,10 +42,10 @@ module PayoutsIfAround = {
}; };
}; };
let run = (group: group, year: float, parameter: parameter) => { let run = (group: group, year: float, output: output) => {
PayoutsIfAround.( PayoutsIfAround.(
calculateDifference( calculateDifference(
currentValue(group, parameter), currentValue(group, output),
year, year,
yearlyMeanGrowthRateIfNotClosed(group), yearlyMeanGrowthRateIfNotClosed(group),
) )
@ -56,6 +56,6 @@ module Model = {
type params = { type params = {
groups: array(fundWithInfo), groups: array(fundWithInfo),
year: float, year: float,
parameters: array(parameter), outputs: array(output),
}; };
}; };

View File

@ -1,16 +0,0 @@
'use strict';
var React = require("react");
var EAFunds_Model$ProbExample = require("./EAFunds/EAFunds_Model.bs.js");
var response = EAFunds_Model$ProbExample.run(/* Fund */[/* GLOBAL_HEALTH */1], 2029, /* DONATIONS */0);
function Funds(Props) {
return React.createElement("div", undefined, response);
}
var make = Funds;
exports.response = response;
exports.make = make;
/* response Not a pure module */

View File

@ -1,6 +0,0 @@
let response = EAFunds_Model.run(Fund(GLOBAL_HEALTH), 2029., DONATIONS);
[@react.component]
let make = () => {
<div> {React.string(response)} </div>;
};

17
src/Params.re Normal file
View File

@ -0,0 +1,17 @@
type yearAsFloat = {
min: option(float),
max: option(float),
};
type namedValue('a) = {
name: string,
value: 'a,
};
type choice('a) = list(namedValue('a));
type output =
| A
| B;
let nOutput: choice(output) = [{name: "sdfsdf", value: A}];