packages feed

modern-uri-0.0.1.0: bench/speed/Main.hs

{-# LANGUAGE OverloadedStrings #-}

module Main (main) where

import Criterion.Main
import Data.Maybe (fromJust)
import Data.Text (Text)
import Data.Void
import Text.Megaparsec
import Text.URI (URI)
import qualified Data.Text as T
import qualified Text.URI  as URI

main :: IO ()
main = defaultMain
  [ bparser   turiText
  , brender   turi
  , brenderBs turi ]

----------------------------------------------------------------------------
-- Helpers

-- | Test 'URI' as 'Text'.

turiText :: Text
turiText = "https://mark:secret@github.com:443/mrkkrp/modern-uri?foo=bar#fragment"

-- | Test 'URI' in parsed form.

turi :: URI
turi = fromJust (URI.mkURI turiText)

-- | Benchmark speed of the 'URI' parser with given input.

bparser :: Text -> Benchmark
bparser txt = env (return txt) (bench name . nf p)
  where
    name = "parser: " ++ T.unpack txt
    p    = parse (URI.parser <* eof :: Parsec Void Text URI) ""

-- | Benchmark speed of the 'URI' render with given input.

brender :: URI -> Benchmark
brender uri = env (return uri) (bench name . nf URI.render)
  where
    name = "text render: " ++ T.unpack (URI.render uri)

-- | The same as 'brender' but for the 'ByteString' render.

brenderBs :: URI -> Benchmark
brenderBs uri = env (return uri) (bench name . nf URI.renderBs)
  where
    name = "bs render: " ++ T.unpack (URI.render uri)