loop.go 691 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package rules
  2. import (
  3. "fw/cp/node"
  4. "fw/rt2"
  5. "fw/rt2/frame"
  6. )
  7. const flag = 0
  8. func exitSeq(x frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  9. x.Root().ForEach(func(f frame.Frame) (ok bool) {
  10. n := rt2.NodeOf(f)
  11. _, ok = n.(node.LoopNode)
  12. if ok {
  13. rt2.RegOf(f)[flag] = true
  14. }
  15. ok = !ok
  16. return ok
  17. })
  18. return frame.End()
  19. }
  20. func loopSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  21. n := rt2.NodeOf(f)
  22. exit, ok := rt2.RegOf(f)[flag].(bool)
  23. if ok && exit {
  24. return frame.End()
  25. }
  26. if n.Left() != nil {
  27. rt2.Push(rt2.New(n.Left()), f)
  28. return loopSeq, frame.LATER
  29. } else if n.Left() == nil {
  30. return frame.End()
  31. } else {
  32. panic("unexpected loop seq")
  33. }
  34. }