x.go 857 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package eval
  2. import (
  3. "fw/cp/node"
  4. "fw/rt2/frame"
  5. )
  6. type WAIT int
  7. const (
  8. WRONG WAIT = iota
  9. STOP
  10. LATER
  11. NOW
  12. BEGIN
  13. END
  14. )
  15. var Propose func(Do) frame.Sequence
  16. var Expose func(frame.Sequence) Do
  17. func (n WAIT) Wait() frame.WAIT {
  18. switch n {
  19. case WRONG:
  20. return frame.WRONG
  21. case STOP:
  22. return frame.STOP
  23. case LATER:
  24. return frame.LATER
  25. case NOW:
  26. return frame.NOW
  27. case BEGIN:
  28. return frame.BEGIN
  29. case END:
  30. return frame.END
  31. default:
  32. panic(n)
  33. }
  34. }
  35. type Do func(IN) OUT
  36. type IN struct {
  37. IR node.Node
  38. Frame frame.Frame
  39. Parent frame.Frame
  40. Key interface{}
  41. }
  42. type OUT struct {
  43. Do Do
  44. Next WAIT
  45. }
  46. func End() OUT {
  47. return OUT{Next: STOP}
  48. }
  49. func Tail(x WAIT) Do {
  50. return func(IN) OUT { return OUT{Next: x} }
  51. }
  52. func Later(x Do) OUT {
  53. return OUT{Do: x, Next: LATER}
  54. }
  55. func Now(x Do) OUT {
  56. return OUT{Do: x, Next: NOW}
  57. }