module Main (main) where import Control.Monad (replicateM) import Criterion.Main import Data.Foldable import Data.Set.Unique import System.Random insert' :: Ord a => a -> [a] -> [a] insert' x (y:ys) | x > y = y : insert' x ys insert' x ys = x : ys member' :: Ord a => a -> [a] -> Bool member' x = foldr f False where f y ys = case compare x y of LT -> False GT -> ys EQ -> True intr :: Int -> IO Int intr u = randomRIO (0,u) atSize :: Int -> Benchmark atSize n = env ((,,) <$> replicateM n (intr n) <*> fmap fromList (replicateM n (intr n)) <*> fmap (foldr insert' []) (replicateM n (intr n))) $ \ ~(xs,ys,zs) -> bgroup (show n) [ bench "member" $ nf (length . filter (`member` ys)) xs , bench "listMember" $ nf (length . filter (`member'` zs)) xs , bench "insert" $ nf (foldl' (flip insert) empty) xs , bench "listInsert" $ nf (foldl' (flip insert') []) xs , bench "fromList" $ nf fromList xs , bench "fromListBy" $ nf (fromListBy compare) xs] main :: IO () main = defaultMain (map atSize [1000, 10000])