sf.go 2.6 KB

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