seq.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package rules
  2. import (
  3. "fw/rt2/frame"
  4. )
  5. type WAIT int
  6. const (
  7. WRONG WAIT = iota
  8. STOP
  9. LATER
  10. NOW
  11. )
  12. type Do func(...IN) OUT
  13. type IN struct {
  14. frame frame.Frame
  15. }
  16. type OUT struct {
  17. do Do
  18. next WAIT
  19. }
  20. func (n WAIT) wait() frame.WAIT {
  21. switch n {
  22. case WRONG:
  23. return frame.WRONG
  24. case STOP:
  25. return frame.STOP
  26. case LATER:
  27. return frame.LATER
  28. case NOW:
  29. return frame.NOW
  30. default:
  31. panic(n)
  32. }
  33. }
  34. func waiting(n frame.WAIT) WAIT {
  35. switch n {
  36. case frame.WRONG:
  37. return WRONG
  38. case frame.STOP:
  39. return STOP
  40. case frame.LATER:
  41. return LATER
  42. case frame.NOW:
  43. return NOW
  44. default:
  45. panic(n)
  46. }
  47. }
  48. func End() OUT {
  49. return OUT{next: STOP}
  50. }
  51. func Tail(x WAIT) Do {
  52. return func(...IN) OUT { return OUT{next: x} }
  53. }
  54. func This(o OUT) (frame.Sequence, frame.WAIT) {
  55. return Propose(o.do), o.next.wait()
  56. }
  57. func Propose(a Do) frame.Sequence {
  58. return func(fr frame.Frame) (frame.Sequence, frame.WAIT) {
  59. return This(a(IN{frame: fr}))
  60. }
  61. }
  62. func Expose(f frame.Sequence) Do {
  63. return func(in ...IN) (out OUT) {
  64. s, w := f(in[0].frame)
  65. return OUT{do: Expose(s), next: waiting(w)}
  66. }
  67. }