{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
module Small where
import Html
import qualified Html.Attribute as A
import Data.Proxy
import qualified Data.Text as T
import qualified Data.Text.Lazy as LT
import Criterion.Main
import Control.Arrow
small :: Benchmark
small = bgroup "Small"
[ bench "oneElement" $ r oneElement ""
, bench "oneElement'" $ r oneElement' ""
, bench "oneElement''" $ r oneElement'' ""
, bench "nestedElement" $ r nestedElement ""
, bench "nestedElement'" $ r nestedElement' ""
, bench "nestedElement''" $ r nestedElement'' ""
, bench "parallelElement" $ r parallelElement ""
, bench "parallelElement'" $ r parallelElement' ""
, bench "parallelElement''" $ r parallelElement'' ""
, bench "listElement" $ r listElement ""
, bench "listElement'" $ r listElement' ""
, bench "listElement''" $ r listElement'' ""
, bench "Int" $ r id (123456789 :: Int)
, bench "Integer" $ r id (123456789 :: Integer)
, bench "Double" $ r id (123456789 :: Double)
, bench "Float" $ r id (123456789 :: Float)
, bench "Word" $ r id (123456789 :: Word)
, bench "Proxy" $ r id (Proxy :: Proxy "abc")
, bench "Char" $ r id 'a'
, bench "oneElement Proxy" $ r oneElement (Proxy :: Proxy "abc")
, bench "()" $ r id ()
, bench "oneElement ()" $ r oneElement ()
, bench "oneAttribute" $ r A.class_ ""
, bench "oneAttribute ()" $ r A.class_ ()
, bench "oneAttribute Proxy" $ r A.class_ (Proxy :: Proxy "abc")
, bench "parallelAttribute" $ r (\x -> A.class_ x # A.id_ x) ""
, bench "elementWithAttribute" $ r (\x -> div_A (A.class_ x) x) ""
, bench "elementWithParallelAttribute" $ r (\x -> div_A (A.class_ x # A.id_ x) x) ""
, bench "listOfAttributes" $ r (\x -> [A.class_ x, A.class_ x]) ""
, bench "Runtime String" $ r id runtimeTxt
, bench "String" $ r id "abcdefghijklmnopqrstuvwxyz<>&;"
, bench "Runtime Raw String" $ r id (Raw runtimeTxt)
, bench "Raw String" $ r id (Raw "abcdefghijklmnopqrstuvwxyz<>&;")
, bench "Runtime strict Text" $ r id (T.pack runtimeTxt)
, bench "strict Text" $ r id (T.pack "abcdefghijklmnopqrstuvwxyz<>&;")
, bench "Runtime Raw strict Text" $ r id (Raw (T.pack runtimeTxt))
, bench "Raw strict Text" $ r id (Raw (T.pack "abcdefghijklmnopqrstuvwxyz<>&;"))
, bench "Runtime lazy Text" $ r id (LT.pack runtimeTxt)
, bench "lazy Text" $ r id (LT.pack "abcdefghijklmnopqrstuvwxyz<>&;")
, bench "Runtime Raw lazy Text" $ r id (Raw (LT.pack runtimeTxt))
, bench "Raw lazy Text" $ r id (Raw (LT.pack "abcdefghijklmnopqrstuvwxyz<>&;"))
, bench "listOfListOf" $ r (\x -> div_ [i_ [span_ x]]) ""
]
where r f x = nf (renderByteString . f) x
runtimeTxt = reverse "abcdefghijklmnopqrstuvwxyz<>&;"
oneElement, oneElement', oneElement''
:: ('Div ?> a)
=> a -> 'Div > a
oneElement x = div_ x
oneElement' = div_
oneElement'' = \x -> div_ x
nestedElement, nestedElement', nestedElement''
:: ('Span ?> a)
=> a -> 'Div > ('Span > a)
nestedElement x = div_ (span_ x)
nestedElement' = div_ . span_
nestedElement'' = \x -> div_ (span_ x)
parallelElement, parallelElement', parallelElement''
:: ('Span ?> a, 'Div ?> a)
=> a -> ('Div > a) # ('Span > a)
parallelElement x = div_ x # span_ x
parallelElement' = uncurry (#) . (div_ &&& span_)
parallelElement'' = \x -> div_ x # span_ x
listElement, listElement', listElement''
:: ('Div ?> a)
=> a -> ['Div > a]
listElement x = [div_ x]
listElement' = pure . div_
listElement'' = \x -> [div_ x]