packages feed

string-interpolate-0.0.1.0: bench/Bench.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PackageImports    #-}
{-# LANGUAGE QuasiQuotes       #-}

import Criterion      ( bench, bgroup, whnf )
import Criterion.Main ( defaultMain )

import qualified Data.ByteString as B
import qualified Data.Text       as T

import qualified "string-interpolate" Data.String.Interpolate   as SI
import qualified "interpolate" Data.String.Interpolate.IsString as I
import           "formatting" Formatting                        ( (%) )
import qualified "formatting" Formatting                        as F
import qualified "formatting" Formatting.ShortFormatters        as F

--------------------------------------------------------------------------------
-- Interpolating short Strings
--------------------------------------------------------------------------------

shortStringSI :: String -> String
shortStringSI str = [SI.i|A fine day to die, #{str}.|]

shortStringI :: String -> String
shortStringI str = [I.i|A fine day to die, #{str}.|]

shortStringF :: String -> String
shortStringF = F.formatToString ("A fine day to die, " % F.s % ".")

--------------------------------------------------------------------------------
-- Interpolating short Text
--------------------------------------------------------------------------------

shortTextSI :: T.Text -> T.Text
shortTextSI t = [SI.i|A fine day to die, #{t}.|]

shortTextI :: T.Text -> T.Text
shortTextI t = [I.i|A fine day to die, #{t}.|]

shortTextF :: T.Text -> T.Text
shortTextF = F.sformat ("A fine day to die, " % F.st % ".")

--------------------------------------------------------------------------------
-- Interpolating short ByteString
--------------------------------------------------------------------------------

shortByteStringSI :: B.ByteString -> B.ByteString
shortByteStringSI b = [SI.i|A fine day to die, #{b}.|]

shortByteStringI :: B.ByteString -> B.ByteString
shortByteStringI b = [I.i|A fine day to die, #{b}.|]

main :: IO ()
main = defaultMain
  [ bgroup "Small Strings Bench" $
    [ bench "string-interpolate" $ whnf shortStringSI "William"
    , bench "interpolate"        $ whnf shortStringI "William"
    , bench "formatting"         $ whnf shortStringF "William"
    ]
  , bgroup "Small Text Bench" $
    [ bench "string-interpolate" $ whnf shortTextSI "William"
    , bench "interpolate"        $ whnf shortTextI "William"
    , bench "formatting"         $ whnf shortTextF "William"
    ]
  , bgroup "Small ByteString Bench" $
    [ bench "string-interpolate" $ whnf shortByteStringSI "William"
    , bench "interpolate"        $ whnf shortByteStringI "William"
    -- "formatting" doesn't support ByteStrings.
    ]
  ]