stdFrame.go 1.6 KB

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