@@ -0,0 +1,35 @@
1+{-# LANGUAGE BangPatterns, ScopedTypeVariables #-}
2+
3+import Control.DeepSeq
4+import Control.Exception
5+import Control.Monad
6+import Text.JSON
7+import Data.Time.Clock
8+import System.Environment (getArgs)
9+import System.IO
10+import qualified Data.ByteString as B
11+
12+instance NFData JSValue where
13+ rnf JSNull = ()
14+ rnf (JSBool b) = rnf b
15+ rnf (JSRational b r) = rnf b `seq` rnf r `seq` ()
16+ rnf (JSString s) = rnf (fromJSString s)
17+ rnf (JSArray vs) = rnf vs
18+ rnf (JSObject kvs) = rnf (fromJSObject kvs)
19+
20+main = do
21+ (cnt:args) <- getArgs
22+ let count = read cnt :: Int
23+ forM_ args $ \arg -> do
24+ putStrLn $ arg ++ ":"
25+ start <- getCurrentTime
26+ let loop !good !bad
27+ | good+bad >= count = return (good, bad)
28+ | otherwise = do
29+ s <- readFile arg
30+ case decodeStrict s of
31+ Ok (v::JSValue) -> loop (good+1) 0
32+ _ -> loop 0 (bad+1)
33+ (good, _) <- loop 0 0
34+ end <- getCurrentTime
35+ putStrLn $ " " ++ show good ++ " good, " ++ show (diffUTCTime end start)