-
Notifications
You must be signed in to change notification settings - Fork 0
/
conditionals.go
82 lines (70 loc) · 1.62 KB
/
conditionals.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package v1
type Predicate func(o Option) bool
type Conditional struct {
predicate Predicate
ifBranch Transformer
ifElsePredicates []Predicate
ifElseBranches []Transformer
elseBranch Transformer
}
func Identity(option Option) Option {
return option
}
func HasNoError(o Option) bool {
return o.err == nil
}
func HasError(o Option) bool {
return o.err != nil
}
func ClearError(o Option) Option {
return Option{value: o.value}
}
func If(predicate Predicate, ifBranch Transformer) Conditional {
if ifBranch == nil {
ifBranch = Identity
}
return Conditional{
predicate: predicate,
ifBranch: ifBranch,
}
}
func (c Conditional) Elif(p Predicate, i Transformer) Conditional {
var (
dstTransformers []Transformer
dstPredicates []Predicate
)
copy(dstPredicates, c.ifElsePredicates)
copy(dstTransformers, c.ifElseBranches)
dstPredicates = append(dstPredicates, p)
dstTransformers = append(dstTransformers, i)
return Conditional{
predicate: c.predicate,
ifBranch: c.ifBranch,
ifElsePredicates: dstPredicates,
ifElseBranches: dstTransformers,
elseBranch: c.elseBranch,
}
}
func (c Conditional) Else(t Transformer) Conditional {
return Conditional{
predicate: c.predicate,
ifBranch: c.ifBranch,
ifElsePredicates: c.ifElsePredicates,
ifElseBranches: c.ifElseBranches,
elseBranch: t,
}
}
func (c Conditional) Do(o Option) Option {
if c.predicate(o) {
return c.ifBranch(o)
}
for i, p := range c.ifElsePredicates {
if p(o) {
return c.ifElseBranches[i](o)
}
}
if c.elseBranch != nil {
return c.elseBranch(o)
}
return o
}