in wrap.go [92:118]
func Traverse(s Steper, f func(Steper, []Steper) TraverseDecision, walked ...Steper) TraverseDecision {
if f == nil {
return TraverseStop
}
for {
if s == nil {
return TraverseEndBranch
}
if dec := f(s, walked); dec != TraverseContinue {
return dec
}
walked = append(walked, s)
switch u := s.(type) {
case interface{ Unwrap() Steper }:
s = u.Unwrap()
case interface{ Unwrap() []Steper }:
for _, s := range u.Unwrap() {
if dec := Traverse(s, f, walked...); dec == TraverseStop {
return dec
}
}
return TraverseContinue
default:
return TraverseContinue
}
}
}