package gonads import ( "testing" ) func Fib(n int) int { if n <= 1 { return n } return Fib(n-1) + Fib(n-2) } func TestRecurFib(t *testing.T) { t.Log(Fib(40)) } func TestMemoizedFib(t *testing.T) { mem := map[int]int{ 0: 0, 1: 1, } var fib func(int) int fib = func(n int) int { if result, ok := mem[n]; ok { return result } result := fib(n-1) + fib(n-2) mem[n] = result return result } t.Log(fib(40)) } func TestThunkFib(t *testing.T) { cache := make([]*Thunk[int], 41) var fib func(int) int fib = func(n int) int { return cache[n-1].Force() + cache[n-2].Force() } for i := range cache { i := i cache[i] = NewThunk(func() int { return fib(i) }) } cache[0].o.Set(0) cache[1].o.Set(1) t.Log(cache[40].Force()) } func TestThunkDelay(t *testing.T) { }