packages feed

rere-0.1: bench/JSON.hs

{-# LANGUAGE CPP                 #-}
{-# LANGUAGE GADTs               #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main (main, jsonRE, jsonRE', jsonNames, jsonCFG, jsonDerp, derp) where

import Prelude hiding (exponent)

import Criterion.Main (bench, defaultMain, whnf)
import Data.Either    (isRight)
import System.Clock   (Clock (Monotonic), diffTimeSpec, getTime)

import qualified Data.Aeson.Parser          as A
import qualified Data.Attoparsec.ByteString as Atto
import qualified Data.ByteString            as BS
import qualified Data.Set                   as Set
import qualified Text.Derp                  as D

#ifdef MIN_VERSION_saison
import qualified Saison.Decoding.Parser as S
import qualified Saison.Decoding.Tokens as S
#endif

import RERE
import RERE.Examples.JSON

import DerpConv

#if !MIN_VERSION_base(4,8,0)
import Control.Applicative ((<*))
#endif

derp :: D.Parser Char () -> String -> Bool
derp p s = not $ Set.null $ D.runParse p [ D.Token c [c] | c <- s]

aeson :: BS.ByteString -> Bool
aeson bs = isRight (Atto.parseOnly (A.json <* Atto.endOfInput) bs)

#ifdef MIN_VERSION_saison
saison :: BS.ByteString -> Bool
saison = go end . S.tokens where
    end :: BS.ByteString -> Bool
    end = BS.null . S.skipSpace

    go :: (k -> Bool) -> S.Tokens k e -> Bool
    go kont (S.TkLit _ k)        = kont k
    go kont (S.TkText _ k)       = kont k
    go kont (S.TkNumber _ k)     = kont k
    go kont (S.TkArrayOpen arr)  = goArr kont arr
    go kont (S.TkRecordOpen obj) = goObj kont obj
    go _    (S.TkErr _)          = False

    goArr :: (k -> Bool) -> S.TkArray k e -> Bool
    goArr kont (S.TkItem k)     = go (goArr kont) k
    goArr kont (S.TkArrayEnd k) = kont k
    goArr _    (S.TkArrayErr _) = False

    goObj :: (k -> Bool) -> S.TkRecord k e -> Bool
    goObj kont (S.TkPair _ k)    = go (goObj kont) k
    goObj kont (S.TkRecordEnd k) = kont k
    goObj _    (S.TkRecordErr _) = False
#endif

main :: IO ()
main = do
    contents <- readFile    "jsverify.json"
    bs       <- BS.readFile "jsverify.json"

    do
        putStrLn "Ref run"
        start <- getTime Monotonic
        print $ matchR jsonRE contents
        end <- getTime Monotonic
        print $ diffTimeSpec end start

    do
        putStrLn "ST run"
        start <- getTime Monotonic
        print $ matchST jsonRE contents
        end <- getTime Monotonic
        print $ diffTimeSpec end start

--    do
--        putStrLn "derp run"
--        start <- getTime Monotonic
--        print $ derp jsonDerp $ take 0 contents
--        end <- getTime Monotonic
--        print $ diffTimeSpec end start

    putStrLn "Criterion"
    defaultMain
        [ bench "aeson"  $ whnf aeson bs
#ifdef MIN_VERSION_saison
        , bench "saison" $ whnf saison bs
#endif
        -- , bench "rere"  $ whnf (matchR jsonRE) contents
        ]

-------------------------------------------------------------------------------
-- JSON definition
-------------------------------------------------------------------------------

jsonDerp :: D.Parser Char ()
jsonDerp = rere2derp jsonRE