-
Notifications
You must be signed in to change notification settings - Fork 4
/
predicate.go
76 lines (65 loc) · 1.43 KB
/
predicate.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
package predicate
import (
"github.com/insolar/assured-ledger/ledger-core/testutils/debuglogger"
)
type Func = func(debuglogger.UpdateEvent) bool
func Never() Func {
return func(debuglogger.UpdateEvent) bool {
return false
}
}
func Ever() Func {
return func(debuglogger.UpdateEvent) bool {
return true
}
}
func Not(predicate Func) Func {
return func(event debuglogger.UpdateEvent) bool {
return !predicate(event)
}
}
func And(predicates ...Func) Func {
if len(predicates) == 0 {
return Never()
}
return func(event debuglogger.UpdateEvent) bool {
for _, fn := range predicates {
if !fn(event) {
return false
}
}
return true
}
}
func Or(predicates ...Func) Func {
return func(event debuglogger.UpdateEvent) bool {
for _, fn := range predicates {
if fn(event) {
return true
}
}
return false
}
}
// ChainOf will wait for all predicates to fire on different steps
// for example:
// ChainOf(X1, X2, X3) will wait for:
// * predicate X1 eventually to return true
// * predicate X2 eventually to return true (no more checks of X1 ever)
// * and predicate X3 eventually to return true (no checks of X1 and X2)
// and only then it'll return true
func ChainOf(predicates ...Func) Func {
pos := 0
return func(event debuglogger.UpdateEvent) bool {
if pos == len(predicates) {
return true
}
if predicates[pos](event) {
pos++
if pos == len(predicates) {
return true
}
}
return false
}
}