sf.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package std
  2. import (
  3. "container/list"
  4. "fw/rt2/context"
  5. "fw/rt2/frame"
  6. "fw/utils"
  7. "reflect"
  8. "ypk/assert"
  9. "ypk/halt"
  10. )
  11. type FlowFrame interface {
  12. }
  13. type RootFrame struct {
  14. inner list.List
  15. domain context.Domain
  16. queue []frame.Frame
  17. }
  18. func (f *RootFrame) init() *RootFrame {
  19. f.inner = *list.New()
  20. return f
  21. }
  22. func NewRoot() *RootFrame {
  23. return new(RootFrame).init()
  24. }
  25. func (r *RootFrame) Queue(f ...frame.Frame) (ret frame.Frame) {
  26. if len(f) == 0 {
  27. if len(r.queue) > 0 {
  28. ret = r.queue[0]
  29. old := r.queue
  30. r.queue = nil
  31. for i := 1; i < len(old); i++ {
  32. r.queue = append(r.queue, old[i])
  33. }
  34. }
  35. return ret
  36. } else {
  37. for i := range f {
  38. assert.For(f[i].Domain() != nil, 20)
  39. }
  40. r.queue = append(r.queue, f...)
  41. return nil
  42. }
  43. }
  44. func (f *RootFrame) PushFor(fr, parent frame.Frame) {
  45. _, ok := fr.(*RootFrame)
  46. if ok {
  47. panic("impossibru")
  48. }
  49. f.inner.PushFront(fr)
  50. if fr.Domain() == nil {
  51. if parent == nil {
  52. domain := f.Domain().(context.Factory).New()
  53. fr.Init(domain)
  54. } else {
  55. fr.Init(parent.Domain())
  56. }
  57. }
  58. fr.OnPush(f, parent)
  59. }
  60. func (f *RootFrame) Pop() {
  61. if f.inner.Front() != nil {
  62. elem := f.inner.Front()
  63. frame := elem.Value.(frame.Frame)
  64. frame.OnPop()
  65. f.inner.Remove(elem)
  66. } else {
  67. panic("it's empty stack")
  68. }
  69. }
  70. func (f *RootFrame) Top() (fr frame.Frame) {
  71. elem := f.inner.Front()
  72. if elem != nil {
  73. fr = elem.Value.(frame.Frame)
  74. }
  75. return fr
  76. }
  77. func (f *RootFrame) Drop() (fr frame.Frame) {
  78. elem := f.inner.Front()
  79. if elem != nil {
  80. fr = elem.Value.(frame.Frame)
  81. f.inner.Remove(elem)
  82. }
  83. return fr
  84. }
  85. func (f *RootFrame) Do() (res frame.WAIT) {
  86. var (
  87. trapped bool
  88. )
  89. if f.Top() != nil {
  90. x := f.Top()
  91. //цикл дейкстры
  92. for {
  93. wait := x.Do()
  94. //fmt.Println(wait)
  95. if wait == frame.LATER || wait == frame.BEGIN || wait == frame.END {
  96. break
  97. } else if wait == frame.NOW {
  98. } else if wait == frame.WRONG {
  99. trapped = true
  100. utils.PrintTrap("it's a trap")
  101. break
  102. //panic("something wrong") do nothing, it's a trap
  103. } else if wait == frame.STOP {
  104. if x == f.Top() {
  105. f.Pop()
  106. } else {
  107. halt.As(100, reflect.TypeOf(x), reflect.TypeOf(f.Top()), "do not stop if not top on stack")
  108. }
  109. break
  110. } else {
  111. panic("wrong wait code")
  112. }
  113. }
  114. }
  115. if f.Top() != nil && !trapped {
  116. res = frame.NOW
  117. } else {
  118. res = frame.STOP
  119. }
  120. return res
  121. }
  122. func (f *RootFrame) ForEach(run func(x frame.Frame) bool) {
  123. e := f.inner.Front()
  124. ok := true
  125. for (e != nil) && ok {
  126. if e.Value != nil {
  127. ok = run(e.Value.(frame.Frame))
  128. }
  129. e = e.Next()
  130. }
  131. }
  132. func (f *RootFrame) OnPush(a frame.Stack, b frame.Frame) {}
  133. func (f *RootFrame) OnPop() {}
  134. func (f *RootFrame) Parent() frame.Frame { return nil }
  135. func (f *RootFrame) Root() frame.Stack { return nil }
  136. func (f *RootFrame) Domain() context.Domain { return f.domain }
  137. func (f *RootFrame) Init(d context.Domain) {
  138. assert.For(f.domain == nil, 20)
  139. assert.For(d != nil, 21)
  140. f.domain = d
  141. }
  142. func (f *RootFrame) Handle(msg interface{}) {}