stdFrame.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package frame
  2. import (
  3. "container/list"
  4. "fw/rt2/context"
  5. "ypk/assert"
  6. )
  7. type RootFrame struct {
  8. inner list.List
  9. domain context.Domain
  10. }
  11. func (f *RootFrame) init() *RootFrame {
  12. f.inner = *list.New()
  13. return f
  14. }
  15. func NewRoot() *RootFrame {
  16. return new(RootFrame).init()
  17. }
  18. func (f *RootFrame) PushFor(frame, parent Frame) {
  19. _, ok := frame.(*RootFrame)
  20. if ok {
  21. panic("impossibru")
  22. }
  23. f.inner.PushFront(frame)
  24. frame.Init(f.Domain())
  25. frame.OnPush(f, parent)
  26. }
  27. func (f *RootFrame) Pop() {
  28. if f.inner.Front() != nil {
  29. elem := f.inner.Front()
  30. frame := elem.Value.(Frame)
  31. frame.OnPop()
  32. f.inner.Remove(elem)
  33. } else {
  34. panic("it's empty stack")
  35. }
  36. }
  37. func (f *RootFrame) Top() (frame Frame) {
  38. elem := f.inner.Front()
  39. if elem != nil {
  40. frame = elem.Value.(Frame)
  41. }
  42. return frame
  43. }
  44. func (f *RootFrame) Do() (res WAIT) {
  45. if f.Top() != nil {
  46. x := f.Top()
  47. //цикл дейкстры
  48. for {
  49. wait := x.Do()
  50. //fmt.Println(wait)
  51. if wait == LATER {
  52. break
  53. } else if wait == NOW {
  54. } else if wait == WRONG {
  55. panic("something wrong")
  56. } else if wait == STOP {
  57. if x == f.Top() {
  58. f.Pop()
  59. } else {
  60. panic("do not stop if not top on stack")
  61. }
  62. break
  63. } else {
  64. panic("wrong wait code")
  65. }
  66. }
  67. }
  68. if f.Top() != nil {
  69. res = NOW
  70. } else {
  71. res = STOP
  72. }
  73. return res
  74. }
  75. func (f *RootFrame) OnPush(a Stack, b Frame) {}
  76. func (f *RootFrame) OnPop() {}
  77. func (f *RootFrame) Parent() Frame { return nil }
  78. func (f *RootFrame) Root() Stack { return nil }
  79. func (f *RootFrame) Domain() context.Domain { return f.domain }
  80. func (f *RootFrame) Init(d context.Domain) {
  81. assert.For(f.domain == nil, 20)
  82. assert.For(d != nil, 21)
  83. f.domain = d
  84. }
  85. func (f *RootFrame) Handle(msg interface{}) {}
  86. func (w WAIT) String() string {
  87. switch w {
  88. case NOW:
  89. return "NOW"
  90. case LATER:
  91. return "LATER"
  92. case STOP:
  93. return "STOP"
  94. case WRONG:
  95. return "WRONG"
  96. default:
  97. panic("wrong wait value")
  98. }
  99. }