Simple cleanup
This commit is contained in:
parent
db12e64c98
commit
8d42aaacd0
|
@ -8,7 +8,7 @@ type group =
|
||||||
| Fund(fund)
|
| Fund(fund)
|
||||||
| All;
|
| All;
|
||||||
|
|
||||||
type parameter =
|
type output =
|
||||||
| DONATIONS
|
| DONATIONS
|
||||||
| PAYOUTS;
|
| PAYOUTS;
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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)
|
||||||
| _ => ""
|
| _ => ""
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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
|
||||||
]);
|
]);
|
||||||
|
|
|
@ -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),
|
||||||
};
|
};
|
||||||
};
|
};
|
|
@ -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 */
|
|
|
@ -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
17
src/Params.re
Normal 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}];
|
Loading…
Reference in New Issue
Block a user