Added simpe README and resi for FunctionRegistry
This commit is contained in:
		
							parent
							
								
									3531005a2b
								
							
						
					
					
						commit
						c200259c79
					
				|  | @ -279,12 +279,12 @@ module Registry = { | ||||||
|   called. However, for now, we could just call the registry last. |   called. However, for now, we could just call the registry last. | ||||||
|  */ |  */ | ||||||
|   let matchAndRun = ( |   let matchAndRun = ( | ||||||
|     r: registry, |     ~registry: registry, | ||||||
|     fnName: string, |     ~fnName: string, | ||||||
|     args: array<expressionValue>, |     ~args: array<expressionValue>, | ||||||
|     env: DistributionOperation.env, |     ~env: DistributionOperation.env, | ||||||
|   ) => { |   ) => { | ||||||
|     let matchToDef = m => Matcher.Registry.matchToDef(r, m) |     let matchToDef = m => Matcher.Registry.matchToDef(registry, m) | ||||||
|     let showNameMatchDefinitions = matches => { |     let showNameMatchDefinitions = matches => { | ||||||
|       let defs = |       let defs = | ||||||
|         matches |         matches | ||||||
|  | @ -295,7 +295,7 @@ module Registry = { | ||||||
|         ->E.A2.joinWith("; ") |         ->E.A2.joinWith("; ") | ||||||
|       `There are function matches for ${fnName}(), but with different arguments: ${defs}` |       `There are function matches for ${fnName}(), but with different arguments: ${defs}` | ||||||
|     } |     } | ||||||
|     switch Matcher.Registry.findMatches(r, fnName, args) { |     switch Matcher.Registry.findMatches(registry, fnName, args) { | ||||||
|     | Matcher.Match.FullMatch(match) => match->matchToDef->E.O2.fmap(FnDefinition.run(_, args, env)) |     | Matcher.Match.FullMatch(match) => match->matchToDef->E.O2.fmap(FnDefinition.run(_, args, env)) | ||||||
|     | SameNameDifferentArguments(m) => Some(Error(showNameMatchDefinitions(m))) |     | SameNameDifferentArguments(m) => Some(Error(showNameMatchDefinitions(m))) | ||||||
|     | _ => None |     | _ => None | ||||||
|  |  | ||||||
|  | @ -0,0 +1,59 @@ | ||||||
|  | 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>> | ||||||
|  | } | ||||||
|  | @ -117,4 +117,5 @@ module TwoArgDist = { | ||||||
|       ~run=(inputs, env) => inputs->Prepare.ToValueTuple.Record.twoDistOrNumber->process(~fn, ~env), |       ~run=(inputs, env) => inputs->Prepare.ToValueTuple.Record.twoDistOrNumber->process(~fn, ~env), | ||||||
|     ) |     ) | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,46 @@ | ||||||
|  | # Function Registry | ||||||
|  | 
 | ||||||
|  | The function registry is a library for organizing function definitions. | ||||||
|  | 
 | ||||||
|  | The main interface is fairly constrained. Basically, write functions like the following, and add them to a big array. | ||||||
|  | 
 | ||||||
|  | ```rescript | ||||||
|  |   Function.make( | ||||||
|  |     ~name="Normal", | ||||||
|  |     ~definitions=[ | ||||||
|  |         FnDefinition.make( | ||||||
|  |             ~name="Normal", | ||||||
|  |             ~definitions=[ | ||||||
|  |                 FnDefinition.make(~name="normal", ~inputs=[FRTypeDistOrNumber, FRTypeDistOrNumber], ~run=( | ||||||
|  |                     inputs, | ||||||
|  |                     env, | ||||||
|  |                 ) => | ||||||
|  |                     inputs | ||||||
|  |                     ->Prepare.ToValueTuple.twoDistOrNumber | ||||||
|  |                     ->E.R.bind( | ||||||
|  |                     Process.twoDistsOrNumbersToDistUsingSymbolicDist( | ||||||
|  |                         ~fn=E.Tuple2.toFnCall(SymbolicDist.Normal.make), | ||||||
|  |                         ~env, | ||||||
|  |                         ~values=_, | ||||||
|  |                     ), | ||||||
|  |                     ) | ||||||
|  |                     ->E.R2.fmap(Wrappers.evDistribution) | ||||||
|  |                 ), | ||||||
|  |             ], | ||||||
|  |         ) | ||||||
|  |     ], | ||||||
|  |   ) | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | The Function name is just there for future documentation. The function defintions | ||||||
|  | 
 | ||||||
|  | ## Key Files | ||||||
|  | 
 | ||||||
|  | **FunctionRegistry_Core** | ||||||
|  | Key types, internal functionality, and a ``Registry`` module with a ``matchAndRun`` function to call function definitions.  | ||||||
|  | 
 | ||||||
|  | **FunctionRegistry_Library** | ||||||
|  | A list of all the Functions defined in the Function Registry. | ||||||
|  | 
 | ||||||
|  | **FunctionRegistry_Helpers** | ||||||
|  | A list of helper functions for the FunctionRegistry_Library. | ||||||
|  | @ -361,10 +361,10 @@ let genericOutputToReducerValue = (o: DistributionOperation.outputType): result< | ||||||
|   | GenDistError(err) => Error(REDistributionError(err)) |   | GenDistError(err) => Error(REDistributionError(err)) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| let registered = FunctionRegistry_Library.allFunctions | let registry = FunctionRegistry_Library.allFunctions | ||||||
| 
 | 
 | ||||||
| let tryRegistry = ((fnName, args): ExpressionValue.functionCall, env) => { | let tryRegistry = ((fnName, args): ExpressionValue.functionCall, env) => { | ||||||
|   FunctionRegistry_Core.Registry.matchAndRun(registered, fnName, args, env)->E.O2.fmap( |   FunctionRegistry_Core.Registry.matchAndRun(~registry, ~fnName, ~args, ~env)->E.O2.fmap( | ||||||
|     E.R2.errMap(_, s => Reducer_ErrorValue.RETodo(s)), |     E.R2.errMap(_, s => Reducer_ErrorValue.RETodo(s)), | ||||||
|   ) |   ) | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user