dhodovsk / source-git / ghc-aeson

Forked from source-git/ghc-aeson 4 years ago
Clone

Blame benchmarks/JsonParse.hs

Packit 9a2dfb
{-# LANGUAGE BangPatterns #-}
Packit 9a2dfb
{-# LANGUAGE ScopedTypeVariables #-}
Packit 9a2dfb
{-# OPTIONS_GHC -fno-warn-orphans #-}
Packit 9a2dfb
Packit 9a2dfb
module Main (main) where
Packit 9a2dfb
Packit 9a2dfb
import Prelude ()
Packit 9a2dfb
import Prelude.Compat
Packit 9a2dfb
Packit 9a2dfb
import Control.DeepSeq
Packit 9a2dfb
import Control.Monad
Packit 9a2dfb
import Data.Time.Clock
Packit 9a2dfb
import System.Environment (getArgs)
Packit 9a2dfb
import Text.JSON
Packit 9a2dfb
Packit 9a2dfb
instance NFData JSValue where
Packit 9a2dfb
    rnf JSNull = ()
Packit 9a2dfb
    rnf (JSBool b) = rnf b
Packit 9a2dfb
    rnf (JSRational b r) = rnf b `seq` rnf r `seq` ()
Packit 9a2dfb
    rnf (JSString s) = rnf (fromJSString s)
Packit 9a2dfb
    rnf (JSArray vs) = rnf vs
Packit 9a2dfb
    rnf (JSObject kvs) = rnf (fromJSObject kvs)
Packit 9a2dfb
Packit 9a2dfb
main :: IO ()
Packit 9a2dfb
main = do
Packit 9a2dfb
  (cnt:args) <- getArgs
Packit 9a2dfb
  let count = read cnt :: Int
Packit 9a2dfb
  forM_ args $ \arg -> do
Packit 9a2dfb
    putStrLn $ arg ++ ":"
Packit 9a2dfb
    start <- getCurrentTime
Packit 9a2dfb
    let loop !good !bad
Packit 9a2dfb
            | good+bad >= count = return (good, bad)
Packit 9a2dfb
            | otherwise = do
Packit 9a2dfb
          s <- readFile arg
Packit 9a2dfb
          case decodeStrict s of
Packit 9a2dfb
            Ok (_::JSValue) -> loop (good+1) 0
Packit 9a2dfb
            _ -> loop 0 (bad+1)
Packit 9a2dfb
    (good, _) <- loop 0 0
Packit 9a2dfb
    end <- getCurrentTime
Packit 9a2dfb
    putStrLn $ "  " ++ show good ++ " good, " ++ show (diffUTCTime end start)