hermit-0.1.1.0: examples/reverse/Reverse.hs
module Main where
import Criterion.Main
import HList
import Data.Function (fix)
{-# INLINE unwrap #-}
unwrap :: ([a] -> [a]) -> ([a] -> H a)
unwrap f = repH . f
{-# INLINE wrap #-}
wrap :: ([a] -> H a) -> ([a] -> [a])
wrap g = absH . g
{-# RULES "ww" forall f . fix f = wrap (fix (unwrap . f . wrap)) #-}
{-# RULES "inline-fix" forall f . fix f = let w = f w in w #-}
-- rev :: [a] -> [a]
rev [] = []
rev (x:xs) = rev xs ++ [x]
main = defaultMain
[ bench (show n) $ whnf (\n -> sum $ rev [1..n]) n
| n <- take 8 $ [50,100..]
]