@@ -21,6 +21,8 @@ module Main (main) where
2121
2222import Control.DeepSeq (NFData(..))
2323import Control.Exception (SomeException, ErrorCall, try)
24+import Data.Char (ord)
25+import Data.Word (Word8)
2426import Streamly.Internal.Data.Unfold (Unfold)
2527import System.IO (Handle, hClose)
2628import System.Random (randomRIO)
@@ -693,8 +695,17 @@ o_1_space_zip size =
693695 ]
694696 ]
695697
696−o_1_space_nested :: Int -> [Benchmark]
697−o_1_space_nested size =
698+lf :: Word8
699+lf = fromIntegral (ord '\n')
700+
701+-- | Split on line feed.
702+foldManySepBy :: Handle -> IO Int
703+foldManySepBy =
704+ let u = UF.foldMany (FL.takeEndBy_ (== lf) FL.drain) FH.read
705+ in UF.fold FL.length u
706+
707+o_1_space_nested :: BenchEnv -> Int -> [Benchmark]
708+o_1_space_nested env size =
698709 [ bgroup
699710 "nested"
700711 [ benchIO "(<*>) (sqrt n x sqrt n)" $ toNullAp size
@@ -711,6 +722,8 @@ o_1_space_nested size =
711722 , benchIO "filterSome" $ filterSome size
712723
713724 , benchIO "concat" $ concat size
725+ , mkBench "foldMany (Fold.takeEndBy_ (== lf) Fold.drain)" env
726+ $ \inh _ -> foldManySepBy inh
714727 ]
715728 ]
716729
@@ -819,7 +832,7 @@ main = do
819832 , o_1_space_transformation size
820833 , o_1_space_filtering size
821834 , o_1_space_zip size
822− , o_1_space_nested size
835+ , o_1_space_nested env size
823836 , o_1_space_copy_read_exceptions env
824837 ]
825838 , bgroup (o_n_space_prefix moduleName)