@@ -24,9 +24,10 @@ module Main
2424 ) where
2525
2626import Control.DeepSeq (NFData(..))
27−import Control.Monad (void)
27+import Control.Monad (void, when)
2828import Control.Monad.Catch (MonadCatch)
2929import Data.Functor.Identity (runIdentity)
30+import Data.Maybe (isJust)
3031import Data.Word (Word8)
3132import System.IO (Handle)
3233import System.Random (randomRIO)
@@ -233,11 +234,21 @@ fold s = void $ ArrayStream.foldBreak Fold.drain s
233234parse :: Int -> SerialT IO (Array.Array Int) -> IO ()
234235parse value s = void $ ArrayStream.parseBreak (drainWhile (< value)) s
235236
237+{-# INLINE foldBreak #-}
238+foldBreak :: SerialT IO (Array.Array Int) -> IO ()
239+foldBreak s = do
240+ (r, s1) <- ArrayStream.foldBreak Fold.one s
241+ when (isJust r) $ foldBreak s1
242+
236243o_1_space_serial_array ::
237244 Int -> [Array.Array Int] -> [Array.Array Int] -> [Benchmark]
238245o_1_space_serial_array bound arraysSmall arraysBig =
239246 [ benchIO "fold (of 100)" (\_ -> Stream.fromList arraysSmall) fold
240247 , benchIO "fold (single)" (\_ -> Stream.fromList arraysBig) fold
248+ , benchIO
249+ "foldBreak (recursive, small arrays)"
250+ (\_ -> Stream.fromList arraysSmall)
251+ foldBreak
241252 , benchIO "parse (of 100)" (\_ -> Stream.fromList arraysSmall)
242253 $ parse bound
243254 , benchIO "parse (single)" (\_ -> Stream.fromList arraysBig)