Added reducer to Function Registry
This commit is contained in:
parent
12ac2f551b
commit
835ce6b81f
|
@ -47,6 +47,7 @@ type fnDefinition = {
|
||||||
array<internalExpressionValue>,
|
array<internalExpressionValue>,
|
||||||
array<frValue>,
|
array<frValue>,
|
||||||
GenericDist.env,
|
GenericDist.env,
|
||||||
|
Reducer_Expression_T.reducerFn,
|
||||||
) => result<internalExpressionValue, string>,
|
) => result<internalExpressionValue, string>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,10 +343,15 @@ module FnDefinition = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let run = (t: t, args: array<internalExpressionValue>, env: GenericDist.env) => {
|
let run = (
|
||||||
|
t: t,
|
||||||
|
args: array<internalExpressionValue>,
|
||||||
|
env: GenericDist.env,
|
||||||
|
reducer: Reducer_Expression_T.reducerFn,
|
||||||
|
) => {
|
||||||
let argValues = FRType.matchWithExpressionValueArray(t.inputs, args)
|
let argValues = FRType.matchWithExpressionValueArray(t.inputs, args)
|
||||||
switch argValues {
|
switch argValues {
|
||||||
| Some(values) => t.run(args, values, env)
|
| Some(values) => t.run(args, values, env, reducer)
|
||||||
| None => Error("Incorrect Types")
|
| None => Error("Incorrect Types")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -452,6 +458,7 @@ module Registry = {
|
||||||
~fnName: string,
|
~fnName: string,
|
||||||
~args: array<internalExpressionValue>,
|
~args: array<internalExpressionValue>,
|
||||||
~env: GenericDist.env,
|
~env: GenericDist.env,
|
||||||
|
~reducer: Reducer_Expression_T.reducerFn,
|
||||||
) => {
|
) => {
|
||||||
let relevantFunctions = Js.Dict.get(registry.fnNameDict, fnName) |> E.O.default([])
|
let relevantFunctions = Js.Dict.get(registry.fnNameDict, fnName) |> E.O.default([])
|
||||||
let modified = {functions: relevantFunctions, fnNameDict: registry.fnNameDict}
|
let modified = {functions: relevantFunctions, fnNameDict: registry.fnNameDict}
|
||||||
|
@ -468,7 +475,8 @@ module Registry = {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch Matcher.Registry.findMatches(modified, fnName, args) {
|
switch Matcher.Registry.findMatches(modified, fnName, args) {
|
||||||
| Matcher.Match.FullMatch(match) => match->matchToDef->E.O2.fmap(FnDefinition.run(_, args, env))
|
| Matcher.Match.FullMatch(match) =>
|
||||||
|
match->matchToDef->E.O2.fmap(FnDefinition.run(_, args, env, reducer))
|
||||||
| SameNameDifferentArguments(m) => Some(Error(showNameMatchDefinitions(m)))
|
| SameNameDifferentArguments(m) => Some(Error(showNameMatchDefinitions(m)))
|
||||||
| _ => None
|
| _ => None
|
||||||
}
|
}
|
||||||
|
@ -478,8 +486,9 @@ module Registry = {
|
||||||
registry,
|
registry,
|
||||||
(fnName, args): ReducerInterface_InternalExpressionValue.functionCall,
|
(fnName, args): ReducerInterface_InternalExpressionValue.functionCall,
|
||||||
env,
|
env,
|
||||||
|
reducer: Reducer_Expression_T.reducerFn,
|
||||||
) => {
|
) => {
|
||||||
_matchAndRun(~registry, ~fnName, ~args, ~env)->E.O2.fmap(
|
_matchAndRun(~registry, ~fnName, ~args, ~env, ~reducer)->E.O2.fmap(
|
||||||
E.R2.errMap(_, s => Reducer_ErrorValue.RETodo(s)),
|
E.R2.errMap(_, s => Reducer_ErrorValue.RETodo(s)),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="merge",
|
~name="merge",
|
||||||
~inputs=[FRTypeDict(FRTypeAny), FRTypeDict(FRTypeAny)],
|
~inputs=[FRTypeDict(FRTypeAny), FRTypeDict(FRTypeAny)],
|
||||||
~run=(inputs, _, _) => {
|
~run=(inputs, _, _, _) => {
|
||||||
switch inputs {
|
switch inputs {
|
||||||
| [IEvRecord(d1), IEvRecord(d2)] => Internals.merge(d1, d2)->Ok
|
| [IEvRecord(d1), IEvRecord(d2)] => Internals.merge(d1, d2)->Ok
|
||||||
| _ => Error(impossibleError)
|
| _ => Error(impossibleError)
|
||||||
|
@ -74,7 +74,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="mergeMany",
|
~name="mergeMany",
|
||||||
~inputs=[FRTypeArray(FRTypeDict(FRTypeAny))],
|
~inputs=[FRTypeArray(FRTypeDict(FRTypeAny))],
|
||||||
~run=(_, inputs, _) =>
|
~run=(_, inputs, _, _) =>
|
||||||
inputs
|
inputs
|
||||||
->Prepare.ToTypedArray.dicts
|
->Prepare.ToTypedArray.dicts
|
||||||
->E.R2.fmap(E.Dict.concatMany)
|
->E.R2.fmap(E.Dict.concatMany)
|
||||||
|
@ -96,7 +96,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="keys",
|
~name="keys",
|
||||||
~inputs=[FRTypeDict(FRTypeAny)],
|
~inputs=[FRTypeDict(FRTypeAny)],
|
||||||
~run=(inputs, _, _) =>
|
~run=(inputs, _, _, _) =>
|
||||||
switch inputs {
|
switch inputs {
|
||||||
| [IEvRecord(d1)] => Internals.keys(d1)->Ok
|
| [IEvRecord(d1)] => Internals.keys(d1)->Ok
|
||||||
| _ => Error(impossibleError)
|
| _ => Error(impossibleError)
|
||||||
|
@ -116,7 +116,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="values",
|
~name="values",
|
||||||
~inputs=[FRTypeDict(FRTypeAny)],
|
~inputs=[FRTypeDict(FRTypeAny)],
|
||||||
~run=(inputs, _, _) =>
|
~run=(inputs, _, _, _) =>
|
||||||
switch inputs {
|
switch inputs {
|
||||||
| [IEvRecord(d1)] => Internals.values(d1)->Ok
|
| [IEvRecord(d1)] => Internals.values(d1)->Ok
|
||||||
| _ => Error(impossibleError)
|
| _ => Error(impossibleError)
|
||||||
|
@ -136,7 +136,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="toList",
|
~name="toList",
|
||||||
~inputs=[FRTypeDict(FRTypeAny)],
|
~inputs=[FRTypeDict(FRTypeAny)],
|
||||||
~run=(inputs, _, _) =>
|
~run=(inputs, _, _, _) =>
|
||||||
switch inputs {
|
switch inputs {
|
||||||
| [IEvRecord(dict)] => dict->Internals.toList->Ok
|
| [IEvRecord(dict)] => dict->Internals.toList->Ok
|
||||||
| _ => Error(impossibleError)
|
| _ => Error(impossibleError)
|
||||||
|
@ -156,7 +156,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="fromList",
|
~name="fromList",
|
||||||
~inputs=[FRTypeArray(FRTypeArray(FRTypeAny))],
|
~inputs=[FRTypeArray(FRTypeArray(FRTypeAny))],
|
||||||
~run=(inputs, _, _) =>
|
~run=(inputs, _, _, _) =>
|
||||||
switch inputs {
|
switch inputs {
|
||||||
| [IEvArray(items)] => Internals.fromList(items)
|
| [IEvArray(items)] => Internals.fromList(items)
|
||||||
| _ => Error(impossibleError)
|
| _ => Error(impossibleError)
|
||||||
|
|
|
@ -21,7 +21,8 @@ module DistributionCreation = {
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name,
|
~name,
|
||||||
~inputs=[FRTypeDistOrNumber, FRTypeDistOrNumber],
|
~inputs=[FRTypeDistOrNumber, FRTypeDistOrNumber],
|
||||||
~run=(_, inputs, env) => inputs->Prepare.ToValueTuple.twoDistOrNumber->process(~fn, ~env),
|
~run=(_, inputs, env, _) =>
|
||||||
|
inputs->Prepare.ToValueTuple.twoDistOrNumber->process(~fn, ~env),
|
||||||
(),
|
(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -30,7 +31,7 @@ module DistributionCreation = {
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name,
|
~name,
|
||||||
~inputs=[FRTypeRecord([("p5", FRTypeDistOrNumber), ("p95", FRTypeDistOrNumber)])],
|
~inputs=[FRTypeRecord([("p5", FRTypeDistOrNumber), ("p95", FRTypeDistOrNumber)])],
|
||||||
~run=(_, inputs, env) =>
|
~run=(_, inputs, env, _) =>
|
||||||
inputs->Prepare.ToValueTuple.Record.twoDistOrNumber->process(~fn, ~env),
|
inputs->Prepare.ToValueTuple.Record.twoDistOrNumber->process(~fn, ~env),
|
||||||
(),
|
(),
|
||||||
)
|
)
|
||||||
|
@ -40,7 +41,7 @@ module DistributionCreation = {
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name,
|
~name,
|
||||||
~inputs=[FRTypeRecord([("mean", FRTypeDistOrNumber), ("stdev", FRTypeDistOrNumber)])],
|
~inputs=[FRTypeRecord([("mean", FRTypeDistOrNumber), ("stdev", FRTypeDistOrNumber)])],
|
||||||
~run=(_, inputs, env) =>
|
~run=(_, inputs, env, _) =>
|
||||||
inputs->Prepare.ToValueTuple.Record.twoDistOrNumber->process(~fn, ~env),
|
inputs->Prepare.ToValueTuple.Record.twoDistOrNumber->process(~fn, ~env),
|
||||||
(),
|
(),
|
||||||
)
|
)
|
||||||
|
@ -57,7 +58,8 @@ module DistributionCreation = {
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name,
|
~name,
|
||||||
~inputs=[FRTypeDistOrNumber],
|
~inputs=[FRTypeDistOrNumber],
|
||||||
~run=(_, inputs, env) => inputs->Prepare.ToValueTuple.oneDistOrNumber->process(~fn, ~env),
|
~run=(_, inputs, env, _) =>
|
||||||
|
inputs->Prepare.ToValueTuple.oneDistOrNumber->process(~fn, ~env),
|
||||||
(),
|
(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="declare",
|
~name="declare",
|
||||||
~inputs=[Declaration.frType],
|
~inputs=[Declaration.frType],
|
||||||
~run=(_, inputs, _) => {
|
~run=(_, inputs, _, _) => {
|
||||||
inputs->getOrError(0)->E.R.bind(Declaration.fromExpressionValue)
|
inputs->getOrError(0)->E.R.bind(Declaration.fromExpressionValue)
|
||||||
},
|
},
|
||||||
(),
|
(),
|
||||||
|
|
|
@ -37,7 +37,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="make",
|
~name="make",
|
||||||
~inputs=[FRTypeNumber, FRTypeAny],
|
~inputs=[FRTypeNumber, FRTypeAny],
|
||||||
~run=(inputs, _, _) => {
|
~run=(inputs, _, _, _) => {
|
||||||
switch inputs {
|
switch inputs {
|
||||||
| [IEvNumber(number), value] => Internals.makeFromNumber(number, value)->Ok
|
| [IEvNumber(number), value] => Internals.makeFromNumber(number, value)->Ok
|
||||||
| _ => Error(impossibleError)
|
| _ => Error(impossibleError)
|
||||||
|
@ -58,7 +58,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="upTo",
|
~name="upTo",
|
||||||
~inputs=[FRTypeNumber, FRTypeNumber],
|
~inputs=[FRTypeNumber, FRTypeNumber],
|
||||||
~run=(_, inputs, _) =>
|
~run=(_, inputs, _, _) =>
|
||||||
inputs
|
inputs
|
||||||
->Prepare.ToValueTuple.twoNumbers
|
->Prepare.ToValueTuple.twoNumbers
|
||||||
->E.R2.fmap(((low, high)) => Internals.upTo(low, high)),
|
->E.R2.fmap(((low, high)) => Internals.upTo(low, high)),
|
||||||
|
@ -76,7 +76,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="first",
|
~name="first",
|
||||||
~inputs=[FRTypeArray(FRTypeAny)],
|
~inputs=[FRTypeArray(FRTypeAny)],
|
||||||
~run=(inputs, _, _) =>
|
~run=(inputs, _, _, _) =>
|
||||||
switch inputs {
|
switch inputs {
|
||||||
| [IEvArray(array)] => Internals.first(array)
|
| [IEvArray(array)] => Internals.first(array)
|
||||||
| _ => Error(impossibleError)
|
| _ => Error(impossibleError)
|
||||||
|
@ -95,7 +95,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="last",
|
~name="last",
|
||||||
~inputs=[FRTypeArray(FRTypeAny)],
|
~inputs=[FRTypeArray(FRTypeAny)],
|
||||||
~run=(inputs, _, _) =>
|
~run=(inputs, _, _, _) =>
|
||||||
switch inputs {
|
switch inputs {
|
||||||
| [IEvArray(array)] => Internals.last(array)
|
| [IEvArray(array)] => Internals.last(array)
|
||||||
| _ => Error(impossibleError)
|
| _ => Error(impossibleError)
|
||||||
|
@ -115,7 +115,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="reverse",
|
~name="reverse",
|
||||||
~inputs=[FRTypeArray(FRTypeAny)],
|
~inputs=[FRTypeArray(FRTypeAny)],
|
||||||
~run=(inputs, _, _) =>
|
~run=(inputs, _, _, _) =>
|
||||||
switch inputs {
|
switch inputs {
|
||||||
| [IEvArray(array)] => Internals.reverse(array)->Ok
|
| [IEvArray(array)] => Internals.reverse(array)->Ok
|
||||||
| _ => Error(impossibleError)
|
| _ => Error(impossibleError)
|
||||||
|
|
|
@ -9,7 +9,7 @@ module NumberToNumber = {
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name,
|
~name,
|
||||||
~inputs=[FRTypeNumber],
|
~inputs=[FRTypeNumber],
|
||||||
~run=(_, inputs, _) => {
|
~run=(_, inputs, _, _) => {
|
||||||
inputs
|
inputs
|
||||||
->getOrError(0)
|
->getOrError(0)
|
||||||
->E.R.bind(Prepare.oneNumber)
|
->E.R.bind(Prepare.oneNumber)
|
||||||
|
@ -25,7 +25,7 @@ module ArrayNumberDist = {
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name,
|
~name,
|
||||||
~inputs=[FRTypeArray(FRTypeNumber)],
|
~inputs=[FRTypeArray(FRTypeNumber)],
|
||||||
~run=(_, inputs, _) =>
|
~run=(_, inputs, _, _) =>
|
||||||
Prepare.ToTypedArray.numbers(inputs)
|
Prepare.ToTypedArray.numbers(inputs)
|
||||||
->E.R.bind(r => E.A.length(r) === 0 ? Error("List is empty") : Ok(r))
|
->E.R.bind(r => E.A.length(r) === 0 ? Error("List is empty") : Ok(r))
|
||||||
->E.R.bind(fn),
|
->E.R.bind(fn),
|
||||||
|
@ -36,7 +36,7 @@ module ArrayNumberDist = {
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name,
|
~name,
|
||||||
~inputs=[FRTypeArray(FRTypeAny)],
|
~inputs=[FRTypeArray(FRTypeAny)],
|
||||||
~run=(_, inputs, _) =>
|
~run=(_, inputs, _, _) =>
|
||||||
Prepare.ToTypedArray.numbers(inputs)
|
Prepare.ToTypedArray.numbers(inputs)
|
||||||
->E.R.bind(r => E.A.length(r) === 0 ? Error("List is empty") : Ok(r))
|
->E.R.bind(r => E.A.length(r) === 0 ? Error("List is empty") : Ok(r))
|
||||||
->E.R.bind(fn),
|
->E.R.bind(fn),
|
||||||
|
|
|
@ -41,7 +41,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="makeContinuous",
|
~name="makeContinuous",
|
||||||
~inputs=[FRTypeArray(FRTypeRecord([("x", FRTypeNumeric), ("y", FRTypeNumeric)]))],
|
~inputs=[FRTypeArray(FRTypeRecord([("x", FRTypeNumeric), ("y", FRTypeNumeric)]))],
|
||||||
~run=(_, inputs, _) => inputsTodist(inputs, r => Continuous(Continuous.make(r))),
|
~run=(_, inputs, _, _) => inputsTodist(inputs, r => Continuous(Continuous.make(r))),
|
||||||
(),
|
(),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -64,7 +64,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="makeDiscrete",
|
~name="makeDiscrete",
|
||||||
~inputs=[FRTypeArray(FRTypeRecord([("x", FRTypeNumeric), ("y", FRTypeNumeric)]))],
|
~inputs=[FRTypeArray(FRTypeRecord([("x", FRTypeNumeric), ("y", FRTypeNumeric)]))],
|
||||||
~run=(_, inputs, _) => inputsTodist(inputs, r => Discrete(Discrete.make(r))),
|
~run=(_, inputs, _, _) => inputsTodist(inputs, r => Discrete(Discrete.make(r))),
|
||||||
(),
|
(),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -30,7 +30,7 @@ let library = [
|
||||||
("prior", FRTypeDist),
|
("prior", FRTypeDist),
|
||||||
]),
|
]),
|
||||||
],
|
],
|
||||||
~run=(_, inputs, env) => {
|
~run=(_, inputs, env, _) => {
|
||||||
switch FunctionRegistry_Helpers.Prepare.ToValueArray.Record.threeArgs(inputs) {
|
switch FunctionRegistry_Helpers.Prepare.ToValueArray.Record.threeArgs(inputs) {
|
||||||
| Ok([FRValueDist(estimate), FRValueDistOrNumber(FRValueDist(d)), FRValueDist(prior)]) =>
|
| Ok([FRValueDist(estimate), FRValueDistOrNumber(FRValueDist(d)), FRValueDist(prior)]) =>
|
||||||
runScoring(estimate, Score_Dist(d), Some(prior), env)
|
runScoring(estimate, Score_Dist(d), Some(prior), env)
|
||||||
|
@ -49,7 +49,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="logScore",
|
~name="logScore",
|
||||||
~inputs=[FRTypeRecord([("estimate", FRTypeDist), ("answer", FRTypeDistOrNumber)])],
|
~inputs=[FRTypeRecord([("estimate", FRTypeDist), ("answer", FRTypeDistOrNumber)])],
|
||||||
~run=(_, inputs, env) => {
|
~run=(_, inputs, env, _) => {
|
||||||
switch FunctionRegistry_Helpers.Prepare.ToValueArray.Record.twoArgs(inputs) {
|
switch FunctionRegistry_Helpers.Prepare.ToValueArray.Record.twoArgs(inputs) {
|
||||||
| Ok([FRValueDist(estimate), FRValueDistOrNumber(FRValueDist(d))]) =>
|
| Ok([FRValueDist(estimate), FRValueDistOrNumber(FRValueDist(d))]) =>
|
||||||
runScoring(estimate, Score_Dist(d), None, env)
|
runScoring(estimate, Score_Dist(d), None, env)
|
||||||
|
@ -74,7 +74,7 @@ let library = [
|
||||||
FnDefinition.make(
|
FnDefinition.make(
|
||||||
~name="klDivergence",
|
~name="klDivergence",
|
||||||
~inputs=[FRTypeDist, FRTypeDist],
|
~inputs=[FRTypeDist, FRTypeDist],
|
||||||
~run=(_, inputs, env) => {
|
~run=(_, inputs, env, _) => {
|
||||||
switch inputs {
|
switch inputs {
|
||||||
| [FRValueDist(estimate), FRValueDist(d)] =>
|
| [FRValueDist(estimate), FRValueDist(d)] =>
|
||||||
runScoring(estimate, Score_Dist(d), None, env)
|
runScoring(estimate, Score_Dist(d), None, env)
|
||||||
|
|
|
@ -4,16 +4,18 @@ type internalExpressionValue = InternalExpressionValue.t
|
||||||
/*
|
/*
|
||||||
Map external calls of Reducer
|
Map external calls of Reducer
|
||||||
*/
|
*/
|
||||||
let dispatch = (call: InternalExpressionValue.functionCall, environment, reducer, chain): result<
|
let dispatch = (
|
||||||
internalExpressionValue,
|
call: InternalExpressionValue.functionCall,
|
||||||
'e,
|
environment,
|
||||||
> => {
|
reducer: Reducer_Expression_T.reducerFn,
|
||||||
|
chain,
|
||||||
|
): result<internalExpressionValue, 'e> => {
|
||||||
E.A.O.firstSomeFn([
|
E.A.O.firstSomeFn([
|
||||||
() => ReducerInterface_GenericDistribution.dispatch(call, environment),
|
() => ReducerInterface_GenericDistribution.dispatch(call, environment),
|
||||||
() => ReducerInterface_Date.dispatch(call, environment),
|
() => ReducerInterface_Date.dispatch(call, environment),
|
||||||
() => ReducerInterface_Duration.dispatch(call, environment),
|
() => ReducerInterface_Duration.dispatch(call, environment),
|
||||||
() => ReducerInterface_Number.dispatch(call, environment),
|
() => ReducerInterface_Number.dispatch(call, environment),
|
||||||
() => FunctionRegistry_Library.dispatch(call, environment),
|
() => FunctionRegistry_Library.dispatch(call, environment, reducer),
|
||||||
])->E.O2.default(chain(call, environment, reducer))
|
])->E.O2.default(chain(call, environment, reducer))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user