frame.go 854 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package frame
  2. import (
  3. "rt2/context"
  4. )
  5. type WAIT int
  6. const (
  7. WRONG WAIT = iota
  8. STOP
  9. SKIP
  10. DO
  11. )
  12. // LIFO-стек, позволяет затолкнуть фрейм связанный с другим фреймом
  13. type Stack interface {
  14. Push(f Frame)
  15. PushFor(f, parent Frame)
  16. Pop()
  17. Top() Frame
  18. }
  19. //фрейм
  20. type Frame interface {
  21. Do() WAIT
  22. OnPush(root Stack, parent Frame)
  23. OnPop()
  24. Parent() Frame
  25. Root() Stack
  26. context.ContextAware
  27. }
  28. //пользовательская функция, которую выполнит фрейм, может поставить на очередь выполнения себя или другую функцию
  29. type Sequence func(f Frame) (Sequence, WAIT)
  30. func Tail(x WAIT) (seq Sequence) {
  31. return func(f Frame) (Sequence, WAIT) { return nil, x }
  32. }
  33. func End() (Sequence, WAIT) { return nil, STOP }