packages feed

Infinitree-0.1.0.0: bench/Main.hs

{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -O0 #-} -- optimizations break this benchmark, sadly
module Main (main) where
import Criterion (bench, whnf)
import Criterion.Main (defaultMain)
import Numeric.Natural (Natural)
import Data.Infinitree (Infinitree)
import qualified Data.Functor.Rep as Representable

fibIterative :: Natural -> Natural
fibIterative n = go 1 1 n
  where
    go !a _ 0   = a
    go !a !b !i = go b (a+b) (pred i)

large :: Natural
large = 8310

infinitree :: Natural -> Natural
infinitree n = 
  let 
    tree = Representable.tabulate @Infinitree go
    go 0 = 1
    go 1 = 1
    go i = Representable.index tree (i - 1) + Representable.index tree (i - 2)

  in Representable.index tree n

main :: IO ()
main = defaultMain
  [ bench "iterative"  $ whnf fibIterative large
  , bench "infinitree" $ whnf infinitree large
  ]