Commits

Bryan O'Sullivan  committed af8de60

Add Johan's line folding benchmark

  • Participants
  • Parent commits 58c1db9

Comments (0)

Files changed (1)

File tests/benchmarks/FoldLines.hs

+{-# LANGUAGE BangPatterns #-}
+
+import System.Environment
+import System.IO
+import qualified Data.Text as T
+import qualified Data.Text.IO as T
+import qualified Data.ByteString as S
+
+-- Text
+foldLinesT :: (a -> T.Text -> a) -> a -> Handle -> IO a
+foldLinesT f z0 h = go z0
+  where
+    go !z = do
+        eof <- hIsEOF h
+        if eof
+            then return z
+            else do
+                l <- T.hGetLine h
+                let z' = f z l in go z'
+{-# INLINE foldLinesT #-}
+
+testT :: Handle -> IO Int
+testT = foldLinesT (\n _ -> n + 1) 0
+
+--ByteString
+foldLinesB :: (a -> S.ByteString -> a) -> a -> Handle -> IO a
+foldLinesB f z0 h = go z0
+  where
+    go !z = do
+        eof <- hIsEOF h
+        if eof
+            then return z
+            else do
+                l <- S.hGetLine h
+                let z' = f z l in go z'
+{-# INLINE foldLinesB #-}
+
+testB :: Handle -> IO Int
+testB = foldLinesB (\n _ -> n + 1) 0
+
+main = do
+  (name : file : _) <- getArgs
+  h <- openFile file ReadMode
+  hSetBuffering h (BlockBuffering (Just 16384))
+  case name of
+    "bs" -> testB h
+    "text" -> testT h