Back to shtanton's homepage
aboutsummaryrefslogtreecommitdiff
path: root/subex/subexast.go
diff options
context:
space:
mode:
Diffstat (limited to 'subex/subexast.go')
-rw-r--r--subex/subexast.go161
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
}