packages feed

antigen-0.1.0.0: bench/Main.hs

{-# LANGUAGE NumericUnderscores #-}

module Main (main) where

import Criterion.Main (Benchmarkable, bench, defaultMain, nfIO)
import Test.AntiGen.Internal (AntiGen, evalPartial, evalToPartial, zapAt, (|!))
import Test.QuickCheck (Arbitrary (..), generate)
import Test.QuickCheck.GenT (MonadGen (..))

bindList :: Int -> AntiGen [Int]
bindList 1 = (: []) <$> liftGen arbitrary
bindList n
  | n <= 0 = pure []
  | otherwise = do
      rest <- bindList (n - 1)
      case rest of
        x : xs -> do
          y <- pure (succ x) |! pure (pred x)
          pure $ y : x : xs
        [] -> error "Got empty list"

bindListZap :: Int -> Int -> Benchmarkable
bindListZap len i =
  nfIO . generate . variant (12345 :: Int) . fmap evalPartial $
    zapAt i =<< evalToPartial (bindList len)

main :: IO ()
main =
  defaultMain
    [ bench "bindList 10_000 zap at 0" $ bindListZap 10_000 0
    , bench "bindList 10_000 zap at 9_000" $ bindListZap 10_000 9_000
    , bench "bindList 1_000_000 zap at 0" $ bindListZap 1_000_000 0
    , bench "bindList 1_000_000 zap at 900_000" $ bindListZap 1_000_000 900_000
    ]