func Traverse()

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
		}
	}
}