packages feed

uniquely-represented-sets-0.1.0.0: bench/bench.hs

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])