stdFrame.go 1.9 KB

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