@@ -1,4 +1,4 @@
1−{-# LANGUAGE BangPatterns, OverloadedStrings #-}
1+{-# LANGUAGE BangPatterns, CPP, OverloadedStrings #-}
3import Control.Exception
3import Control.Exception
4import Control.Monad
4import Control.Monad
@@ -8,35 +8,36 @@ import Data.Time.Clock
8import System.Environment (getArgs)
8import System.Environment (getArgs)
9import System.IO
9import System.IO
10import qualified Data.ByteString as B
10import qualified Data.ByteString as B
11−import qualified Data.ByteString.Lazy as L
12−import qualified Data.ByteString.Lazy.Internal as L
13import Control.DeepSeq
11import Control.DeepSeq
13+#if !MIN_VERSION_bytestring(0,10,0)
14+import qualified Data.ByteString.Lazy.Internal as L
15instance NFData L.ByteString where
16instance NFData L.ByteString where
17 where go (L.Chunk _ cs) = go cs
18 where go (L.Chunk _ cs) = go cs
18 go L.Empty = ()
19 go L.Empty = ()
19 {-# INLINE rnf #-}
20 {-# INLINE rnf #-}
22 (cnt:args) <- getArgs
25 (cnt:args) <- getArgs
23 let count = read cnt :: Int
26 let count = read cnt :: Int
24 forM_ args $ \arg -> bracket (openFile arg ReadMode) hClose $ \h -> do
27 forM_ args $ \arg -> bracket (openFile arg ReadMode) hClose $ \h -> do
25 putStrLn $ arg ++ ":"
28 putStrLn $ arg ++ ":"
26 let refill = B.hGet h 16384
29 let refill = B.hGet h 16384
27− result <- parseWith refill json =<< refill
30+ result0 <- parseWith refill json =<< refill
28− r <- case result of
31+ r0 <- case result0 of
29− Done _ r -> return r
32+ Done _ r -> return r
30− _ -> fail $ "failed to read " ++ show arg
33+ _ -> fail $ "failed to read " ++ show arg
31 start <- getCurrentTime
34 start <- getCurrentTime
32 let loop !n r
35 let loop !n r
33 | n >= count = return ()
36 | n >= count = return ()
34 | otherwise = {-# SCC "loop" #-} do
37 | otherwise = {-# SCC "loop" #-} do
36− Done _ r -> rnf (encode r) `seq` loop (n+1) r
38+ rnf (encode r) `seq` loop (n+1) r
37− _ -> error $ "failed to read " ++ show arg
38− loop 0 r
39+ loop 0 r0
39 delta <- flip diffUTCTime start `fmap` getCurrentTime
40 delta <- flip diffUTCTime start `fmap` getCurrentTime
40 let rate = fromIntegral count / realToFrac delta :: Double
41 let rate = fromIntegral count / realToFrac delta :: Double
41 putStrLn $ " " ++ show delta
42 putStrLn $ " " ++ show delta
42− putStrLn $ " " ++ show (round rate) ++ " per second"
43+ putStrLn $ " " ++ show (round rate :: Int) ++ " per second"