stdFrame.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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) ForEach(run func(x Frame) bool) {
  76. e := f.inner.Front()
  77. ok := true
  78. for (e != nil) && ok {
  79. ok = run(e.Value.(Frame))
  80. e = e.Next()
  81. }
  82. }
  83. func (f *RootFrame) OnPush(a Stack, b Frame) {}
  84. func (f *RootFrame) OnPop() {}
  85. func (f *RootFrame) Parent() Frame { return nil }
  86. func (f *RootFrame) Root() Stack { return nil }
  87. func (f *RootFrame) Domain() context.Domain { return f.domain }
  88. func (f *RootFrame) Init(d context.Domain) {
  89. assert.For(f.domain == nil, 20)
  90. assert.For(d != nil, 21)
  91. f.domain = d
  92. }
  93. func (f *RootFrame) Handle(msg interface{}) {}
  94. func (w WAIT) String() string {
  95. switch w {
  96. case NOW:
  97. return "NOW"
  98. case LATER:
  99. return "LATER"
  100. case STOP:
  101. return "STOP"
  102. case WRONG:
  103. return "WRONG"
  104. default:
  105. panic("wrong wait value")
  106. }
  107. }