general_lazy_evalution1.go 963 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Any interface{}
  6. type EvalFunc func(Any) (Any, Any)
  7. func main() {
  8. evenFunc := func(state Any) (Any, Any) {
  9. os := state.(int)
  10. ns := os + 2
  11. return os, ns
  12. }
  13. even := BuildLazyIntEvaluator(evenFunc, 0)
  14. for i := 0; i < 10; i++ {
  15. fmt.Printf("%vth even: %v\n", i, even())
  16. }
  17. }
  18. func BuildLazyEvaluator(evalFunc EvalFunc, initState Any) func() Any {
  19. retValChan := make(chan Any)
  20. loopFunc := func() {
  21. var actState Any = initState
  22. var retVal Any
  23. for {
  24. retVal, actState = evalFunc(actState)
  25. retValChan <- retVal
  26. }
  27. }
  28. retFunc := func() Any {
  29. return <-retValChan
  30. }
  31. go loopFunc()
  32. return retFunc
  33. }
  34. func BuildLazyIntEvaluator(evalFunc EvalFunc, initState Any) func() int {
  35. ef := BuildLazyEvaluator(evalFunc, initState)
  36. return func() int {
  37. return ef().(int)
  38. }
  39. }
  40. /* Output:
  41. 0th even: 0
  42. 1th even: 2
  43. 2th even: 4
  44. 3th even: 6
  45. 4th even: 8
  46. 5th even: 10
  47. 6th even: 12
  48. 7th even: 14
  49. 8th even: 16
  50. 9th even: 18
  51. */