First attempt at function declaration
This commit is contained in:
parent
c916f12bce
commit
6248818531
|
@ -8,9 +8,12 @@ type rec frType =
|
||||||
| FRTypeNumber
|
| FRTypeNumber
|
||||||
| FRTypeNumeric
|
| FRTypeNumeric
|
||||||
| FRTypeDistOrNumber
|
| FRTypeDistOrNumber
|
||||||
|
| FRTLambda
|
||||||
| FRTypeRecord(frTypeRecord)
|
| FRTypeRecord(frTypeRecord)
|
||||||
| FRTypeArray(array<frType>)
|
| FRTypeArray(frType)
|
||||||
| FRTypeOption(frType)
|
| FRTypeOption(frType)
|
||||||
|
| FRTypeString
|
||||||
|
| FRTypeVariant(array<string>)
|
||||||
and frTypeRecord = array<frTypeRecordParam>
|
and frTypeRecord = array<frTypeRecordParam>
|
||||||
and frTypeRecordParam = (string, frType)
|
and frTypeRecordParam = (string, frType)
|
||||||
|
|
||||||
|
@ -22,8 +25,12 @@ type rec frValue =
|
||||||
| FRValueNumber(float)
|
| FRValueNumber(float)
|
||||||
| FRValueDist(DistributionTypes.genericDist)
|
| FRValueDist(DistributionTypes.genericDist)
|
||||||
| FRValueOption(option<frValue>)
|
| FRValueOption(option<frValue>)
|
||||||
|
| FRValueArray(array<frValue>)
|
||||||
| FRValueDistOrNumber(frValueDistOrNumber)
|
| FRValueDistOrNumber(frValueDistOrNumber)
|
||||||
| FRValueRecord(frValueRecord)
|
| FRValueRecord(frValueRecord)
|
||||||
|
| FRValueLambda(ReducerInterface_ExpressionValue.lambdaValue)
|
||||||
|
| FRValueString(string)
|
||||||
|
| FRValueVariant(string)
|
||||||
and frValueRecord = array<frValueRecordParam>
|
and frValueRecord = array<frValueRecordParam>
|
||||||
and frValueRecordParam = (string, frValue)
|
and frValueRecordParam = (string, frValue)
|
||||||
and frValueDistOrNumber = FRValueNumber(float) | FRValueDist(DistributionTypes.genericDist)
|
and frValueDistOrNumber = FRValueNumber(float) | FRValueDist(DistributionTypes.genericDist)
|
||||||
|
@ -52,8 +59,9 @@ module FRType = {
|
||||||
let input = ((name, frType): frTypeRecordParam) => `${name}: ${toString(frType)}`
|
let input = ((name, frType): frTypeRecordParam) => `${name}: ${toString(frType)}`
|
||||||
`record({${r->E.A2.fmap(input)->E.A2.joinWith(", ")}})`
|
`record({${r->E.A2.fmap(input)->E.A2.joinWith(", ")}})`
|
||||||
}
|
}
|
||||||
| FRTypeArray(r) => `record(${r->E.A2.fmap(toString)->E.A2.joinWith(", ")})`
|
| FRTypeArray(r) => `record(${toString(r)})`
|
||||||
| FRTypeOption(v) => `option(${toString(v)})`
|
| FRTypeOption(v) => `option(${toString(v)})`
|
||||||
|
| FRTLambda => `lambda`
|
||||||
}
|
}
|
||||||
|
|
||||||
let rec matchWithExpressionValue = (t: t, r: expressionValue): option<frValue> =>
|
let rec matchWithExpressionValue = (t: t, r: expressionValue): option<frValue> =>
|
||||||
|
@ -66,6 +74,7 @@ module FRType = {
|
||||||
| (FRTypeNumeric, EvNumber(f)) => Some(FRValueNumber(f))
|
| (FRTypeNumeric, EvNumber(f)) => Some(FRValueNumber(f))
|
||||||
| (FRTypeNumeric, EvDistribution(Symbolic(#Float(f)))) => Some(FRValueNumber(f))
|
| (FRTypeNumeric, EvDistribution(Symbolic(#Float(f)))) => Some(FRValueNumber(f))
|
||||||
| (FRTypeOption(v), _) => Some(FRValueOption(matchWithExpressionValue(v, r)))
|
| (FRTypeOption(v), _) => Some(FRValueOption(matchWithExpressionValue(v, r)))
|
||||||
|
| (FRTLambda, EvLambda(f)) => Some(FRValueLambda(f))
|
||||||
| (FRTypeRecord(recordParams), EvRecord(record)) => {
|
| (FRTypeRecord(recordParams), EvRecord(record)) => {
|
||||||
let getAndMatch = (name, input) =>
|
let getAndMatch = (name, input) =>
|
||||||
E.Dict.get(record, name)->E.O.bind(matchWithExpressionValue(input))
|
E.Dict.get(record, name)->E.O.bind(matchWithExpressionValue(input))
|
||||||
|
@ -80,6 +89,24 @@ module FRType = {
|
||||||
| _ => None
|
| _ => None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let rec matchReverse = (e: frValue): expressionValue =>
|
||||||
|
switch(e){
|
||||||
|
| FRValueNumber(f) => (EvNumber(f))
|
||||||
|
| FRValueDistOrNumber(FRValueNumber(n)) => EvNumber(n)
|
||||||
|
| FRValueDistOrNumber(FRValueDist(n)) => EvDistribution(n)
|
||||||
|
| FRValueDist(dist) => EvDistribution(dist)
|
||||||
|
| FRValueOption(Some(r)) => matchReverse(r)
|
||||||
|
| FRValueArray(elements) => EvArray(elements->E.A2.fmap(matchReverse))
|
||||||
|
| FRValueRecord(frValueRecord) => {
|
||||||
|
let record = frValueRecord->E.A2.fmap(((name, value)) => (name, matchReverse(value)))->E.Dict.fromArray
|
||||||
|
EvRecord(record)
|
||||||
|
}
|
||||||
|
| FRValueLambda(l) => EvLambda(l)
|
||||||
|
| FRValueString(string) => EvString(string)
|
||||||
|
| FRValueVariant(string) => EvString(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
// | FRValueOption(None) => break
|
||||||
let matchWithExpressionValueArray = (inputs: array<t>, args: array<expressionValue>): option<
|
let matchWithExpressionValueArray = (inputs: array<t>, args: array<expressionValue>): option<
|
||||||
array<frValue>,
|
array<frValue>,
|
||||||
> => {
|
> => {
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
type expressionValue = ReducerInterface_ExpressionValue.expressionValue
|
|
||||||
|
|
||||||
type rec frType =
|
|
||||||
| FRTypeNumber
|
|
||||||
| FRTypeNumeric
|
|
||||||
| FRTypeDistOrNumber
|
|
||||||
| FRTypeRecord(frTypeRecord)
|
|
||||||
| FRTypeArray(array<frType>)
|
|
||||||
| FRTypeOption(frType)
|
|
||||||
and frTypeRecord = array<frTypeRecordParam>
|
|
||||||
and frTypeRecordParam = (string, frType)
|
|
||||||
|
|
||||||
type rec frValue =
|
|
||||||
| FRValueNumber(float)
|
|
||||||
| FRValueDist(DistributionTypes.genericDist)
|
|
||||||
| FRValueOption(option<frValue>)
|
|
||||||
| FRValueDistOrNumber(frValueDistOrNumber)
|
|
||||||
| FRValueRecord(frValueRecord)
|
|
||||||
and frValueRecord = array<frValueRecordParam>
|
|
||||||
and frValueRecordParam = (string, frValue)
|
|
||||||
and frValueDistOrNumber = FRValueNumber(float) | FRValueDist(DistributionTypes.genericDist)
|
|
||||||
|
|
||||||
type fnDefinition = {
|
|
||||||
name: string,
|
|
||||||
inputs: array<frType>,
|
|
||||||
run: (array<frValue>, DistributionOperation.env) => result<expressionValue, string>,
|
|
||||||
}
|
|
||||||
|
|
||||||
type function = {
|
|
||||||
name: string,
|
|
||||||
definitions: array<fnDefinition>,
|
|
||||||
}
|
|
||||||
|
|
||||||
type registry = array<function>
|
|
||||||
|
|
||||||
// Note: The function "name" is just used for documentation purposes
|
|
||||||
module Function: {
|
|
||||||
type t = function
|
|
||||||
let make: (~name: string, ~definitions: array<fnDefinition>) => t
|
|
||||||
}
|
|
||||||
|
|
||||||
module FnDefinition: {
|
|
||||||
type t = fnDefinition
|
|
||||||
let make: (
|
|
||||||
~name: string,
|
|
||||||
~inputs: array<frType>,
|
|
||||||
~run: (array<frValue>, DistributionOperation.env) => result<expressionValue, string>,
|
|
||||||
) => t
|
|
||||||
}
|
|
||||||
|
|
||||||
module Registry: {
|
|
||||||
let matchAndRun: (
|
|
||||||
~registry: registry,
|
|
||||||
~fnName: string,
|
|
||||||
~args: array<expressionValue>,
|
|
||||||
~env: QuriSquiggleLang.DistributionOperation.env,
|
|
||||||
) => option<result<expressionValue, string>>
|
|
||||||
}
|
|
|
@ -30,6 +30,13 @@ module Prepare = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let twoNumbers = (values: ts): result<(float, float), err> => {
|
||||||
|
switch values {
|
||||||
|
| [FRValueNumber(a1), FRValueNumber(a2)] => Ok(a1, a2)
|
||||||
|
| _ => Error(impossibleError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let oneDistOrNumber = (values: ts): result<frValueDistOrNumber, err> => {
|
let oneDistOrNumber = (values: ts): result<frValueDistOrNumber, err> => {
|
||||||
switch values {
|
switch values {
|
||||||
| [FRValueDistOrNumber(a1)] => Ok(a1)
|
| [FRValueDistOrNumber(a1)] => Ok(a1)
|
||||||
|
|
|
@ -3,7 +3,27 @@ open FunctionRegistry_Helpers
|
||||||
|
|
||||||
let twoArgs = E.Tuple2.toFnCall
|
let twoArgs = E.Tuple2.toFnCall
|
||||||
|
|
||||||
|
// ~run=(inputs, env) => switch(inputs->FunctionRegistry_Helpers.Prepare.ToValueArray.Record.twoArgs){
|
||||||
|
// | (FRTypeArray(records), FRValueLambdaValue(fn)) => {
|
||||||
|
// records->E.A.fmap2(r => r->FunctionRegistry_Helpers.Prepare.ToValueArray.Record.twoArgs->FunctionRegistry_Helpers.Prepare)
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
// let variant = FRTypeVariant(["Numeric", "Date"])
|
||||||
|
let recordType = FRTypeRecord([("min", FRTypeNumber), ("max", FRTypeNumber)])
|
||||||
let registry = [
|
let registry = [
|
||||||
|
Function.make(
|
||||||
|
~name="FnMake",
|
||||||
|
~definitions=[
|
||||||
|
FnDefinition.make(
|
||||||
|
~name="declareFn",
|
||||||
|
~inputs=[FRTypeRecord([("inputs", FRTypeArray(recordType))])],
|
||||||
|
~run=(inputs, _) => {
|
||||||
|
let foo = FunctionRegistry_Core.FRType.matchReverse(inputs->E.A.unsafe_get(0))
|
||||||
|
foo->Ok
|
||||||
|
}
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
Function.make(
|
Function.make(
|
||||||
~name="Normal",
|
~name="Normal",
|
||||||
~definitions=[
|
~definitions=[
|
||||||
|
|
|
@ -864,4 +864,5 @@ module Dict = {
|
||||||
type t<'a> = Js.Dict.t<'a>
|
type t<'a> = Js.Dict.t<'a>
|
||||||
let get = Js.Dict.get
|
let get = Js.Dict.get
|
||||||
let keys = Js.Dict.keys
|
let keys = Js.Dict.keys
|
||||||
|
let fromArray = Js.Dict.fromArray
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user