anchor.diff:        let stop = timer.Elapsed
         printfn "r diamond %d %d = %s, took %A" m n ((!result).ToString ()) stop
   
  -// 0 1 2 3 4  5  6
  -// 1 2 4 8 16 32 64
  -
   do for m in [0; 1; 2; 3; 4; 5; 6] do
        for n in [10; 10000; 20000; 80000; 160000; 320000] do
  -       for f in [Streams.Pyramid.run; Rx.Pyramid.run] do
  +       for f in [Streams.Pyramid.run; Rx.Pyramid.run;
  +                 Streams.Diamond.run; Rx.Diamond.run] do
            f m n
            GC.Collect () ; System.Threading.Thread.Sleep 100
            GC.Collect () ; System.Threading.Thread.Sleep 100
  
positive.code:     |> Seq.map (fun (xs, ys) ->
         Stream.zipWithFun (+) xs ys)
  
    let ints () = Stream.iterateFun ((+) 1) 0
  
    module Fib =
      let fibs () = Stream.fix <| fun fibs ->
  
negative.code: 
    module Diamond =
      let rec repeat n f xs = if n = 0 then xs else repeat (n-1) f (f xs)
      let diamond m n =
        Seq.singleton (ints (n+1))
        |> repeat m split
        |> repeat m join
        |> Seq.head
  
      let run m n =
        let timer = Stopwatch.StartNew ()
        let result = ref -1
        (diamond m n
         |> Observable.skip n
         |> Observable.take 1).SubscribeOn(System.Reactive.Concurrency.ThreadPoolScheduler.Instance)
        |> Observable.subscribe (fun x ->
  