frame.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package nodeframe
  2. import (
  3. "cp/node"
  4. "rt2/decision"
  5. "rt2/frame"
  6. "ypk/assert"
  7. )
  8. type FrameUtils struct{}
  9. func (fu FrameUtils) New(n node.Node) (f frame.Frame) {
  10. assert.For(n != nil, 20)
  11. f = new(nodeFrame)
  12. f.(*nodeFrame).ir = n
  13. return f
  14. }
  15. func (fu FrameUtils) Push(f, p frame.Frame) {
  16. assert.For(f != nil, 20)
  17. pp, _ := p.(*nodeFrame)
  18. pp.push(f)
  19. }
  20. func (fu FrameUtils) NodeOf(f frame.Frame) node.Node {
  21. ff, _ := f.(*nodeFrame)
  22. assert.For(ff.ir != nil, 40)
  23. return ff.ir
  24. }
  25. type nodeFrame struct {
  26. root frame.Stack
  27. parent frame.Frame
  28. ir node.Node
  29. seq frame.Sequence
  30. }
  31. func (f *nodeFrame) Do() frame.WAIT {
  32. assert.For(f.seq != nil, 20)
  33. next, ret := f.seq(f)
  34. if next != nil {
  35. assert.For(ret != frame.STOP, 40)
  36. f.seq = next
  37. } else {
  38. assert.For(ret == frame.STOP, 41)
  39. }
  40. return ret
  41. }
  42. func (f *nodeFrame) onPush() {
  43. f.seq = decision.PrologueFor(f.ir)
  44. }
  45. func (f *nodeFrame) OnPop() {
  46. f.seq = decision.EpilogueFor(f.ir)
  47. if f.seq != nil {
  48. _, _ = f.seq(f)
  49. }
  50. }
  51. func (f *nodeFrame) push(n frame.Frame) {
  52. f.root.PushFor(n, f)
  53. }
  54. func (f *nodeFrame) OnPush(root frame.Stack, parent frame.Frame) {
  55. f.root = root
  56. f.parent = parent
  57. f.onPush()
  58. }
  59. func (f *nodeFrame) Parent() frame.Frame { return f.parent }
  60. func (f *nodeFrame) Root() frame.Stack { return f.root }