-- This Source Code Form is subject to the terms of the Mozilla Public
-- License, v. 2.0. If a copy of the MPL was not distributed with this
-- file, You can obtain one at http://mozilla.org/MPL/2.0/.
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators #-}
module Main (main) where
import Criterion
import Criterion.Main
import Network.HTTP.Types hiding (ok200)
import Network.Wai
import Network.Wai.Internal (ResponseReceived (..))
import Network.Wai.Predicate
import Network.Wai.Routing
sitemap :: Routes a IO ()
sitemap = do
get "/a" (continue handlerA) (query "foo")
get "/b" (continue handlerB) (query "foo" .&. query "bar")
get "/c" (continue handlerC) (query "foo" .&. query "bar" .&. query "baz")
get "/d" (continue handlerD) (query "foo" .&. query "bar" .&. query "baz" .&. query "zoo")
get "/z" (continue handlerZ) $
query "foo"
.&. query "bar"
.&. query "baz"
.&. query "zoo"
.&. query "x1"
.&. query "x2"
.&. query "x3"
.&. query "x4"
.&. query "x5"
.&. query "x6"
.&. query "x7"
.&. query "x8"
handlerA :: Int -> IO Response
handlerA _ = return ok200
handlerB :: Int ::: Int -> IO Response
handlerB _ = return ok200
handlerC :: Int ::: Int ::: Int -> IO Response
handlerC _ = return ok200
handlerD :: Int ::: Int ::: Int ::: Int -> IO Response
handlerD _ = return ok200
handlerZ :: Int ::: Int ::: Int ::: Int ::: Int ::: Int ::: Int ::: Int ::: Int ::: Int ::: Int ::: Int -> IO Response
handlerZ _ = return ok200
ok200 :: Response
ok200 = responseLBS status200 [] ""
reqABad, reqBBad, reqCBad, reqDBad, reqZBad :: Request
reqABad = defaultRequest { rawPathInfo = "/a" }
reqBBad = reqAOk { rawPathInfo = "/b" }
reqCBad = reqBOk { rawPathInfo = "/c" }
reqDBad = reqCOk { rawPathInfo = "/d" }
reqZBad = defaultRequest
{ rawPathInfo = "/z"
, queryString =
[ ("foo", Just "42")
, ("bar", Just "42")
, ("naz", Just "42")
, ("zoo", Just "42")
, ("x1", Just "42")
, ("x2", Just "42")
, ("x3", Just "42")
, ("x4", Just "42")
, ("x5", Just "42")
, ("x6", Just "42")
, ("x7", Just "42")
]
}
reqAOk, reqBOk, reqCOk, reqDOk, reqZOk :: Request
reqAOk = reqABad { queryString = [("foo", Just "42")] }
reqBOk = reqBBad { queryString = ("bar", Just "100") : queryString reqAOk }
reqCOk = reqCBad { queryString = ("baz", Just "0") : queryString reqBOk }
reqDOk = reqDBad { queryString = ("zoo", Just "1") : queryString reqCOk }
reqZOk = reqZBad { queryString = ("x8", Just "42") : queryString reqZBad }
main :: IO ()
main = defaultMain
[ bgroup "bench"
[ bench "a - ok" (whnfIO $ f reqAOk)
, bench "a - bad" (whnfIO $ f reqABad)
, bench "b - ok" (whnfIO $ f reqBOk)
, bench "b - bad" (whnfIO $ f reqBBad)
, bench "c - ok" (whnfIO $ f reqCOk)
, bench "c - bad" (whnfIO $ f reqCBad)
, bench "d - ok" (whnfIO $ f reqDOk)
, bench "d - bad" (whnfIO $ f reqDBad)
, bench "z - ok" (whnfIO $ f reqZOk)
, bench "z - bad" (whnfIO $ f reqZBad)
]
]
where
f rq = route (prepare sitemap) rq rs
rs = const (return ResponseReceived)