frame.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package frame
  2. import (
  3. "fw/rt2/context"
  4. )
  5. type WAIT int
  6. const (
  7. WRONG WAIT = iota
  8. STOP
  9. LATER
  10. NOW
  11. //спец коды для начальной и конечной стадии
  12. BEGIN
  13. END
  14. )
  15. func (w WAIT) String() string {
  16. switch w {
  17. case NOW:
  18. return "NOW"
  19. case LATER:
  20. return "LATER"
  21. case STOP:
  22. return "STOP"
  23. case WRONG:
  24. return "WRONG"
  25. case BEGIN:
  26. return "BEGIN"
  27. case END:
  28. return "END"
  29. default:
  30. panic("wrong wait value")
  31. }
  32. }
  33. // LIFO-стек, позволяет затолкнуть фрейм связанный с другим фреймом
  34. type Stack interface {
  35. PushFor(f, parent Frame)
  36. Pop()
  37. Top() Frame
  38. ForEach(run func(this Frame) bool)
  39. }
  40. //фрейм
  41. type Frame interface {
  42. Do() WAIT
  43. OnPush(root Stack, parent Frame)
  44. OnPop()
  45. Parent() Frame
  46. Root() Stack
  47. context.ContextAware
  48. }
  49. //пользовательская функция, которую выполнит фрейм, может поставить на очередь выполнения себя или другую функцию
  50. type Sequence func(f Frame) (Sequence, WAIT)
  51. func Tail(x WAIT) (seq Sequence) {
  52. return func(f Frame) (Sequence, WAIT) { return nil, x }
  53. }
  54. func End() (Sequence, WAIT) { return nil, STOP }