bindings and module managers
bindings are a module
This commit is contained in:
		
							parent
							
								
									2f4db3230d
								
							
						
					
					
						commit
						3ca209a53d
					
				|  | @ -2,77 +2,25 @@ module ErrorValue = Reducer_ErrorValue | |||
| module ExpressionT = Reducer_Expression_T | ||||
| module ExpressionValue = ReducerInterface.ExpressionValue | ||||
| module Result = Belt.Result | ||||
| module BindingsManager = Reducer_Manager_Bindings | ||||
| 
 | ||||
| type errorValue = Reducer_ErrorValue.errorValue | ||||
| type expression = ExpressionT.expression | ||||
| type expressionValue = ExpressionValue.expressionValue | ||||
| type externalBindings = ReducerInterface_ExpressionValue.externalBindings | ||||
| 
 | ||||
| let defaultBindings: ExpressionT.bindings = Belt.Map.String.empty | ||||
| let emptyBindings = Reducer_Manager_Bindings.emptyBindings | ||||
| 
 | ||||
| let typeAliasesKey = "_typeAliases_" | ||||
| let typeReferencesKey = "_typeReferences_" | ||||
| let typeAliasesKey = BindingsManager.typeAliasesKey | ||||
| let typeReferencesKey = BindingsManager.typeReferencesKey | ||||
| 
 | ||||
| let toExternalBindings = (bindings: ExpressionT.bindings): externalBindings => { | ||||
|   let keys = Belt.Map.String.keysToArray(bindings) | ||||
|   keys->Belt.Array.reduce(Js.Dict.empty(), (acc, key) => { | ||||
|     let value = bindings->Belt.Map.String.getExn(key) | ||||
|     Js.Dict.set(acc, key, value) | ||||
|     acc | ||||
|   }) | ||||
| } | ||||
| let toExternalBindings = (bindings: ExpressionT.bindings): externalBindings => | ||||
|   BindingsManager.toRecord(bindings) | ||||
| 
 | ||||
| let fromExternalBindings_ = (externalBindings: externalBindings): ExpressionT.bindings => { | ||||
|   let keys = Js.Dict.keys(externalBindings) | ||||
|   keys->Belt.Array.reduce(defaultBindings, (acc, key) => { | ||||
|     let value = Js.Dict.unsafeGet(externalBindings, key) | ||||
|     acc->Belt.Map.String.set(key, value) | ||||
|   }) | ||||
| } | ||||
| let fromExternalBindings = (externalBindings: externalBindings): ExpressionT.bindings => | ||||
|   BindingsManager.fromRecord(externalBindings) | ||||
| 
 | ||||
| let fromExternalBindings = (externalBindings: externalBindings): ExpressionT.bindings => { | ||||
|   // TODO: This code will be removed in the future when maps are used instead of records. Please don't mind this function for now. | ||||
| 
 | ||||
|   let internalBindings0 = fromExternalBindings_(externalBindings) | ||||
| 
 | ||||
|   let oExistingTypeAliases = Belt.Map.String.get(internalBindings0, typeAliasesKey) | ||||
|   let internalBindings1 = Belt.Option.mapWithDefault( | ||||
|     oExistingTypeAliases, | ||||
|     internalBindings0, | ||||
|     existingTypeAliases => { | ||||
|       let newTypeAliases = switch existingTypeAliases { | ||||
|       | EvRecord(actualTypeAliases) => | ||||
|         actualTypeAliases->fromExternalBindings_->toExternalBindings->ExpressionValue.EvRecord | ||||
|       | _ => existingTypeAliases | ||||
|       } | ||||
|       Belt.Map.String.set(internalBindings0, typeAliasesKey, newTypeAliases) | ||||
|     }, | ||||
|   ) | ||||
| 
 | ||||
|   let oExistingTypeReferences = Belt.Map.String.get(internalBindings1, typeReferencesKey) | ||||
|   let internalBindings2 = Belt.Option.mapWithDefault( | ||||
|     oExistingTypeReferences, | ||||
|     internalBindings1, | ||||
|     existingTypeReferences => { | ||||
|       let newTypeReferences = switch existingTypeReferences { | ||||
|       | EvRecord(actualTypeReferences) => | ||||
|         actualTypeReferences->fromExternalBindings_->toExternalBindings->ExpressionValue.EvRecord | ||||
|       | _ => existingTypeReferences | ||||
|       } | ||||
|       Belt.Map.String.set(internalBindings0, typeReferencesKey, newTypeReferences) | ||||
|     }, | ||||
|   ) | ||||
| 
 | ||||
|   internalBindings2 | ||||
| } | ||||
| 
 | ||||
| let fromValue = (aValue: expressionValue) => | ||||
|   switch aValue { | ||||
|   | EvRecord(externalBindings) => fromExternalBindings(externalBindings) | ||||
|   | _ => defaultBindings | ||||
|   } | ||||
| 
 | ||||
| let externalFromArray = anArray => Js.Dict.fromArray(anArray) | ||||
| let fromValue = (aValue: expressionValue) => BindingsManager.fromExpressionValue(aValue) | ||||
| 
 | ||||
| let isMacroName = (fName: string): bool => fName->Js.String2.startsWith("$$") | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,12 @@ | |||
| include Reducer_Manager_Module | ||||
| 
 | ||||
| open ReducerInterface_ExpressionValue | ||||
| 
 | ||||
| let emptyBindings = emptyModule | ||||
| 
 | ||||
| let toExpressionValue = (container: t): expressionValue => EvRecord(toRecord(container)) | ||||
| let fromExpressionValue = (aValue: expressionValue): t => | ||||
|   switch aValue { | ||||
|   | EvRecord(r) => fromRecord(r) | ||||
|   | _ => emptyBindings | ||||
|   } | ||||
|  | @ -0,0 +1,29 @@ | |||
| module ExpressionT = Reducer_Expression_T | ||||
| open ReducerInterface_ExpressionValue | ||||
| let expressionValueToString = toString | ||||
| 
 | ||||
| type t = ExpressionT.bindings | ||||
| 
 | ||||
| let typeAliasesKey = "_typeAliases_" | ||||
| let typeReferencesKey = "_typeReferences_" | ||||
| 
 | ||||
| let define = (container: t, identifier: string, ev: expressionValue): t => | ||||
|   Belt.Map.String.set(container, identifier, ev) // TODO build lambda for polymorphic functions here | ||||
| 
 | ||||
| let defineNumber = (container: t, identifier: string, value: float): t => | ||||
|   container->define(identifier, EvNumber(value)) | ||||
| 
 | ||||
| let cloneRecord = (r: record): record => r->Js.Dict.entries->Js.Dict.fromArray | ||||
| let fromRecord = (r: record): t => Js.Dict.entries(r)->Belt.Map.String.fromArray | ||||
| let toRecord = (container: t): record => Belt.Map.String.toArray(container)->Js.Dict.fromArray | ||||
| 
 | ||||
| let emptyModule: t = Belt.Map.String.empty | ||||
| 
 | ||||
| let toExpressionValue = (container: t): expressionValue => EvModule(toRecord(container)) | ||||
| let fromExpressionValue = (aValue: expressionValue): t => | ||||
|   switch aValue { | ||||
|   | EvModule(r) => fromRecord(r) | ||||
|   | _ => emptyModule | ||||
|   } | ||||
| 
 | ||||
| let toString = (container: t): string => container->toRecord->EvRecord->expressionValueToString | ||||
|  | @ -0,0 +1 @@ | |||
| 
 | ||||
|  | @ -0,0 +1 @@ | |||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user