@@ -1,5 +1,5 @@
2−-- Module : Serial.Transformation
2+-- Module : Stream.Transformation
3-- Copyright : (c) 2018 Composewell Technologies
3-- Copyright : (c) 2018 Composewell Technologies
4-- License : BSD-3-Clause
4-- License : BSD-3-Clause
5-- Maintainer : streamly@composewell.com
5-- Maintainer : streamly@composewell.com
@@ -18,29 +18,35 @@
18{-# OPTIONS_GHC -fplugin Test.Inspection.Plugin #-}
18{-# OPTIONS_GHC -fplugin Test.Inspection.Plugin #-}
21−module Serial.Transformation (benchmarks) where
21+module Stream.Transformation (benchmarks) where
23−import Control.DeepSeq (NFData(..))
24import Control.Monad.IO.Class (MonadIO(..))
23import Control.Monad.IO.Class (MonadIO(..))
25−import Data.Functor.Identity (Identity)
24+
26import System.Random (randomRIO)
25import System.Random (randomRIO)
28−#ifdef INSPECTION
27+import qualified Streamly.Internal.Data.Fold as FL
29−import Test.Inspection
30+import Streamly.Prelude (fromSerial, MonadAsync)
31+import Streamly.Benchmark.Prelude
32+import Streamly.Internal.Data.Time.Units
33+import qualified Streamly.Benchmark.Prelude as BP
32import qualified Streamly.Prelude as S
34import qualified Streamly.Prelude as S
33−import qualified Streamly.Internal.Data.Stream as Stream
34import qualified Streamly.Internal.Data.Stream.IsStream as Internal
35import qualified Streamly.Internal.Data.Stream.IsStream as Internal
35−import qualified Streamly.Internal.Data.Fold as FL
36import qualified Streamly.Internal.Data.Unfold as Unfold
36import qualified Streamly.Internal.Data.Unfold as Unfold
38+import Control.DeepSeq (NFData(..))
39+import Data.Functor.Identity (Identity)
41+import qualified Streamly.Internal.Data.Stream as Stream
42+import qualified Streamly.Internal.Data.Stream as S
43+import qualified Streamly.Internal.Data.Stream as Internal
37import qualified Prelude
44import qualified Prelude
39import Gauge
47import Gauge
40−import Streamly.Prelude (SerialT, fromSerial, MonadAsync)
48+import Streamly.Internal.Data.Stream.Serial (SerialT)
41import Streamly.Benchmark.Common
49import Streamly.Benchmark.Common
42−import Streamly.Benchmark.Prelude
43−import Streamly.Internal.Data.Time.Units
44import Prelude hiding (sequence, mapM, fmap)
50import Prelude hiding (sequence, mapM, fmap)
46-------------------------------------------------------------------------------
52-------------------------------------------------------------------------------
@@ -54,7 +60,7 @@ import Prelude hiding (sequence, mapM, fmap)
54-------------------------------------------------------------------------------
60-------------------------------------------------------------------------------
55-- Traversable Instance
61-- Traversable Instance
56-------------------------------------------------------------------------------
62-------------------------------------------------------------------------------
57−
63+#ifndef USE_PRELUDE
58{-# INLINE traversableTraverse #-}
64{-# INLINE traversableTraverse #-}
59traversableTraverse :: SerialT Identity Int -> IO (SerialT Identity Int)
65traversableTraverse :: SerialT Identity Int -> IO (SerialT Identity Int)
60traversableTraverse = traverse return
66traversableTraverse = traverse return
@@ -89,42 +95,69 @@ o_n_space_traversable value =
89 , benchPureSinkIO value "sequence" traversableSequence
95 , benchPureSinkIO value "sequence" traversableSequence
101+{-# INLINE composeNG #-}
103+ (S.IsStream t, Monad m)
105+ -> (t m Int -> S.SerialT m Int)
108+composeNG = BP.composeN
110+{-# INLINE composeNG #-}
114+ -> (SerialT m Int -> SerialT m Int)
117+composeNG _n = return $ Stream.fold FL.drain
93-------------------------------------------------------------------------------
119-------------------------------------------------------------------------------
94-- maps and scans
120-- maps and scans
95-------------------------------------------------------------------------------
121-------------------------------------------------------------------------------
125+scan :: MonadIO m => Int -> SerialT m Int -> m ()
126+scan n = composeNG n $ S.scan FL.sum
129+tap :: MonadIO m => Int -> SerialT m Int -> m ()
130+tap n = composeNG n $ S.tap FL.sum
97{-# INLINE scanl' #-}
133{-# INLINE scanl' #-}
98scanl' :: MonadIO m => Int -> SerialT m Int -> m ()
134scanl' :: MonadIO m => Int -> SerialT m Int -> m ()
99−scanl' n = composeN n $ S.scanl' (+) 0
135+scanl' n = composeNG n $ S.scanl' (+) 0
101{-# INLINE scanlM' #-}
137{-# INLINE scanlM' #-}
102scanlM' :: MonadIO m => Int -> SerialT m Int -> m ()
138scanlM' :: MonadIO m => Int -> SerialT m Int -> m ()
103−scanlM' n = composeN n $ S.scanlM' (\b a -> return $ b + a) (return 0)
139+scanlM' n = composeNG n $ S.scanlM' (\b a -> return $ b + a) (return 0)
105{-# INLINE scanl1' #-}
141{-# INLINE scanl1' #-}
106scanl1' :: MonadIO m => Int -> SerialT m Int -> m ()
142scanl1' :: MonadIO m => Int -> SerialT m Int -> m ()
107−scanl1' n = composeN n $ S.scanl1' (+)
143+scanl1' n = composeNG n $ S.scanl1' (+)
109{-# INLINE scanl1M' #-}
145{-# INLINE scanl1M' #-}
110scanl1M' :: MonadIO m => Int -> SerialT m Int -> m ()
146scanl1M' :: MonadIO m => Int -> SerialT m Int -> m ()
111−scanl1M' n = composeN n $ S.scanl1M' (\b a -> return $ b + a)
147+scanl1M' n = composeNG n $ S.scanl1M' (\b a -> return $ b + a)
114−scan :: MonadIO m => Int -> SerialT m Int -> m ()
115−scan n = composeN n $ S.scan FL.sum
117{-# INLINE postscanl' #-}
149{-# INLINE postscanl' #-}
118postscanl' :: MonadIO m => Int -> SerialT m Int -> m ()
150postscanl' :: MonadIO m => Int -> SerialT m Int -> m ()
119−postscanl' n = composeN n $ S.postscanl' (+) 0
151+postscanl' n = composeNG n $ S.postscanl' (+) 0
121{-# INLINE postscanlM' #-}
153{-# INLINE postscanlM' #-}
122postscanlM' :: MonadIO m => Int -> SerialT m Int -> m ()
154postscanlM' :: MonadIO m => Int -> SerialT m Int -> m ()
123−postscanlM' n = composeN n $ S.postscanlM' (\b a -> return $ b + a) (return 0)
155+postscanlM' n = composeNG n $ S.postscanlM' (\b a -> return $ b + a) (return 0)
125{-# INLINE postscan #-}
158{-# INLINE postscan #-}
126postscan :: MonadIO m => Int -> SerialT m Int -> m ()
159postscan :: MonadIO m => Int -> SerialT m Int -> m ()
127−postscan n = composeN n $ S.postscan FL.sum
160+postscan n = composeNG n $ S.postscan FL.sum
129{-# INLINE sequence #-}
162{-# INLINE sequence #-}
130sequence ::
163sequence ::
@@ -134,10 +167,6 @@ sequence ::
135sequence t = S.drain . t . S.sequence
168sequence t = S.drain . t . S.sequence
138−tap :: MonadIO m => Int -> SerialT m Int -> m ()
139−tap n = composeN n $ S.tap FL.sum
141{-# INLINE pollCounts #-}
170{-# INLINE pollCounts #-}
142pollCounts :: Int -> SerialT IO Int -> IO ()
171pollCounts :: Int -> SerialT IO Int -> IO ()
143pollCounts n =
172pollCounts n =
@@ -151,26 +180,26 @@ pollCounts n =
151timestamped :: (S.MonadAsync m) => SerialT m Int -> m ()
180timestamped :: (S.MonadAsync m) => SerialT m Int -> m ()
152timestamped = S.drain . Internal.timestamped
181timestamped = S.drain . Internal.timestamped
184+trace :: MonadAsync m => Int -> SerialT m Int -> m ()
185+trace n = composeNG n $ Internal.trace return
154{-# INLINE foldrS #-}
188{-# INLINE foldrS #-}
155foldrS :: MonadIO m => Int -> SerialT m Int -> m ()
189foldrS :: MonadIO m => Int -> SerialT m Int -> m ()
156−foldrS n = composeN n $ Internal.foldrS S.cons S.nil
190+foldrS n = composeNG n $ Internal.foldrS S.cons S.nil
158{-# INLINE foldrSMap #-}
192{-# INLINE foldrSMap #-}
159foldrSMap :: MonadIO m => Int -> SerialT m Int -> m ()
193foldrSMap :: MonadIO m => Int -> SerialT m Int -> m ()
160−foldrSMap n = composeN n $ Internal.foldrS (\x xs -> x + 1 `S.cons` xs) S.nil
194+foldrSMap n = composeNG n $ Internal.foldrS (\x xs -> x + 1 `S.cons` xs) S.nil
162{-# INLINE foldrT #-}
196{-# INLINE foldrT #-}
163foldrT :: MonadIO m => Int -> SerialT m Int -> m ()
197foldrT :: MonadIO m => Int -> SerialT m Int -> m ()
164−foldrT n = composeN n $ Internal.foldrT S.cons S.nil
198+foldrT n = composeNG n $ Internal.foldrT S.cons S.nil
166{-# INLINE foldrTMap #-}
200{-# INLINE foldrTMap #-}
167foldrTMap :: MonadIO m => Int -> SerialT m Int -> m ()
201foldrTMap :: MonadIO m => Int -> SerialT m Int -> m ()
168−foldrTMap n = composeN n $ Internal.foldrT (\x xs -> x + 1 `S.cons` xs) S.nil
202+foldrTMap n = composeNG n $ Internal.foldrT (\x xs -> x + 1 `S.cons` xs) S.nil
172−trace :: MonadAsync m => Int -> SerialT m Int -> m ()
173−trace n = composeN n $ Internal.trace return
175o_1_space_mapping :: Int -> [Benchmark]
204o_1_space_mapping :: Int -> [Benchmark]
176o_1_space_mapping value =
205o_1_space_mapping value =
@@ -182,13 +211,13 @@ o_1_space_mapping value =
182 , benchIOSink value "foldrSMap" (foldrSMap 1)
211 , benchIOSink value "foldrSMap" (foldrSMap 1)
183 , benchIOSink value "foldrT" (foldrT 1)
212 , benchIOSink value "foldrT" (foldrT 1)
184 , benchIOSink value "foldrTMap" (foldrTMap 1)
213 , benchIOSink value "foldrTMap" (foldrTMap 1)
185−
214+#ifdef USE_PRELUDE
186 -- Mapping
215 -- Mapping
187 , benchIOSink value "map" (mapN fromSerial 1)
216 , benchIOSink value "map" (mapN fromSerial 1)
188 , bench "sequence" $ nfIO $ randomRIO (1, 1000) >>= \n ->
217 , bench "sequence" $ nfIO $ randomRIO (1, 1000) >>= \n ->
189 sequence fromSerial (sourceUnfoldrAction value n)
218 sequence fromSerial (sourceUnfoldrAction value n)
190 , benchIOSink value "mapM" (mapM fromSerial 1)
219 , benchIOSink value "mapM" (mapM fromSerial 1)
191− , benchIOSink value "tap" (tap 1)
220+
192 , benchIOSink value "pollCounts 1 second" (pollCounts 1)
221 , benchIOSink value "pollCounts 1 second" (pollCounts 1)
193 , benchIOSink value "timestamped" timestamped
222 , benchIOSink value "timestamped" timestamped
@@ -199,12 +228,15 @@ o_1_space_mapping value =
199 , benchIOSink value "scanl1M'" (scanl1M' 1)
228 , benchIOSink value "scanl1M'" (scanl1M' 1)
200 , benchIOSink value "postscanl'" (postscanl' 1)
229 , benchIOSink value "postscanl'" (postscanl' 1)
201 , benchIOSink value "postscanlM'" (postscanlM' 1)
230 , benchIOSink value "postscanlM'" (postscanlM' 1)
203− , benchIOSink value "scan" (scan 1)
204 , benchIOSink value "postscan" (postscan 1)
231 , benchIOSink value "postscan" (postscan 1)
233+ , benchIOSink value "scan" (scan 1)
234+ , benchIOSink value "tap" (tap 1)
208o_1_space_mappingX4 :: Int -> [Benchmark]
240o_1_space_mappingX4 :: Int -> [Benchmark]
209o_1_space_mappingX4 value =
241o_1_space_mappingX4 value =
210 [ bgroup "mappingX4"
242 [ bgroup "mappingX4"
@@ -218,10 +250,10 @@ o_1_space_mappingX4 value =
218 , benchIOSink value "scanl1M'" (scanl1M' 4)
250 , benchIOSink value "scanl1M'" (scanl1M' 4)
219 , benchIOSink value "postscanl'" (postscanl' 4)
251 , benchIOSink value "postscanl'" (postscanl' 4)
220 , benchIOSink value "postscanlM'" (postscanlM' 4)
252 , benchIOSink value "postscanlM'" (postscanlM' 4)
225{-# INLINE sieveScan #-}
257{-# INLINE sieveScan #-}
226sieveScan :: Monad m => SerialT m Int -> SerialT m Int
258sieveScan :: Monad m => SerialT m Int -> SerialT m Int
227sieveScan =
259sieveScan =
@@ -252,85 +284,89 @@ o_1_space_functor value =
252 , benchIOSink value "fmap x 4" (fmapN fromSerial 4)
284 , benchIOSink value "fmap x 4" (fmapN fromSerial 4)
288+{-# INLINE foldFilterEven #-}
289+foldFilterEven :: MonadIO m => SerialT m Int -> m ()
290+foldFilterEven = Stream.fold FL.drain . Stream.foldFilter (FL.satisfy even)
256-------------------------------------------------------------------------------
292-------------------------------------------------------------------------------
257-- Size reducing transformations (filtering)
293-- Size reducing transformations (filtering)
258-------------------------------------------------------------------------------
294-------------------------------------------------------------------------------
260{-# INLINE filterEven #-}
296{-# INLINE filterEven #-}
261filterEven :: MonadIO m => Int -> SerialT m Int -> m ()
297filterEven :: MonadIO m => Int -> SerialT m Int -> m ()
262−filterEven n = composeN n $ S.filter even
298+filterEven n = composeNG n $ S.filter even
264{-# INLINE filterAllOut #-}
300{-# INLINE filterAllOut #-}
265filterAllOut :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
301filterAllOut :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
266−filterAllOut value n = composeN n $ S.filter (> (value + 1))
302+filterAllOut value n = composeNG n $ S.filter (> (value + 1))
268{-# INLINE filterAllIn #-}
304{-# INLINE filterAllIn #-}
269filterAllIn :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
305filterAllIn :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
270−filterAllIn value n = composeN n $ S.filter (<= (value + 1))
306+filterAllIn value n = composeNG n $ S.filter (<= (value + 1))
272{-# INLINE filterMEven #-}
308{-# INLINE filterMEven #-}
273filterMEven :: MonadIO m => Int -> SerialT m Int -> m ()
309filterMEven :: MonadIO m => Int -> SerialT m Int -> m ()
274−filterMEven n = composeN n $ S.filterM (return . even)
310+filterMEven n = composeNG n $ S.filterM (return . even)
276{-# INLINE filterMAllOut #-}
312{-# INLINE filterMAllOut #-}
277filterMAllOut :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
313filterMAllOut :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
278−filterMAllOut value n = composeN n $ S.filterM (\x -> return $ x > (value + 1))
314+filterMAllOut value n = composeNG n $ S.filterM (\x -> return $ x > (value + 1))
280{-# INLINE filterMAllIn #-}
316{-# INLINE filterMAllIn #-}
281filterMAllIn :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
317filterMAllIn :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
282−filterMAllIn value n = composeN n $ S.filterM (\x -> return $ x <= (value + 1))
318+filterMAllIn value n = composeNG n $ S.filterM (\x -> return $ x <= (value + 1))
284−{-# INLINE foldFilterEven #-}
285−foldFilterEven :: MonadIO m => Int -> SerialT m Int -> m ()
286−foldFilterEven n = composeN n $ Stream.foldFilter (FL.satisfy even)
288{-# INLINE _takeOne #-}
320{-# INLINE _takeOne #-}
289_takeOne :: MonadIO m => Int -> SerialT m Int -> m ()
321_takeOne :: MonadIO m => Int -> SerialT m Int -> m ()
290−_takeOne n = composeN n $ S.take 1
322+_takeOne n = composeNG n $ S.take 1
292{-# INLINE takeAll #-}
324{-# INLINE takeAll #-}
293takeAll :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
325takeAll :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
294−takeAll value n = composeN n $ S.take (value + 1)
326+takeAll value n = composeNG n $ S.take (value + 1)
296{-# INLINE takeWhileTrue #-}
328{-# INLINE takeWhileTrue #-}
297takeWhileTrue :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
329takeWhileTrue :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
298−takeWhileTrue value n = composeN n $ S.takeWhile (<= (value + 1))
330+takeWhileTrue value n = composeNG n $ S.takeWhile (<= (value + 1))
300{-# INLINE takeWhileMTrue #-}
332{-# INLINE takeWhileMTrue #-}
301takeWhileMTrue :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
333takeWhileMTrue :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
302−takeWhileMTrue value n = composeN n $ S.takeWhileM (return . (<= (value + 1)))
334+takeWhileMTrue value n = composeNG n $ S.takeWhileM (return . (<= (value + 1)))
304{-# INLINE takeInterval #-}
337{-# INLINE takeInterval #-}
305takeInterval :: NanoSecond64 -> Int -> SerialT IO Int -> IO ()
338takeInterval :: NanoSecond64 -> Int -> SerialT IO Int -> IO ()
306takeInterval i n = composeN n (Internal.takeInterval i)
339takeInterval i n = composeN n (Internal.takeInterval i)
308#ifdef INSPECTION
342#ifdef INSPECTION
309-- inspect $ hasNoType 'takeInterval ''SPEC
343-- inspect $ hasNoType 'takeInterval ''SPEC
310inspect $ hasNoTypeClasses 'takeInterval
344inspect $ hasNoTypeClasses 'takeInterval
311-- inspect $ 'takeInterval `hasNoType` ''D.Step
345-- inspect $ 'takeInterval `hasNoType` ''D.Step
314{-# INLINE dropOne #-}
349{-# INLINE dropOne #-}
315dropOne :: MonadIO m => Int -> SerialT m Int -> m ()
350dropOne :: MonadIO m => Int -> SerialT m Int -> m ()
316−dropOne n = composeN n $ S.drop 1
351+dropOne n = composeNG n $ S.drop 1
318{-# INLINE dropAll #-}
353{-# INLINE dropAll #-}
319dropAll :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
354dropAll :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
320−dropAll value n = composeN n $ S.drop (value + 1)
355+dropAll value n = composeNG n $ S.drop (value + 1)
322{-# INLINE dropWhileTrue #-}
357{-# INLINE dropWhileTrue #-}
323dropWhileTrue :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
358dropWhileTrue :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
324−dropWhileTrue value n = composeN n $ S.dropWhile (<= (value + 1))
359+dropWhileTrue value n = composeNG n $ S.dropWhile (<= (value + 1))
326{-# INLINE dropWhileMTrue #-}
361{-# INLINE dropWhileMTrue #-}
327dropWhileMTrue :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
362dropWhileMTrue :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
328−dropWhileMTrue value n = composeN n $ S.dropWhileM (return . (<= (value + 1)))
363+dropWhileMTrue value n = composeNG n $ S.dropWhileM (return . (<= (value + 1)))
330{-# INLINE dropWhileFalse #-}
365{-# INLINE dropWhileFalse #-}
331dropWhileFalse :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
366dropWhileFalse :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
332−dropWhileFalse value n = composeN n $ S.dropWhile (> (value + 1))
367+dropWhileFalse value n = composeNG n $ S.dropWhile (> (value + 1))
334-- XXX Decide on the time interval
370-- XXX Decide on the time interval
335{-# INLINE _intervalsOfSum #-}
371{-# INLINE _intervalsOfSum #-}
336_intervalsOfSum :: MonadAsync m => Double -> Int -> SerialT m Int -> m ()
372_intervalsOfSum :: MonadAsync m => Double -> Int -> SerialT m Int -> m ()
@@ -344,28 +380,30 @@ dropInterval i n = composeN n (Internal.dropInterval i)
344inspect $ hasNoTypeClasses 'dropInterval
380inspect $ hasNoTypeClasses 'dropInterval
345-- inspect $ 'dropInterval `hasNoType` ''D.Step
381-- inspect $ 'dropInterval `hasNoType` ''D.Step
348{-# INLINE findIndices #-}
385{-# INLINE findIndices #-}
349findIndices :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
386findIndices :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
350−findIndices value n = composeN n $ S.findIndices (== (value + 1))
387+findIndices value n = composeNG n $ S.findIndices (== (value + 1))
352{-# INLINE elemIndices #-}
389{-# INLINE elemIndices #-}
353elemIndices :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
390elemIndices :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
354−elemIndices value n = composeN n $ S.elemIndices (value + 1)
391+elemIndices value n = composeNG n $ S.elemIndices (value + 1)
356{-# INLINE deleteBy #-}
393{-# INLINE deleteBy #-}
357deleteBy :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
394deleteBy :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
358−deleteBy value n = composeN n $ S.deleteBy (>=) (value + 1)
395+deleteBy value n = composeNG n $ S.deleteBy (>=) (value + 1)
360-- uniq . uniq == uniq, composeN 2 ~ composeN 1
397-- uniq . uniq == uniq, composeN 2 ~ composeN 1
361{-# INLINE uniq #-}
398{-# INLINE uniq #-}
362uniq :: MonadIO m => Int -> SerialT m Int -> m ()
399uniq :: MonadIO m => Int -> SerialT m Int -> m ()
363−uniq n = composeN n S.uniq
400+uniq n = composeNG n S.uniq
365{-# INLINE mapMaybe #-}
403{-# INLINE mapMaybe #-}
366mapMaybe :: MonadIO m => Int -> SerialT m Int -> m ()
404mapMaybe :: MonadIO m => Int -> SerialT m Int -> m ()
367mapMaybe n =
405mapMaybe n =
368− composeN n $
406+ composeNG n $
369 S.mapMaybe
407 S.mapMaybe
@@ -375,12 +413,13 @@ mapMaybe n =
375{-# INLINE mapMaybeM #-}
413{-# INLINE mapMaybeM #-}
376mapMaybeM :: S.MonadAsync m => Int -> SerialT m Int -> m ()
414mapMaybeM :: S.MonadAsync m => Int -> SerialT m Int -> m ()
377mapMaybeM n =
415mapMaybeM n =
378− composeN n $
416+ composeNG n $
379 S.mapMaybeM
417 S.mapMaybeM
382 then return Nothing
420 then return Nothing
383 else return $ Just x)
421 else return $ Just x)
385o_1_space_filtering :: Int -> [Benchmark]
424o_1_space_filtering :: Int -> [Benchmark]
386o_1_space_filtering value =
425o_1_space_filtering value =
@@ -392,23 +431,26 @@ o_1_space_filtering value =
392 , benchIOSink value "filterM-even" (filterMEven 1)
431 , benchIOSink value "filterM-even" (filterMEven 1)
393 , benchIOSink value "filterM-all-out" (filterMAllOut value 1)
432 , benchIOSink value "filterM-all-out" (filterMAllOut value 1)
394 , benchIOSink value "filterM-all-in" (filterMAllIn value 1)
433 , benchIOSink value "filterM-all-in" (filterMAllIn value 1)
395−
434+#ifndef USE_PRELUDE
396− , benchIOSink value "foldFilter-even" (foldFilterEven 1)
435+ , benchIOSink value "foldFilter-even" foldFilterEven
398 -- Trimming
438 -- Trimming
399 , benchIOSink value "take-all" (takeAll value 1)
439 , benchIOSink value "take-all" (takeAll value 1)
403− (takeInterval (NanoSecond64 maxBound) 1)
404 , benchIOSink value "takeWhile-true" (takeWhileTrue value 1)
440 , benchIOSink value "takeWhile-true" (takeWhileTrue value 1)
405 -- , benchIOSink value "takeWhileM-true" (_takeWhileMTrue value 1)
441 -- , benchIOSink value "takeWhileM-true" (_takeWhileMTrue value 1)
406 , benchIOSink value "drop-one" (dropOne 1)
442 , benchIOSink value "drop-one" (dropOne 1)
407 , benchIOSink value "drop-all" (dropAll value 1)
443 , benchIOSink value "drop-all" (dropAll value 1)
448+ (takeInterval (NanoSecond64 maxBound) 1)
408 , benchIOSink
449 , benchIOSink
410 "dropInterval-all"
451 "dropInterval-all"
411 (dropInterval (NanoSecond64 maxBound) 1)
452 (dropInterval (NanoSecond64 maxBound) 1)
412 , benchIOSink value "dropWhile-true" (dropWhileTrue value 1)
454 , benchIOSink value "dropWhile-true" (dropWhileTrue value 1)
413 -- , benchIOSink value "dropWhileM-true" (_dropWhileMTrue value 1)
455 -- , benchIOSink value "dropWhileM-true" (_dropWhileMTrue value 1)
414 , benchIOSink
456 , benchIOSink
@@ -418,17 +460,18 @@ o_1_space_filtering value =
418 , benchIOSink value "deleteBy" (deleteBy value 1)
460 , benchIOSink value "deleteBy" (deleteBy value 1)
420 , benchIOSink value "uniq" (uniq 1)
462 , benchIOSink value "uniq" (uniq 1)
421−
463+#ifdef USE_PRELUDE
422 -- Map and filter
464 -- Map and filter
423 , benchIOSink value "mapMaybe" (mapMaybe 1)
465 , benchIOSink value "mapMaybe" (mapMaybe 1)
424 , benchIOSink value "mapMaybeM" (mapMaybeM 1)
466 , benchIOSink value "mapMaybeM" (mapMaybeM 1)
426 -- Searching (stateful map and filter)
468 -- Searching (stateful map and filter)
427 , benchIOSink value "findIndices" (findIndices value 1)
469 , benchIOSink value "findIndices" (findIndices value 1)
428 , benchIOSink value "elemIndices" (elemIndices value 1)
470 , benchIOSink value "elemIndices" (elemIndices value 1)
432o_1_space_filteringX4 :: Int -> [Benchmark]
475o_1_space_filteringX4 :: Int -> [Benchmark]
433o_1_space_filteringX4 value =
476o_1_space_filteringX4 value =
434 [ bgroup "filteringX4"
477 [ bgroup "filteringX4"
@@ -440,7 +483,7 @@ o_1_space_filteringX4 value =
440 , benchIOSink value "filterM-all-out" (filterMAllOut value 4)
483 , benchIOSink value "filterM-all-out" (filterMAllOut value 4)
441 , benchIOSink value "filterM-all-in" (filterMAllIn value 4)
484 , benchIOSink value "filterM-all-in" (filterMAllIn value 4)
443− , benchIOSink value "foldFilter-even" (foldFilterEven 4)
486+ --, benchIOSink value "foldFilter-even" (foldFilterEven 4)
445 -- trimming
488 -- trimming
446 , benchIOSink value "take-all" (takeAll value 4)
489 , benchIOSink value "take-all" (takeAll value 4)
@@ -458,10 +501,11 @@ o_1_space_filteringX4 value =
459 , benchIOSink value "uniq" (uniq 4)
502 , benchIOSink value "uniq" (uniq 4)
461 -- map and filter
505 -- map and filter
462 , benchIOSink value "mapMaybe" (mapMaybe 4)
506 , benchIOSink value "mapMaybe" (mapMaybe 4)
463 , benchIOSink value "mapMaybeM" (mapMaybeM 4)
507 , benchIOSink value "mapMaybeM" (mapMaybeM 4)
465 -- searching
509 -- searching
466 , benchIOSink value "findIndices" (findIndices value 4)
510 , benchIOSink value "findIndices" (findIndices value 4)
467 , benchIOSink value "elemIndices" (elemIndices value 4)
511 , benchIOSink value "elemIndices" (elemIndices value 4)
@@ -471,28 +515,29 @@ o_1_space_filteringX4 value =
471-------------------------------------------------------------------------------
515-------------------------------------------------------------------------------
472-- Size increasing transformations (insertions)
516-- Size increasing transformations (insertions)
473-------------------------------------------------------------------------------
517-------------------------------------------------------------------------------
474−
518+#ifdef USE_PRELUDE
475{-# INLINE intersperse #-}
519{-# INLINE intersperse #-}
476intersperse :: S.MonadAsync m => Int -> Int -> SerialT m Int -> m ()
520intersperse :: S.MonadAsync m => Int -> Int -> SerialT m Int -> m ()
477−intersperse value n = composeN n $ S.intersperse (value + 1)
521+intersperse value n = composeNG n $ S.intersperse (value + 1)
479{-# INLINE intersperseM #-}
523{-# INLINE intersperseM #-}
480intersperseM :: S.MonadAsync m => Int -> Int -> SerialT m Int -> m ()
524intersperseM :: S.MonadAsync m => Int -> Int -> SerialT m Int -> m ()
481−intersperseM value n = composeN n $ S.intersperseM (return $ value + 1)
525+intersperseM value n = composeNG n $ S.intersperseM (return $ value + 1)
483−{-# INLINE insertBy #-}
484−insertBy :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
485−insertBy value n = composeN n $ S.insertBy compare (value + 1)
487{-# INLINE interposeSuffix #-}
527{-# INLINE interposeSuffix #-}
488interposeSuffix :: S.MonadAsync m => Int -> Int -> SerialT m Int -> m ()
528interposeSuffix :: S.MonadAsync m => Int -> Int -> SerialT m Int -> m ()
489interposeSuffix value n =
529interposeSuffix value n =
490− composeN n $ Internal.interposeSuffix (value + 1) Unfold.identity
530+ composeNG n $ Internal.interposeSuffix (value + 1) Unfold.identity
492{-# INLINE intercalateSuffix #-}
532{-# INLINE intercalateSuffix #-}
493intercalateSuffix :: S.MonadAsync m => Int -> Int -> SerialT m Int -> m ()
533intercalateSuffix :: S.MonadAsync m => Int -> Int -> SerialT m Int -> m ()
494intercalateSuffix value n =
534intercalateSuffix value n =
495− composeN n $ Internal.intercalateSuffix Unfold.identity (value + 1)
535+ composeNG n $ Internal.intercalateSuffix Unfold.identity (value + 1)
537+{-# INLINE insertBy #-}
538+insertBy :: MonadIO m => Int -> Int -> SerialT m Int -> m ()
539+insertBy value n = composeNG n $ S.insertBy compare (value + 1)
497o_1_space_inserting :: Int -> [Benchmark]
542o_1_space_inserting :: Int -> [Benchmark]
498o_1_space_inserting value =
543o_1_space_inserting value =
@@ -509,14 +554,14 @@ o_1_space_insertingX4 :: Int -> [Benchmark]
509o_1_space_insertingX4 value =
554o_1_space_insertingX4 value =
510 [ bgroup "insertingX4"
555 [ bgroup "insertingX4"
511 [ benchIOSink value "intersperse" (intersperse value 4)
556 [ benchIOSink value "intersperse" (intersperse value 4)
512− , benchIOSink value "insertBy" (insertBy value 4)
557+ -- , benchIOSink value "insertBy" (insertBy value 4)
516-------------------------------------------------------------------------------
561-------------------------------------------------------------------------------
517-- Indexing
562-- Indexing
518-------------------------------------------------------------------------------
563-------------------------------------------------------------------------------
519−
564+#ifdef USE_PRELUDE
520{-# INLINE indexed #-}
565{-# INLINE indexed #-}
521indexed :: MonadIO m => Int -> SerialT m Int -> m ()
566indexed :: MonadIO m => Int -> SerialT m Int -> m ()
522indexed n = composeN n (S.map snd . S.indexed)
567indexed n = composeN n (S.map snd . S.indexed)
@@ -541,6 +586,24 @@ o_1_space_indexingX4 value =
590+{-# INLINE indexed #-}
591+indexed :: MonadIO m => SerialT m Int -> m ()
592+indexed = Stream.fold FL.drain . Prelude.fmap snd . Stream.indexed
594+{-# INLINE indexedR #-}
595+indexedR :: MonadIO m => Int -> SerialT m Int -> m ()
596+indexedR value = Stream.fold FL.drain . (Prelude.fmap snd . Stream.indexedR value)
598+o_1_space_indexing :: Int -> [Benchmark]
599+o_1_space_indexing value =
601+ [ benchIOSink value "indexed" indexed
602+ , benchIOSink value "indexedR" (indexedR value)
544-------------------------------------------------------------------------------
607-------------------------------------------------------------------------------
546-------------------------------------------------------------------------------
609-------------------------------------------------------------------------------
@@ -551,18 +614,23 @@ o_1_space_indexingX4 value =
551benchmarks :: String -> Int -> [Benchmark]
614benchmarks :: String -> Int -> [Benchmark]
552benchmarks moduleName size =
615benchmarks moduleName size =
553 [ bgroup (o_1_space_prefix moduleName) $ Prelude.concat
616 [ bgroup (o_1_space_prefix moduleName) $ Prelude.concat
554− [ o_1_space_functor size
555− , o_1_space_mapping size
617+ [ o_1_space_mapping size
556− , o_1_space_mappingX4 size
618+ , o_1_space_indexing size
557 , o_1_space_filtering size
619 , o_1_space_filtering size
558 , o_1_space_filteringX4 size
620 , o_1_space_filteringX4 size
622+ , o_1_space_functor size
623+ , o_1_space_mappingX4 size
559 , o_1_space_inserting size
624 , o_1_space_inserting size
560 , o_1_space_insertingX4 size
625 , o_1_space_insertingX4 size
561− , o_1_space_indexing size
562 , o_1_space_indexingX4 size
626 , o_1_space_indexingX4 size
564− , bgroup (o_n_space_prefix moduleName) $ Prelude.concat
630+ , bgroup (o_n_space_prefix moduleName) $
632+ o_n_space_mapping size
565− [ o_n_space_traversable size
634+ o_n_space_traversable size
566− , o_n_space_mapping size
635+#endif