repeat.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package rules
  2. import (
  3. "fmt"
  4. "fw/cp/node"
  5. "fw/rt2/frame"
  6. "fw/rt2/nodeframe"
  7. "reflect"
  8. )
  9. func repeatSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  10. var fu nodeframe.FrameUtils
  11. n := fu.NodeOf(f)
  12. fu.DataOf(f)[n.Right()] = false
  13. var cond func(f frame.Frame) (frame.Sequence, frame.WAIT)
  14. next := func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  15. done := fu.DataOf(f)[n.Right()].(bool)
  16. fu.DataOf(f)[n.Right()] = nil
  17. if !done && n.Right() != nil {
  18. fu.Push(fu.New(n.Left()), f)
  19. return cond, frame.LATER
  20. } else if done {
  21. return frame.End()
  22. } else if n.Left() == nil {
  23. return frame.End()
  24. } else {
  25. panic("unexpected repeat seq")
  26. }
  27. }
  28. cond = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  29. switch n.Right().(type) {
  30. case node.OperationNode:
  31. fu.Push(fu.New(n.Right()), f)
  32. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  33. fu.DataOf(f.Parent())[n] = fu.DataOf(f)[n.Right()]
  34. return next, frame.LATER
  35. }
  36. ret = frame.LATER
  37. return seq, ret
  38. default:
  39. panic(fmt.Sprintf("unknown repeat expression", reflect.TypeOf(n.Left())))
  40. }
  41. }
  42. return next, frame.NOW
  43. }