content: {-# language
      OverloadedStrings
    , GeneralizedNewtypeDeriving
    #-}
  
  module Main (main) where
  
  import Control.Monad
  import Data.Functor.Identity
  import Lucid.Base
  import Lucid.Html5
  import Web.Scotty
  import Web.Scotty.Internal.Types
  import qualified Control.Monad.Reader as R
  import qualified Control.Monad.State.Lazy as SL
  import qualified Control.Monad.State.Strict as SS
  import qualified Data.ByteString.Lazy as BL
  
  import Weigh
  
  main :: IO ()
  main = do
    mainWith $ do
      setColumns [Case,Allocated,GCs,Live,Check,Max,MaxOS]
      setFormat Markdown
      io "ScottyM Strict" BL.putStr
        (SS.evalState
          (R.runReaderT (runS $ renderBST htmlScotty) defaultOptions)
          defaultScottyState)
      io "ScottyM Lazy" BL.putStr
        (SL.evalState (runScottyLazy $ renderBST htmlScottyLazy) defaultScottyState)
      io "Identity" BL.putStr
        (runIdentity $ renderBST htmlIdentity)
  
  
  htmlTest :: Monad m => HtmlT m ()
  htmlTest = replicateM_ 2 $ div_ $ do
    replicateM_ 1000 $ div_ $ do
      replicateM_ 10000 $ div_ "test"
  
  htmlIdentity :: HtmlT Identity ()
  htmlIdentity = htmlTest
  {-# noinline htmlIdentity #-}
  
  htmlScotty :: HtmlT ScottyM ()
  htmlScotty = htmlTest
  {-# noinline htmlScotty #-}
  
  htmlScottyLazy :: HtmlT ScottyLazy ()
  htmlScottyLazy = htmlTest
  {-# noinline htmlScottyLazy #-}
  
  newtype ScottyLazy a = ScottyLazy
    { runScottyLazy:: SL.State (ScottyState IO) a }
    deriving (Functor,Applicative,Monad)
  
  