48 lines
1.3 KiB
Plaintext
48 lines
1.3 KiB
Plaintext
/*
|
|
Bindings describe the entire set of bound variables accessible to the squiggle code.
|
|
Bindings objects are stored as linked lists of scopes:
|
|
{ localX: ..., localY: ... } <- { globalZ: ..., ... } <- { importedT: ..., ... } <- { stdlibFunction: ..., ... }
|
|
*/
|
|
|
|
type t = Reducer_T.bindings
|
|
|
|
let rec get = ({namespace, parent}: t, id: string) => {
|
|
switch namespace->Reducer_Namespace.get(id) {
|
|
| Some(v) => Some(v)
|
|
| None =>
|
|
switch parent {
|
|
| Some(p) => p->get(id)
|
|
| None => None
|
|
}
|
|
}
|
|
}
|
|
|
|
let set = ({namespace} as bindings: t, id: string, value): t => {
|
|
{
|
|
...bindings,
|
|
namespace: namespace->Reducer_Namespace.set(id, value),
|
|
}
|
|
}
|
|
|
|
let rec toString = ({namespace, parent}: t) => {
|
|
let pairs = namespace->Reducer_Namespace.toString
|
|
|
|
switch parent {
|
|
| Some(p) => `{${pairs}} / ${toString(p)}`
|
|
| None => `{${pairs}}`
|
|
}
|
|
}
|
|
|
|
let extend = (bindings: t): t => {namespace: Reducer_Namespace.make(), parent: bindings->Some}
|
|
|
|
let make = (): t => {namespace: Reducer_Namespace.make(), parent: None}
|
|
|
|
let removeResult = ({namespace} as bindings: t): t => {
|
|
...bindings,
|
|
namespace: namespace->Belt.Map.String.remove("__result__"),
|
|
}
|
|
|
|
let locals = ({namespace}: t): Reducer_T.namespace => namespace
|
|
|
|
let fromNamespace = (namespace: Reducer_Namespace.t): t => {namespace: namespace, parent: None}
|