-- |
-- Using this library you can create executables with benchmarks.
-- It automatically implants a command-line options parser and info generator.
-- 
-- Here is an example of how this library is supposed to be used:
-- 
-- > import CriterionPlus
-- > import qualified SomeMySQLLib as MySQL
-- > import qualified SomePostgreSQLLib as PostgreSQL
-- > 
-- > main = 
-- >   benchmark $ do
-- >     standoff "Inserting rows" $ do
-- >       subject "MySQL" $ do
-- >         -- Exclude the "setup" phase from measurement:
-- >         pause
-- >         connection <- liftIO $ MySQL.openConnection
-- >         -- Measure what we want:
-- >         continue
-- >         liftIO $ MySQL.insertAThousandRows connection
-- >         -- Exclude the "teardown" phase from measurement:
-- >         pause
-- >         liftIO $ MySQL.closeConnection connection
-- >       subject "PostgreSQL" $ do
-- >         -- This is how we can exclude the "setup" phase from monad transformers:
-- >         pause
-- >         PostgreSQL.runSession $ do
-- >           lift $ continue
-- >           PostgreSQL.insertAThousandRows
-- >           -- Exclude "teardown":
-- >           lift $ pause
-- >     -- Each standoff generates an independent report file:
-- >     standoff "Querying" $ do
-- >       subject "MySQL" $ error "So on..."
-- >       subject "PostgreSQL" $ error "So on..."
-- 
module CriterionPlus
(
  -- * IO
  benchmark,
  -- * Benchmark
  Benchmark,
  standoff,
  -- * Standoff
  Standoff,
  group,
  subject,
  -- * Subject
  Subject,
  continue,
  pause,
  -- ** Evaluation
  whnf,
  nf,
  nfIO,
  whnfIO,
  -- * Shared Types
  Name,
)
where

import CriterionPlus.Monads