Refactored match() code
This commit is contained in:
		
							parent
							
								
									e0f4809ad7
								
							
						
					
					
						commit
						f30de20c8d
					
				|  | @ -1,7 +1,7 @@ | ||||||
| type expressionValue = ReducerInterface_ExpressionValue.expressionValue | type expressionValue = ReducerInterface_ExpressionValue.expressionValue | ||||||
| 
 | 
 | ||||||
| type rec itype = | type rec itype = | ||||||
|   I_Number | I_DistOrNumber | I_Record(iRecord) | I_Array(array<itype>) | I_Option(itype) |   I_Number | I_Numeric | I_DistOrNumber | I_Record(iRecord) | I_Array(array<itype>) | I_Option(itype) | ||||||
| and iRecord = array<iRecordParam> | and iRecord = array<iRecordParam> | ||||||
| and iRecordParam = (string, itype) | and iRecordParam = (string, itype) | ||||||
| 
 | 
 | ||||||
|  | @ -28,6 +28,8 @@ let rec matchInput = (input: itype, r: expressionValue): option<value> => | ||||||
|   | (I_Number, EvNumber(f)) => Some(Number(f)) |   | (I_Number, EvNumber(f)) => Some(Number(f)) | ||||||
|   | (I_DistOrNumber, EvNumber(f)) => Some(DistOrNumber(Number(f))) |   | (I_DistOrNumber, EvNumber(f)) => Some(DistOrNumber(Number(f))) | ||||||
|   | (I_DistOrNumber, EvDistribution(f)) => Some(DistOrNumber(Dist(f))) |   | (I_DistOrNumber, EvDistribution(f)) => Some(DistOrNumber(Dist(f))) | ||||||
|  |   | (I_Numeric, EvNumber(f)) => Some(Number(f)) | ||||||
|  |   | (I_Numeric, EvDistribution(Symbolic(#Float(f)))) => Some((Number(f))) | ||||||
|   | (I_Option(v), _) => Some(Option(matchInput(v, r))) |   | (I_Option(v), _) => Some(Option(matchInput(v, r))) | ||||||
|   | (I_Record(recordParams), EvRecord(record)) => { |   | (I_Record(recordParams), EvRecord(record)) => { | ||||||
|       let getAndMatch = (name, input) => |       let getAndMatch = (name, input) => | ||||||
|  | @ -80,34 +82,10 @@ let matchSingle = (f: fnDefinition, fnName: string, args: array<expressionValue> | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| let getByOpen = (a,op,bin) => switch(E.A.getBy(a, r => bin(op(r)))) { |  | ||||||
|   | Some(r) => Some(op(r)) |  | ||||||
|   | None => None |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| let match = (f: function, fnName: string, args: array<expressionValue>) => { | let match = (f: function, fnName: string, args: array<expressionValue>) => { | ||||||
|   let matchedDefinition = E.A.getBy(f.definitions, r => isFullMatch(matchSingle(r, fnName, args))) |   let matchedDefinition = () => | ||||||
|   switch matchedDefinition { |     E.A.getByOpen(f.definitions, r => matchSingle(r, fnName, args), isFullMatch) | ||||||
|   | Some(matchedDefinition) => { |   let getMatchedNameOnlyDefinition = () => | ||||||
|       let match = matchSingle(matchedDefinition, fnName, args) |     E.A.getByOpen(f.definitions, r => matchSingle(r, fnName, args), isNameMatchOnly) | ||||||
|       switch match { |   E.A.O.firstSomeFnWithDefault([matchedDefinition, getMatchedNameOnlyDefinition], DifferentName) | ||||||
|       | Match(a, b) => Ok(Match(a, b)) |  | ||||||
|       | _ => Error("Should be Impossible") |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   | None => { |  | ||||||
|       let matchedNameDefinition = E.A.getBy(f.definitions, r => |  | ||||||
|         isNameMatchOnly(matchSingle(r, fnName, args)) |  | ||||||
|       ) |  | ||||||
|       let foo = switch matchedNameDefinition { |  | ||||||
|       | Some(matchedNameDefinition) => |  | ||||||
|         switch matchSingle(matchedNameDefinition, fnName, args) { |  | ||||||
|         | SameNameDifferentArguments(r) => Ok(SameNameDifferentArguments(r)) |  | ||||||
|         | _ => Error("Should be Impossible") |  | ||||||
|         } |  | ||||||
|       | _ => Ok(DifferentName) |  | ||||||
|       } |  | ||||||
|       foo |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -549,6 +549,12 @@ module A = { | ||||||
|       |> (x => Ok(x)) |       |> (x => Ok(x)) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |   let getByOpen = (a, op, bin) => | ||||||
|  |     switch getBy(a, r => bin(op(r))) { | ||||||
|  |     | Some(r) => Some(op(r)) | ||||||
|  |     | None => None | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|   let tail = Belt.Array.sliceToEnd(_, 1) |   let tail = Belt.Array.sliceToEnd(_, 1) | ||||||
| 
 | 
 | ||||||
|   let zip = Belt.Array.zip |   let zip = Belt.Array.zip | ||||||
|  | @ -633,6 +639,11 @@ module A = { | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     let firstSome = x => Belt.Array.getBy(x, O.isSome) |     let firstSome = x => Belt.Array.getBy(x, O.isSome) | ||||||
|  | 
 | ||||||
|  |     let firstSomeFn = (r: array<unit => option<'a>>): option<'a> => | ||||||
|  |       O.flatten(getByOpen(r, l => l(), O.isSome)) | ||||||
|  | 
 | ||||||
|  |     let firstSomeFnWithDefault = (r, default) => firstSomeFn(r)->O2.default(default) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   module R = { |   module R = { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user