76 lines
2.6 KiB
Haskell
76 lines
2.6 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
import Yesod.Routes.Dispatch
|
|
import Data.Text (Text, words)
|
|
import Prelude hiding (words)
|
|
import Web.PathPieces
|
|
import Criterion.Main
|
|
import Control.DeepSeq
|
|
import Control.Monad (forM_, unless)
|
|
|
|
data TestRoute = Foo | Bar !Int | Baz
|
|
deriving Eq
|
|
instance NFData TestRoute
|
|
|
|
samples = take 10000 $ cycle
|
|
[ words "foo"
|
|
, words "foo bar"
|
|
, words ""
|
|
, words "bar baz"
|
|
, words "bar 4"
|
|
, words "bar 1234566789"
|
|
, words "baz"
|
|
, words "baz 4"
|
|
, words "something else"
|
|
]
|
|
|
|
simple :: [Text] -> Maybe TestRoute
|
|
simple ["foo"] = Just Foo
|
|
simple ["bar", x] = fmap Bar (fromPathPiece x)
|
|
simple ["baz"] = Just Baz
|
|
simple ["FOO"] = Just Foo
|
|
simple ["BAR", x] = fmap Bar (fromPathPiece x)
|
|
simple ["BAZ"] = Just Baz
|
|
simple ["Foo"] = Just Foo
|
|
simple ["Bar", x] = fmap Bar (fromPathPiece x)
|
|
simple ["Baz"] = Just Baz
|
|
simple ["Xfoo"] = Just Foo
|
|
simple ["Xbar", x] = fmap Bar (fromPathPiece x)
|
|
simple ["Xbaz"] = Just Baz
|
|
simple ["XFOO"] = Just Foo
|
|
simple ["XBAR", x] = fmap Bar (fromPathPiece x)
|
|
simple ["XBAZ"] = Just Baz
|
|
simple ["XFoo"] = Just Foo
|
|
simple ["XBar", x] = fmap Bar (fromPathPiece x)
|
|
simple ["XBaz"] = Just Baz
|
|
simple _ = Nothing
|
|
|
|
dispatch :: [Text] -> Maybe TestRoute
|
|
dispatch = toDispatch
|
|
[ Route [Static "foo"] False (const (Just Foo))
|
|
, Route [Static "bar", Dynamic] False (\[_, x] -> (fmap Bar (fromPathPiece x)))
|
|
, Route [Static "baz"] False (const (Just Baz))
|
|
, Route [Static "FOO"] False (const (Just Foo))
|
|
, Route [Static "BAR", Dynamic] False (\[_, x] -> (fmap Bar (fromPathPiece x)))
|
|
, Route [Static "BAZ"] False (const (Just Baz))
|
|
, Route [Static "Foo"] False (const (Just Foo))
|
|
, Route [Static "Bar", Dynamic] False (\[_, x] -> (fmap Bar (fromPathPiece x)))
|
|
, Route [Static "Baz"] False (const (Just Baz))
|
|
, Route [Static "Xfoo"] False (const (Just Foo))
|
|
, Route [Static "Xbar", Dynamic] False (\[_, x] -> (fmap Bar (fromPathPiece x)))
|
|
, Route [Static "Xbaz"] False (const (Just Baz))
|
|
, Route [Static "XFOO"] False (const (Just Foo))
|
|
, Route [Static "XBAR", Dynamic] False (\[_, x] -> (fmap Bar (fromPathPiece x)))
|
|
, Route [Static "XBAZ"] False (const (Just Baz))
|
|
, Route [Static "XFoo"] False (const (Just Foo))
|
|
, Route [Static "XBar", Dynamic] False (\[_, x] -> (fmap Bar (fromPathPiece x)))
|
|
, Route [Static "XBaz"] False (const (Just Baz))
|
|
]
|
|
|
|
main :: IO ()
|
|
main = do
|
|
forM_ samples $ \sample -> unless (simple sample == dispatch sample) (error $ show sample)
|
|
defaultMain
|
|
[ bench "simple" $ nf (map simple) samples
|
|
, bench "dispatch" $ nf (map dispatch) samples
|
|
]
|