def seqFib(n: Int): Task[Int] = n match {
case 0 | 1 => Task now 1
case n => {
for {
x <- seqFib(n-1)
y <- seqFib(n-2)
} yield x + y
}
} //> seqFib: (n: Int)scalaz.concurrent.Task[Int]
//concurrent approach
def parFib(n: Int): Task[Int] = n match {
case 0 | 1 => Task now 1
case n => {
val ND = Nondeterminism[Task]
for {
pair <- ND.both(parFib(n-1), parFib(n-2))
(x,y) = pair
} yield x + y
}
} //> parFib: (n: Int)scalaz.concurrent.Task[Int]
def msFib(n: Int, fib: Int => Task[Int]) = for {
b <- Task now { System.currentTimeMillis() }
a <- fib(n)
e <- Task now { System.currentTimeMillis() }
} yield (a, (e-b)) //> msFib: (n: Int, fib: Int => scalaz.concurrent.Task[Int])scalaz.concurrent.T
//| ask[(Int, Long)]
msFib(20, parFib).unsafePerformSync //> res3: (Int, Long) = (10946,315)
msFib(20, seqFib).unsafePerformSync //> res4: (Int, Long) = (10946,16)