on master help sign in
Add a benchmark for foldBreak in Fold module
61b907cHarendra Kumar
benchmark/Streamly/Benchmark/Data/Fold.hs+8
@@ -12,6 +12,7 @@
12module Main (main) where
12module Main (main) where
13
13
14import Control.DeepSeq (NFData(..))
14import Control.DeepSeq (NFData(..))
15+import Control.Monad (when)
15import Control.Monad.IO.Class (MonadIO(..))
16import Control.Monad.IO.Class (MonadIO(..))
16import Data.Functor.Identity (Identity)
17import Data.Functor.Identity (Identity)
17import Data.Map.Strict (Map)
18import Data.Map.Strict (Map)
@@ -140,6 +141,12 @@ shortest = IP.fold (FL.shortest FL.sum FL.length)
140longest :: Monad m => SerialT m Int -> m (Either Int Int)
141longest :: Monad m => SerialT m Int -> m (Either Int Int)
141longest = IP.fold (FL.longest FL.sum FL.length)
142longest = IP.fold (FL.longest FL.sum FL.length)
142
143
144+{-# INLINE foldBreak #-}
145+foldBreak :: Monad m => SerialT m Int -> m ()
146+foldBreak s = do
147+ (r, s1) <- IP.foldBreak (FL.take 1 FL.length) s
148+ when (r /= 0) $ foldBreak s1
149+
143-------------------------------------------------------------------------------
150-------------------------------------------------------------------------------
144-- Distributing by parallel application
151-- Distributing by parallel application
145-------------------------------------------------------------------------------
152-------------------------------------------------------------------------------
@@ -388,6 +395,7 @@ o_1_space_serial_composition value =
388 [ benchIOSink value "filter even" $ filter value
395 [ benchIOSink value "filter even" $ filter value
389 , benchIOSink value "foldFilter even" $ foldFilter value
396 , benchIOSink value "foldFilter even" $ foldFilter value
390 , benchIOSink value "foldFilter even, odd" $ foldFilter2 value
397 , benchIOSink value "foldFilter even, odd" $ foldFilter2 value
398+ , benchIOSink value "foldBreak (recursive)" foldBreak
391 , benchIOSink value "serialWith (all, any)" $ splitAllAny value
399 , benchIOSink value "serialWith (all, any)" $ splitAllAny value
392 , benchIOSink value "serial_ (all, any)" $ serial_ value
400 , benchIOSink value "serial_ (all, any)" $ serial_ value
393 , benchIOSink value "tee (all, any)" $ teeAllAny value
401 , benchIOSink value "tee (all, any)" $ teeAllAny value