rrb-vector-0.1.1.0: bench/Traverse.hs
{-# LANGUAGE BangPatterns #-}
import Control.Applicative (liftA2)
import Control.Monad (replicateM)
import Data.Foldable (foldl', toList)
import Data.Functor
import Test.Tasty.Bench
import qualified Data.RRBVector as RRB
main :: IO ()
main = defaultMain $ [100, 1000, 10000] <&> \n ->
let !v = RRB.fromList [1..n]
!idx = n `div` 2
in bgroup (show n)
[ bench "foldr" $ nf (foldr (+) 0) v
, bench "ifoldr" $ nf (RRB.ifoldr (\i x acc -> i + x + acc) 0) v
, bench "foldl" $ nf (foldl (+) 0) v
, bench "ifoldl" $ nf (RRB.ifoldl (\i acc x -> i + acc + x) 0) v
, bench "map" $ nf (RRB.map (+ 1)) v
, bench "imap" $ nf (RRB.imap (+)) v
, bench "traverse" $ nf (traverse (Just $!)) v
, bench "itraverse" $ nf (RRB.itraverse (\i x -> Just $! i + x)) v
]