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

160 lines
4.6 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-24 23:09:51 +00:00
@genType.opaque
type internalCode = Object
2022-04-11 03:16:31 +00:00
@genType
2022-06-24 10:15:38 +00:00
type rec externalExpressionValue =
| EvArray(array<externalExpressionValue>)
| EvArrayString(array<string>)
2022-03-29 09:09:59 +00:00
| EvBool(bool)
| EvCall(string) // External function call
| EvDistribution(DistributionTypes.genericDist)
2022-05-02 10:10:31 +00:00
| EvLambda(lambdaValue)
2022-03-29 09:09:59 +00:00
| EvNumber(float)
| EvRecord(record)
2022-03-29 09:09:59 +00:00
| EvString(string)
| EvSymbol(string)
2022-05-22 22:37:07 +00:00
| EvDate(Js.Date.t)
| EvTimeDuration(float)
2022-05-24 21:02:27 +00:00
| EvDeclaration(lambdaDeclaration)
| EvTypeIdentifier(string)
2022-06-09 13:27:37 +00:00
| EvModule(record)
2022-06-24 10:15:38 +00:00
and record = Js.Dict.t<externalExpressionValue>
2022-05-02 10:10:31 +00:00
and externalBindings = record
and lambdaValue = {
parameters: array<string>,
context: externalBindings,
body: internalCode,
}
2022-05-24 21:02:27 +00:00
and lambdaDeclaration = Declaration.declaration<lambdaValue>
2022-03-29 09:09:59 +00:00
2022-06-24 10:15:38 +00:00
@genType
type t = externalExpressionValue
type functionCall = (string, array<externalExpressionValue>)
2022-03-29 09:09:59 +00:00
2022-03-30 10:53:36 +00:00
let rec toString = aValue =>
2022-03-29 09:09:59 +00:00
switch aValue {
| EvArray(anArray) => {
let args = anArray->Js.Array2.map(each => toString(each))->Js.Array2.toString
`[${args}]`
}
| EvArrayString(anArray) => {
let args = anArray->Js.Array2.toString
`[${args}]`
}
2022-03-29 09:09:59 +00:00
| EvBool(aBool) => Js.String.make(aBool)
| EvCall(fName) => `:${fName}`
2022-05-02 10:55:28 +00:00
| EvLambda(lambdaValue) => `lambda(${Js.Array2.toString(lambdaValue.parameters)}=>internal code)`
2022-03-29 09:09:59 +00:00
| EvNumber(aNumber) => Js.String.make(aNumber)
| EvString(aString) => `'${aString}'`
| EvSymbol(aString) => `:${aString}`
| EvRecord(aRecord) => aRecord->toStringRecord
| EvDistribution(dist) => GenericDist.toString(dist)
| EvDate(date) => DateTime.Date.toString(date)
| EvTimeDuration(t) => DateTime.Duration.toString(t)
2022-05-27 11:58:43 +00:00
| EvDeclaration(d) => Declaration.toString(d, r => toString(EvLambda(r)))
| EvTypeIdentifier(id) => `#${id}`
2022-06-09 13:27:37 +00:00
| EvModule(m) => `@${m->toStringRecord}`
2022-03-29 09:09:59 +00:00
}
and toStringRecord = aRecord => {
let pairs =
aRecord
->Js.Dict.entries
->Js.Array2.map(((eachKey, eachValue)) => `${eachKey}: ${toString(eachValue)}`)
->Js.Array2.toString
`{${pairs}}`
}
2022-03-29 09:09:59 +00:00
2022-06-24 10:15:38 +00:00
let argsToString = (args: array<externalExpressionValue>): string => {
args->Js.Array2.map(arg => arg->toString)->Js.Array2.toString
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
}
@genType
type environment = DistributionOperation.env
@genType
let defaultEnvironment: environment = DistributionOperation.defaultEnv
2022-05-22 17:02:20 +00:00
type expressionValueType =
| EvtArray
| EvtArrayString
| EvtBool
| EvtCall
| EvtDistribution
| EvtLambda
| EvtNumber
| EvtRecord
| EvtString
| EvtSymbol
2022-05-22 22:37:07 +00:00
| EvtDate
| EvtTimeDuration
2022-05-27 11:58:43 +00:00
| EvtDeclaration
| EvtTypeIdentifier
2022-06-09 13:27:37 +00:00
| EvtModule
2022-05-22 17:02:20 +00:00
type functionCallSignature = CallSignature(string, array<expressionValueType>)
type functionDefinitionSignature =
2022-05-22 17:02:20 +00:00
FunctionDefinitionSignature(functionCallSignature, expressionValueType)
let valueToValueType = value =>
switch value {
| EvArray(_) => EvtArray
| EvArrayString(_) => EvtArrayString
| EvBool(_) => EvtBool
| EvCall(_) => EvtCall
| EvDistribution(_) => EvtDistribution
| EvLambda(_) => EvtLambda
| EvNumber(_) => EvtNumber
| EvRecord(_) => EvtRecord
| EvString(_) => EvtString
| EvSymbol(_) => EvtSymbol
2022-05-22 22:37:07 +00:00
| EvDate(_) => EvtDate
| EvTimeDuration(_) => EvtTimeDuration
2022-05-27 11:58:43 +00:00
| EvDeclaration(_) => EvtDeclaration
| EvTypeIdentifier(_) => EvtTypeIdentifier
2022-06-09 13:27:37 +00:00
| EvModule(_) => EvtModule
}
let functionCallToCallSignature = (functionCall: functionCall): functionCallSignature => {
let (fn, args) = functionCall
CallSignature(fn, args->Js.Array2.map(valueToValueType))
}
2022-05-22 17:02:20 +00:00
let valueTypeToString = (valueType: expressionValueType): string =>
switch valueType {
| EvtArray => `Array`
| EvtArrayString => `ArrayString`
| EvtBool => `Bool`
| EvtCall => `Call`
| EvtDistribution => `Distribution`
| EvtLambda => `Lambda`
| EvtNumber => `Number`
| EvtRecord => `Record`
| EvtString => `String`
| EvtSymbol => `Symbol`
2022-05-22 22:37:07 +00:00
| EvtDate => `Date`
| EvtTimeDuration => `Duration`
2022-05-27 11:58:43 +00:00
| EvtDeclaration => `Declaration`
| EvtTypeIdentifier => `TypeIdentifier`
2022-06-09 13:27:37 +00:00
| EvtModule => `Module`
}
let functionCallSignatureToString = (functionCallSignature: functionCallSignature): string => {
let CallSignature(fn, args) = functionCallSignature
`${fn}(${args->Js.Array2.map(valueTypeToString)->Js.Array2.toString})`
}