seq.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. BEGIN
  12. END
  13. )
  14. type Do func(...IN) OUT
  15. type IN struct {
  16. frame frame.Frame
  17. }
  18. type OUT struct {
  19. do Do
  20. next WAIT
  21. }
  22. func (n WAIT) wait() frame.WAIT {
  23. switch n {
  24. case WRONG:
  25. return frame.WRONG
  26. case STOP:
  27. return frame.STOP
  28. case LATER:
  29. return frame.LATER
  30. case NOW:
  31. return frame.NOW
  32. case BEGIN:
  33. return frame.BEGIN
  34. case END:
  35. return frame.END
  36. default:
  37. panic(n)
  38. }
  39. }
  40. func waiting(n frame.WAIT) WAIT {
  41. switch n {
  42. case frame.WRONG:
  43. return WRONG
  44. case frame.STOP:
  45. return STOP
  46. case frame.LATER:
  47. return LATER
  48. case frame.NOW:
  49. return NOW
  50. case frame.BEGIN:
  51. return BEGIN
  52. case frame.END:
  53. return END
  54. default:
  55. panic(n)
  56. }
  57. }
  58. func End() OUT {
  59. return OUT{next: STOP}
  60. }
  61. func Tail(x WAIT) Do {
  62. return func(...IN) OUT { return OUT{next: x} }
  63. }
  64. func This(o OUT) (seq frame.Sequence, ret frame.WAIT) {
  65. ret = o.next.wait()
  66. if ret != frame.STOP {
  67. seq = Propose(o.do)
  68. }
  69. return seq, ret
  70. }
  71. func Propose(a Do) frame.Sequence {
  72. return func(fr frame.Frame) (frame.Sequence, frame.WAIT) {
  73. return This(a(IN{frame: fr}))
  74. }
  75. }
  76. func Expose(f frame.Sequence) Do {
  77. return func(in ...IN) (out OUT) {
  78. s, w := f(in[0].frame)
  79. return OUT{do: Expose(s), next: waiting(w)}
  80. }
  81. }