stdFrame.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. var trapped bool
  46. if f.Top() != nil {
  47. x := f.Top()
  48. //цикл дейкстры
  49. for {
  50. wait := x.Do()
  51. //fmt.Println(wait)
  52. if wait == LATER {
  53. break
  54. } else if wait == NOW {
  55. } else if wait == WRONG {
  56. trapped = true
  57. break
  58. //panic("something wrong") do nothing, it's a trap
  59. } else if wait == STOP {
  60. if x == f.Top() {
  61. f.Pop()
  62. } else {
  63. panic("do not stop if not top on stack")
  64. }
  65. break
  66. } else {
  67. panic("wrong wait code")
  68. }
  69. }
  70. }
  71. if f.Top() != nil && !trapped {
  72. res = NOW
  73. } else {
  74. res = STOP
  75. }
  76. return res
  77. }
  78. func (f *RootFrame) ForEach(run func(x Frame) bool) {
  79. e := f.inner.Front()
  80. ok := true
  81. for (e != nil) && ok {
  82. ok = run(e.Value.(Frame))
  83. e = e.Next()
  84. }
  85. }
  86. func (f *RootFrame) OnPush(a Stack, b Frame) {}
  87. func (f *RootFrame) OnPop() {}
  88. func (f *RootFrame) Parent() Frame { return nil }
  89. func (f *RootFrame) Root() Stack { return nil }
  90. func (f *RootFrame) Domain() context.Domain { return f.domain }
  91. func (f *RootFrame) Init(d context.Domain) {
  92. assert.For(f.domain == nil, 20)
  93. assert.For(d != nil, 21)
  94. f.domain = d
  95. }
  96. func (f *RootFrame) Handle(msg interface{}) {}
  97. func (w WAIT) String() string {
  98. switch w {
  99. case NOW:
  100. return "NOW"
  101. case LATER:
  102. return "LATER"
  103. case STOP:
  104. return "STOP"
  105. case WRONG:
  106. return "WRONG"
  107. default:
  108. panic("wrong wait value")
  109. }
  110. }