packages feed

type-of-html-0.5.0.0: bench/Main.hs

{-# OPTIONS_GHC -fno-warn-missing-signatures #-}

{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE FlexibleContexts    #-}
{-# LANGUAGE TypeOperators       #-}
{-# LANGUAGE DataKinds           #-}

module Main where

import Html
import qualified Html.Attribute as A

import Data.String
import Control.Monad
import Criterion.Main

import Text.Blaze.Html5 ((!))
import Text.Blaze.Html.Renderer.Utf8

import qualified Text.Blaze.Html5            as B
import qualified Text.Blaze.Html5.Attributes as BA

main :: IO ()
main = defaultMain
  [ bgroup "minimal"
    [ bench "blaze-html"   $ nf (renderHtml . blazeMinimal)     (fromString "TEST")
    , bench "type-of-html" $ nf (renderByteString . minimal)    "TEST"
    ]
  , bgroup "hello world"
    [ bench "blaze-html"   $ nf (renderHtml . blazeHelloWorld)  (fromString "TEST")
    , bench "type-of-html" $ nf (renderByteString . helloWorld) "TEST"
    ]
  , bgroup "attributes long"
    [ bench "blaze-html"   $ nf (renderHtml . blazeAttrLong)    (fromString "TEST")
    , bench "type-of-html" $ nf (renderByteString . attrLong)   "TEST"
    ]
  , bgroup "attributes short"
    [ bench "blaze-html"   $ nf (renderHtml . blazeAttrShort)   (fromString "TEST")
    , bench "type-of-html" $ nf (renderByteString . attrShort)  "TEST"
    ]
  , bgroup "big page"
    [ bench "blaze-html"   $ nf (renderHtml . blazeBigPage)     (fromString "TEST")
    , bench "type-of-html" $ nf (renderByteString . bigPage)    "TEST"
    ]
  , bgroup "big page with attributes"
    [ bench "blaze-html"   $ nf (renderHtml . blazeBigPageA)    (fromString "TEST")
    , bench "type-of-html" $ nf (renderByteString . bigPageA)   "TEST"
    ]
  , bgroup "big table"
    [ bench "blaze-html"   $ nf (renderHtml . blazeBigTable)    (4,4)
    , bench "type-of-html" $ nf (renderByteString . bigTable)   (4,4)
    ]
  ]

-- Blaze based functions

blazeMinimal :: B.Html -> B.Html
blazeMinimal = B.div

blazeHelloWorld :: B.Html -> B.Html
blazeHelloWorld x =
  B.html $ do
    B.head $ do
      B.title x
    B.body $ do
      B.p $ fromString "Hello World!"

blazeBigPage :: B.Html -> B.Html
blazeBigPage x =
  B.html $ do
    B.body $ do
      B.h1 $ do
        B.img
        B.strong $ fromString "0"
      B.div $ do
        B.div $ fromString "1"
      B.div $ do
        B.form $ do
          B.fieldset $ do
            B.div $ do
              B.div $ do
                B.label $ fromString "a"
                B.select $ do
                  B.option $ fromString "b"
                  B.option $ fromString "c"
                B.div $ fromString "d"
              B.i x
            B.button . B.i $ fromString "e"

blazeAttrShort :: B.Html -> B.Html
blazeAttrShort x
  = B.i ! BA.accesskey       (fromString "a")
  $ B.i ! BA.class_          (fromString "b")
  $ B.i ! BA.contenteditable (fromString "c")
  $ B.i ! BA.contextmenu     (fromString "d")
  $ B.i ! BA.dir             (fromString "e")
  $ B.i ! BA.draggable       (fromString "f")
  $ B.i ! BA.hidden          (fromString "g")
  $ B.i ! BA.id              (fromString "h")
  $ B.i ! BA.itemprop        (fromString "i")
  $ B.i ! BA.lang            (fromString "j")
  $ B.i ! BA.spellcheck      (fromString "k")
  $ B.i ! BA.style           (fromString "l")
  $ B.i ! BA.tabindex        (fromString "m")
  $ B.i ! BA.title           (fromString "n")
  $ x

blazeAttrLong :: B.Html -> B.Html
blazeAttrLong x
  = B.i ! BA.accesskey       (fromString "a")
        ! BA.class_          (fromString "b")
        ! BA.contenteditable (fromString "c")
        ! BA.contextmenu     (fromString "d")
        ! BA.dir             (fromString "e")
        ! BA.draggable       (fromString "f")
        ! BA.hidden          (fromString "g")
        ! BA.id              (fromString "h")
        ! BA.itemprop        (fromString "i")
        ! BA.lang            (fromString "j")
        ! BA.spellcheck      (fromString "k")
        ! BA.style           (fromString "l")
        ! BA.tabindex        (fromString "m")
        ! BA.title           (fromString "n")
        $ x

blazeBigPageA :: B.Html -> B.Html
blazeBigPageA x =
  B.html $ do
    B.body $ do
      B.h1 ! BA.id (fromString "a") $ do
        B.img
        B.strong ! BA.class_ (fromString "b") $ fromString "0"
      B.div $ do
        B.div ! BA.id (fromString "c") $ fromString "1"
      B.div $ do
        B.form ! BA.class_ (fromString "d") $ do
          B.fieldset $ do
            B.div ! BA.id (fromString "e") $ do
              B.div $ do
                B.label ! BA.class_ (fromString "f") $ fromString "a"
                B.select $ do
                  B.option ! BA.id (fromString "g") $ fromString "b"
                  B.option (fromString "c")
                B.div ! BA.class_ (fromString "h") $ fromString "d"
              B.i x
            B.button ! BA.id (fromString "i") $ B.i $ fromString "e"

blazeBigTable :: (Int, Int) -> B.Html
blazeBigTable (n, m)
  = B.table
  . replicateM_ n
  . B.tr
  $ mapM_ (B.td . fromString . show) [1..m]

-- Type of Html based functions

minimal = div_

helloWorld x =
  html_
    ( head_
      ( title_ x
      )
    # body_
      ( p_ "Hello World!"
      )
    )

bigPage x =
  html_
    ( body_
      ( h1_
        ( img_
        # strong_ (0 :: Int)
        )
      # div_
        ( div_ (1 :: Int)
        )
      # div_
        ( form_
          ( fieldset_
            ( div_
              ( div_
                ( label_ "a"
                # select_
                  ( option_ "b"
                  # option_ "c"
                  )
                # div_ "d"
                )
              # i_ x
              )
            # button_ (i_ "e")
            )
          )
        )
      )
    )

attrShort x
  = i_A (A.accesskey_       "a")
  . i_A (A.class_           "b")
  . i_A (A.contenteditable_ "c")
  . i_A (A.contextmenu_     "d")
  . i_A (A.dir_             "e")
  . i_A (A.draggable_       "f")
  . i_A (A.hidden_          "g")
  . i_A (A.id_              "h")
  . i_A (A.itemprop_        "i")
  . i_A (A.lang_            "j")
  . i_A (A.spellcheck_      "k")
  . i_A (A.style_           "l")
  . i_A (A.tabindex_        "m")
  . i_A (A.title_           "n")
  $ x

attrLong x =
  i_A ( A.accesskey_       "a"
      # A.class_           "b"
      # A.contenteditable_ "c"
      # A.contextmenu_     "d"
      # A.dir_             "e"
      # A.draggable_       "f"
      # A.hidden_          "g"
      # A.id_              "h"
      # A.itemprop_        "i"
      # A.lang_            "j"
      # A.spellcheck_      "k"
      # A.style_           "l"
      # A.tabindex_        "m"
      # A.title_           "n"
      ) x

bigPageA x =
  html_
    ( body_
      ( h1_A (A.id_ "a")
        ( img_
        # strong_A (A.class_ "b") (0 :: Int)
        )
      # div_
        ( div_A (A.id_ "c") (1 :: Int)
        )
      # div_
        ( form_A (A.class_ "d")
          ( fieldset_
            ( div_A (A.id_ "e")
              ( div_
                ( label_A (A.class_ "f") "a"
                # select_
                  ( option_A (A.id_ "g") "b"
                  # option_ "c"
                  )
                # div_A (A.class_ "h") "d"
                )
              # i_ x
              )
            # button_A (A.id_ "i") (i_ "e")
            )
          )
        )
      )
    )

bigTable (n, m) = table_ . replicate n . tr_ $ map td_ [(1::Int)..m]