squiggle/packages/squiggle-lang/src/rescript/ReducerInterface/ReducerInterface_ExpressionValue.res

71 lines
2.2 KiB
Plaintext
Raw Normal View History

2022-03-29 09:09:59 +00:00
/*
Irreducible values. Reducer does not know about those. Only used for external calls
This is a configuration to to make external calls of those types
*/
2022-03-30 10:53:36 +00:00
module Extra_Array = Reducer_Extra_Array
2022-03-29 09:09:59 +00:00
module ErrorValue = Reducer_ErrorValue
2022-04-11 03:16:31 +00:00
@genType
2022-03-29 09:09:59 +00:00
type rec expressionValue =
| EvArray(array<expressionValue>)
2022-03-29 09:09:59 +00:00
| EvBool(bool)
| EvCall(string) // External function call
| EvDistribution(GenericDist_Types.genericDist)
2022-03-29 09:09:59 +00:00
| EvNumber(float)
| EvRecord(Js.Dict.t<expressionValue>)
2022-03-29 09:09:59 +00:00
| EvString(string)
| EvSymbol(string)
type functionCall = (string, array<expressionValue>)
2022-03-30 10:53:36 +00:00
let rec toString = aValue =>
2022-03-29 09:09:59 +00:00
switch aValue {
| EvBool(aBool) => Js.String.make(aBool)
| EvCall(fName) => `:${fName}`
2022-03-29 09:09:59 +00:00
| EvNumber(aNumber) => Js.String.make(aNumber)
| EvString(aString) => `'${aString}'`
| EvSymbol(aString) => `:${aString}`
| EvArray(anArray) => {
let args =
2022-04-05 18:54:51 +00:00
anArray
->Belt.Array.map(each => toString(each))
->Extra_Array.interperse(", ")
->Js.String.concatMany("")
2022-03-29 09:09:59 +00:00
`[${args}]`
}
| EvRecord(aRecord) => {
let pairs =
aRecord
->Js.Dict.entries
2022-03-30 10:53:36 +00:00
->Belt.Array.map(((eachKey, eachValue)) => `${eachKey}: ${toString(eachValue)}`)
->Extra_Array.interperse(", ")
2022-03-29 09:09:59 +00:00
->Js.String.concatMany("")
`{${pairs}}`
}
| EvDistribution(dist) => GenericDist.toString(dist)
2022-03-29 09:09:59 +00:00
}
2022-03-30 10:53:36 +00:00
let toStringWithType = aValue =>
2022-03-29 09:09:59 +00:00
switch aValue {
2022-03-30 10:53:36 +00:00
| EvBool(_) => `Bool::${toString(aValue)}`
| EvCall(_) => `Call::${toString(aValue)}`
2022-03-30 10:53:36 +00:00
| EvNumber(_) => `Number::${toString(aValue)}`
| EvString(_) => `String::${toString(aValue)}`
| EvSymbol(_) => `Symbol::${toString(aValue)}`
| EvArray(_) => `Array::${toString(aValue)}`
| EvRecord(_) => `Record::${toString(aValue)}`
2022-04-01 00:28:48 +00:00
| EvDistribution(_) => `Distribution::${toString(aValue)}`
2022-03-29 09:09:59 +00:00
}
2022-03-30 10:53:36 +00:00
let argsToString = (args: array<expressionValue>): string => {
args->Belt.Array.map(arg => arg->toString)->Extra_Array.interperse(", ")->Js.String.concatMany("")
2022-03-29 09:09:59 +00:00
}
2022-03-30 10:53:36 +00:00
let toStringFunctionCall = ((fn, args)): string => `${fn}(${argsToString(args)})`
2022-03-29 09:09:59 +00:00
2022-03-30 10:53:36 +00:00
let toStringResult = x =>
2022-03-29 09:09:59 +00:00
switch x {
2022-03-30 10:53:36 +00:00
| Ok(a) => `Ok(${toString(a)})`
| Error(m) => `Error(${ErrorValue.errorToString(m)})`
2022-03-29 09:09:59 +00:00
}