frame.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package nodeframe
  2. import (
  3. "cp/node"
  4. "rt2/context"
  5. "rt2/decision"
  6. "rt2/frame"
  7. "ypk/assert"
  8. )
  9. type FrameUtils struct{}
  10. func (fu FrameUtils) New(n node.Node) (f frame.Frame) {
  11. assert.For(n != nil, 20)
  12. f = new(nodeFrame)
  13. f.(*nodeFrame).ir = n
  14. return f
  15. }
  16. func (fu FrameUtils) Push(f, p frame.Frame) {
  17. assert.For(f != nil, 20)
  18. pp, _ := p.(*nodeFrame)
  19. pp.push(f)
  20. }
  21. func (fu FrameUtils) NodeOf(f frame.Frame) node.Node {
  22. ff, _ := f.(*nodeFrame)
  23. assert.For(ff.ir != nil, 40)
  24. return ff.ir
  25. }
  26. func (fu FrameUtils) DataOf(f frame.Frame) map[interface{}]interface{} {
  27. m := new(frame.GetDataMsg)
  28. f.(context.ContextAware).Handle(m)
  29. return m.Data.(map[interface{}]interface{})
  30. }
  31. type nodeFrame struct {
  32. root frame.Stack
  33. parent frame.Frame
  34. ir node.Node
  35. seq frame.Sequence
  36. domain context.Domain
  37. data map[interface{}]interface{}
  38. }
  39. func (f *nodeFrame) Do() frame.WAIT {
  40. assert.For(f.seq != nil, 20)
  41. next, ret := f.seq(f)
  42. if next != nil {
  43. assert.For(ret != frame.STOP, 40)
  44. f.seq = next
  45. } else {
  46. assert.For(ret == frame.STOP, 41)
  47. }
  48. return ret
  49. }
  50. func (f *nodeFrame) onPush() {
  51. f.seq = decision.PrologueFor(f.ir)
  52. }
  53. func (f *nodeFrame) OnPop() {
  54. f.seq = decision.EpilogueFor(f.ir)
  55. if f.seq != nil {
  56. _, _ = f.seq(f)
  57. }
  58. }
  59. func (f *nodeFrame) push(n frame.Frame) {
  60. f.root.PushFor(n, f)
  61. }
  62. func (f *nodeFrame) OnPush(root frame.Stack, parent frame.Frame) {
  63. f.root = root
  64. f.parent = parent
  65. f.onPush()
  66. }
  67. func (f *nodeFrame) Parent() frame.Frame { return f.parent }
  68. func (f *nodeFrame) Root() frame.Stack { return f.root }
  69. func (f *nodeFrame) Domain() context.Domain { return f.domain }
  70. func (f *nodeFrame) Init(d context.Domain) {
  71. assert.For(f.domain == nil, 20)
  72. assert.For(d != nil, 21)
  73. f.domain = d
  74. }
  75. func (f *nodeFrame) Handle(msg interface{}) {
  76. assert.For(msg != nil, 20)
  77. switch msg.(type) {
  78. case *frame.SetDataMsg:
  79. f.data = msg.(*frame.SetDataMsg).Data.(map[interface{}]interface{})
  80. case *frame.GetDataMsg:
  81. msg.(*frame.GetDataMsg).Data = f.data
  82. }
  83. }