add Traverse to seq
This commit is contained in:
parent
024e0d2bec
commit
84c615ac58
24
seq/seq.go
24
seq/seq.go
@ -286,3 +286,27 @@ func DropWhile(pred func(types.Elem) bool, s Seq) Seq {
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
// Runs pred on each element in the sequence, descending recursively if it
|
||||
// encounters another Seq (without calling pred on that Seq). This amounts to a
|
||||
// depth-first traverse. If pred ever returns false the traverse will stop.
|
||||
// Returns false if the Traverse was stopped by pred, true otherwise.
|
||||
func Traverse(pred func(types.Elem) bool, s Seq) bool {
|
||||
var el types.Elem
|
||||
var ok bool
|
||||
for {
|
||||
el, s, ok = s.FirstRest()
|
||||
if !ok {
|
||||
return true
|
||||
}
|
||||
var predRet bool
|
||||
if inners, ok := el.(Seq); ok {
|
||||
predRet = Traverse(pred, inners)
|
||||
} else {
|
||||
predRet = pred(el)
|
||||
}
|
||||
if !predRet {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -379,3 +379,49 @@ func TestDropWhile(t *T) {
|
||||
assertEmpty(l, t)
|
||||
assertEmpty(nl, t)
|
||||
}
|
||||
|
||||
// Test Traversing a Seq until a given condition
|
||||
func TestTraverse(t *T) {
|
||||
var acc int
|
||||
pred := func(el types.Elem) bool {
|
||||
acc += el.(types.GoType).V.(int)
|
||||
return true
|
||||
}
|
||||
|
||||
l := NewList()
|
||||
acc = 0
|
||||
Traverse(pred, l)
|
||||
assertValue(acc, 0, t)
|
||||
|
||||
l2 := NewList(elemSliceV(0, 1, 2, 3)...)
|
||||
acc = 0
|
||||
Traverse(pred, l2)
|
||||
assertValue(acc, 6, t)
|
||||
|
||||
l3 := NewList(
|
||||
types.GoType{1},
|
||||
types.GoType{2},
|
||||
NewList(elemSliceV(4, 5, 6)...),
|
||||
types.GoType{3},
|
||||
)
|
||||
acc = 0
|
||||
Traverse(pred, l3)
|
||||
assertValue(acc, 21, t)
|
||||
|
||||
pred = func(el types.Elem) bool {
|
||||
i := el.(types.GoType).V.(int)
|
||||
if i > 4 {
|
||||
return false
|
||||
}
|
||||
acc += i
|
||||
return true
|
||||
}
|
||||
|
||||
acc = 0
|
||||
Traverse(pred, l2)
|
||||
assertValue(acc, 6, t)
|
||||
|
||||
acc = 0
|
||||
Traverse(pred, l3)
|
||||
assertValue(acc, 7, t)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user