packages feed

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
        ]