123456789101112131415161718192021222324252627282930313233343536373839 |
- package rules
- import (
- "fw/cp/node"
- "fw/rt2"
- "fw/rt2/frame"
- )
- const flag = 0
- func exitSeq(x frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
- x.Root().ForEach(func(f frame.Frame) (ok bool) {
- n := rt2.NodeOf(f)
- _, ok = n.(node.LoopNode)
- if ok {
- rt2.RegOf(f)[flag] = true
- }
- ok = !ok
- return ok
- })
- return frame.End()
- }
- func loopSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
- n := rt2.NodeOf(f)
- exit, ok := rt2.RegOf(f)[flag].(bool)
- if ok && exit {
- return frame.End()
- }
- if n.Left() != nil {
- rt2.Push(rt2.New(n.Left()), f)
- return loopSeq, frame.LATER
- } else if n.Left() == nil {
- return frame.End()
- } else {
- panic("unexpected loop seq")
- }
- }
|