{-# 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 ]