general_lazy_evalution2.go 1.0 KB

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