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 } |