general_lazy_evalution1.go 993 B

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