...
1 package exp
2
3 type (
4 expressionList struct {
5 operator ExpressionListType
6 expressions []Expression
7 }
8 )
9
10
11
12 func NewExpressionList(operator ExpressionListType, expressions ...Expression) ExpressionList {
13 el := expressionList{operator: operator}
14 exps := make([]Expression, 0, len(el.expressions))
15 for _, e := range expressions {
16 switch t := e.(type) {
17 case ExpressionList:
18 if !t.IsEmpty() {
19 exps = append(exps, e)
20 }
21 case Ex:
22 if len(t) > 0 {
23 exps = append(exps, e)
24 }
25 case ExOr:
26 if len(t) > 0 {
27 exps = append(exps, e)
28 }
29 default:
30 exps = append(exps, e)
31 }
32 }
33 el.expressions = exps
34 return el
35 }
36
37 func (el expressionList) Clone() Expression {
38 newExps := make([]Expression, 0, len(el.expressions))
39 for _, exp := range el.expressions {
40 newExps = append(newExps, exp.Clone())
41 }
42 return expressionList{operator: el.operator, expressions: newExps}
43 }
44
45 func (el expressionList) Expression() Expression {
46 return el
47 }
48
49 func (el expressionList) IsEmpty() bool {
50 return len(el.expressions) == 0
51 }
52
53 func (el expressionList) Type() ExpressionListType {
54 return el.operator
55 }
56
57 func (el expressionList) Expressions() []Expression {
58 return el.expressions
59 }
60
61 func (el expressionList) Append(expressions ...Expression) ExpressionList {
62 exps := make([]Expression, 0, len(el.expressions)+len(expressions))
63 exps = append(exps, el.expressions...)
64 exps = append(exps, expressions...)
65 return NewExpressionList(el.operator, exps...)
66 }
67
View as plain text