-- |
-- Module      : Main
-- Copyright   : (c) 2018 Harendra Kumar
--
-- License     : BSD3
-- Maintainer  : harendra.kumar@gmail.com

import Gauge
import Streamly
import System.Random (randomRIO)
import Control.Concurrent.Async

count :: Int
count = 100000

-------------------------------------------------------------------------------
-- Append
-------------------------------------------------------------------------------

{-# INLINE append #-}
append
    :: (Monoid (t IO Int), Monad (t IO))
    => (t IO Int -> SerialT IO Int) -> IO ()
append t = randomRIO (1,1) >>= \x -> runStream $ t $ foldMap return [x..count]

main :: IO ()
main = do
  defaultMain
    [
      bgroup "streamly"
      [ bench "serial"   $ nfIO $ append serially
      , bench "wSerial"  $ nfIO $ append wSerially
      , bench "ahead"    $ nfIO $ append aheadly
      , bench "async"    $ nfIO $ append asyncly
      , bench "wAsync"   $ nfIO $ append wAsyncly
      , bench "parallel" $ nfIO $ append parallely
      ]
      , bgroup "async"
      [ bench "mapConcurrently_" $ nfIO $ mapConcurrently_ return [1..count]
      , bench "mapConcurrently" $ nfIO $ mapConcurrently return [1..count]
      ]
   ]