diff options
Diffstat (limited to 'subex/subexast.go')
| -rw-r--r-- | subex/subexast.go | 161 | 
1 files changed, 15 insertions, 146 deletions
| diff --git a/subex/subexast.go b/subex/subexast.go index 89949ba..01a5e0d 100644 --- a/subex/subexast.go +++ b/subex/subexast.go @@ -303,152 +303,6 @@ type SubexASTNumberFilter interface {  	compute() float64  } -type SubexASTNumberFilterLiteral struct { -	value float64 -} -func (ast SubexASTNumberFilterLiteral) compile() numberFilter { -	return equalNumberFilter {ast.value} -} -func (ast SubexASTNumberFilterLiteral) computable() bool { -	return true -} -func (ast SubexASTNumberFilterLiteral) compute() float64 { -	return ast.value -} - -type NumberSubset int -const ( -	NumberSubsetReal NumberSubset = iota -	NumberSubsetInteger -	NumberSubsetPositiveInteger -	NumberSubsetZeroToOne -	NumberSubsetPositiveReal -	NumberSubsetNonNegativeReal -) - -type SubexASTNumberFilterSubset struct { -	subset NumberSubset -} -func (ast SubexASTNumberFilterSubset) compile() numberFilter { -	switch ast.subset { -	case NumberSubsetReal: -		return anyNumberFilter{} -	case NumberSubsetInteger: -		return divisibleNumberFilter { -			divisor: 1.0, -			target: 0.0, -		} -	case NumberSubsetPositiveInteger: -		return andNumberFilter { -			lhs: divisibleNumberFilter { -				divisor: 1.0, -				target: 0.0, -			}, -			rhs: greaterThanNumberFilter {0.0}, -		} -	case NumberSubsetZeroToOne: -		return andNumberFilter { -			lhs: notNumberFilter { -				lessThanNumberFilter {0}, -			}, -			rhs: notNumberFilter { -				greaterThanNumberFilter {1}, -			}, -		} -	case NumberSubsetPositiveReal: -		return greaterThanNumberFilter {0} -	case NumberSubsetNonNegativeReal: -		return notNumberFilter { -			lessThanNumberFilter {0}, -		} -	default: -		panic("Invalid NumberSubset") -	} -} -func (ast SubexASTNumberFilterSubset) computable() bool { -	return false -} -func (ast SubexASTNumberFilterSubset) compute() float64 { -	panic("Tried to compute uncomputable") -} - -type SubexASTNumberFilterCount struct { -	count int -} -func (ast SubexASTNumberFilterCount) compile() numberFilter { -	return andNumberFilter { -		lhs: andNumberFilter { -			lhs: notNumberFilter { -				lessThanNumberFilter {0.0}, -			}, -			rhs: lessThanNumberFilter {float64(ast.count)}, -		}, -		rhs: divisibleNumberFilter { -			divisor: 1.0, -			target: 0.0, -		}, -	} -} -func (ast SubexASTNumberFilterCount) computable() bool { -	return false -} -func (ast SubexASTNumberFilterCount) compute() float64 { -	panic("Tried to compute uncomputable") -} - -type SubexASTNumberFilterAdd struct { -	lhs, rhs SubexASTNumberFilter -} -func (ast SubexASTNumberFilterAdd) compile() numberFilter { -	if ast.lhs.computable() { -		return ast.rhs.compile().add(ast.lhs.compute()) -	} else { -		return ast.lhs.compile().add(ast.rhs.compute()) -	} -} -func (ast SubexASTNumberFilterAdd) computable() bool { -	return ast.lhs.computable() && ast.rhs.computable() -} -func (ast SubexASTNumberFilterAdd) compute() float64 { -	return ast.lhs.compute() + ast.rhs.compute() -} -func (ast SubexASTNumberFilterAdd) String() string { -	return fmt.Sprintf("(%v + %v)", ast.lhs, ast.rhs) -} - -type SubexASTNumberFilterMultiply struct { -	lhs, rhs SubexASTNumberFilter -} -func (ast SubexASTNumberFilterMultiply) compile() numberFilter { -	if ast.lhs.computable() { -		return ast.rhs.compile().multiply(ast.lhs.compute()) -	} else { -		return ast.lhs.compile().multiply(ast.rhs.compute()) -	} -} -func (ast SubexASTNumberFilterMultiply) computable() bool { -	return ast.lhs.computable() && ast.rhs.computable() -} -func (ast SubexASTNumberFilterMultiply) compute() float64 { -	return ast.lhs.compute() * ast.rhs.compute() -} -func (ast SubexASTNumberFilterMultiply) String() string { -	return fmt.Sprintf("(%v * %v)", ast.lhs, ast.rhs) -} - -type SubexASTCopyNumberFilter struct { -	filter SubexASTNumberFilter -} -func (ast SubexASTCopyNumberFilter) compileWith(next SubexState, slotMap *SlotMap, inType Type, outType Type) SubexState { -	if inType != ValueType || outType != ValueType { -		panic("Invalid types for SubexASTCopyNumberFilter") -	} -	return &SubexCopyNumberState { -		next: next, -		filter: ast.filter.compile(), -	} -} -  // Read in a null, bool, number, string or empty array or map and output it unchanged  type SubexASTCopyAnySimpleValue struct {}  func (ast SubexASTCopyAnySimpleValue) compileWith(next SubexState, slotMap *SlotMap, inType Type, outType Type) SubexState { @@ -521,6 +375,21 @@ func (ast SubexASTOutput) String() string {  }  */ +type SubexASTNumberMapping struct { +	Range NumberExpr +	Replace []NumberExpr +} +func (ast SubexASTNumberMapping) compileWith(next SubexState, slotMap *SlotMap, inType Type, outType Type) SubexState { +	if inType != ValueType || outType != ValueType { +		panic("Invalid in/out type for SubexASTNumberMapping") +	} +	return &SubexNumberMappingState { +		Range: ast.Range, +		Replace: ast.Replace, +		next: next, +	} +} +  type SubexASTOutputValueLiteral struct {  	literal walk.Scalar  } | 
