on master help sign in
Improve benchmarking of base streams
628355fHarendra Kumar
bench.sh+14−4
@@ -2,17 +2,21 @@
2
2
3print_help () {
3print_help () {
4 echo "Usage: $0 "
4 echo "Usage: $0 "
5− echo " [--compare] [--base commit] [--candidate commit]"
6 echo " [--benchmarks <all|linear|linear-async|linear-rate|nested|base>]"
5 echo " [--benchmarks <all|linear|linear-async|linear-rate|nested|base>]"
6+ echo " [--group-diff]"
7 echo " [--graphs]"
7 echo " [--graphs]"
8− echo " [--slow]"
9 echo " [--no-measure]"
8 echo " [--no-measure]"
10 echo " [--append] "
9 echo " [--append] "
10+ echo " [--compare] [--base commit] [--candidate commit]"
11+ echo " [--slow]"
11 echo " -- <gauge options>"
12 echo " -- <gauge options>"
12 echo
13 echo
13 echo "Multiple benchmarks can be specified as a space separate list"
14 echo "Multiple benchmarks can be specified as a space separate list"
14 echo " e.g. --benchmarks \"linear nested\""
15 echo " e.g. --benchmarks \"linear nested\""
15 echo
16 echo
17+ echo "--group-diff is used to compare groups within a single benchmark"
18+ echo " e.g. StreamD vs StreamK in base benchmark."
19+ echo
16 echo "When using --compare, by default comparative chart of HEAD^ vs HEAD"
20 echo "When using --compare, by default comparative chart of HEAD^ vs HEAD"
17 echo "commit is generated, in the 'charts' directory."
21 echo "commit is generated, in the 'charts' directory."
18 echo "Use --base and --candidate to select the commits to compare."
22 echo "Use --base and --candidate to select the commits to compare."
@@ -205,7 +209,9 @@ run_reports() {
205 for i in $1
209 for i in $1
206 do
210 do
207 echo "Generating reports for ${i}..."
211 echo "Generating reports for ${i}..."
208− $prog $(test "$GRAPH" = 1 && echo "--graphs") --benchmark $i
212+ $prog $(test "$GRAPH" = 1 && echo "--graphs") \
213+ $(test "$GROUP_DIFF" = 1 && echo "--group-diff") \
214+ --benchmark $i
209 done
215 done
210}
216}
211
217
@@ -215,6 +221,7 @@ run_reports() {
215
221
216DEFAULT_BENCHMARKS="linear"
222DEFAULT_BENCHMARKS="linear"
217ALL_BENCHMARKS="linear linear-async linear-rate nested base"
223ALL_BENCHMARKS="linear linear-async linear-rate nested base"
224+GROUP_DIFF=0
218
225
219COMPARE=0
226COMPARE=0
220BASE=
227BASE=
@@ -239,13 +246,16 @@ while test -n "$1"
239do
246do
240 case $1 in
247 case $1 in
241 -h|--help|help) print_help ;;
248 -h|--help|help) print_help ;;
249+ # options with arguments
242 --slow) SPEED_OPTIONS="--min-duration 0"; shift ;;
250 --slow) SPEED_OPTIONS="--min-duration 0"; shift ;;
243− --append) APPEND=1; shift ;;
244 --benchmarks) shift; BENCHMARKS=$1; shift ;;
251 --benchmarks) shift; BENCHMARKS=$1; shift ;;
245 --base) shift; BASE=$1; shift ;;
252 --base) shift; BASE=$1; shift ;;
246 --candidate) shift; CANDIDATE=$1; shift ;;
253 --candidate) shift; CANDIDATE=$1; shift ;;
254+ # flags
247 --compare) COMPARE=1; shift ;;
255 --compare) COMPARE=1; shift ;;
248 --raw) RAW=1; shift ;;
256 --raw) RAW=1; shift ;;
257+ --append) APPEND=1; shift ;;
258+ --group-diff) GROUP_DIFF=1; shift ;;
249 --graphs) GRAPH=1; shift ;;
259 --graphs) GRAPH=1; shift ;;
250 --no-measure) MEASURE=0; shift ;;
260 --no-measure) MEASURE=0; shift ;;
251 --) shift; break ;;
261 --) shift; break ;;
benchmark/BaseStreams.hs+51−34
@@ -48,34 +48,47 @@ main =
48 , benchFold "tail" D.tail D.sourceUnfoldrM
48 , benchFold "tail" D.tail D.sourceUnfoldrM
49 , benchIO "nullTail" D.nullTail D.sourceUnfoldrM
49 , benchIO "nullTail" D.nullTail D.sourceUnfoldrM
50 , benchIO "headTail" D.headTail D.sourceUnfoldrM
50 , benchIO "headTail" D.headTail D.sourceUnfoldrM
51+ , benchFold "toList" K.toList K.sourceUnfoldrM
52+ , benchFold "fold" K.foldl K.sourceUnfoldrM
53+ , benchFold "last" K.last K.sourceUnfoldrM
51 ]
54 ]
52 , bgroup "transformation"
55 , bgroup "transformation"
53− [ benchIO "scan" (D.scan 1) D.sourceUnfoldrM
56+ [ benchIO "scan" (D.scan 1) D.sourceUnfoldrM
57+ , benchIO "map" (D.map 1) D.sourceUnfoldrM
54− , benchIO "map" (D.map 1) D.sourceUnfoldrM
58+ , benchIO "fmap" (D.fmap 1) D.sourceUnfoldrM
55− , benchIO "mapM" (D.mapM 1) D.sourceUnfoldrM
59+ , benchIO "mapM" (D.mapM 1) D.sourceUnfoldrM
60+ , benchIO "mapMaybe" (D.mapMaybe 1) D.sourceUnfoldrM
61+ , benchIO "mapMaybeM" (D.mapMaybeM 1) D.sourceUnfoldrM
56 ]
62 ]
57 , bgroup "transformationN"
63 , bgroup "transformationN"
58− [ benchIO "scan" (D.scan 4) D.sourceUnfoldrM
64+ [ benchIO "scan" (D.scan 4) D.sourceUnfoldrM
65+ , benchIO "map" (D.map 4) D.sourceUnfoldrM
59− , benchIO "map" (D.map 4) D.sourceUnfoldrM
66+ , benchIO "fmap" (D.fmap 4) D.sourceUnfoldrM
60− , benchIO "mapM" (D.mapM 4) D.sourceUnfoldrM
67+ , benchIO "mapM" (D.mapM 4) D.sourceUnfoldrM
68+ , benchIO "mapMaybe" (D.mapMaybe 4) D.sourceUnfoldrM
69+ , benchIO "mapMaybeM" (D.mapMaybeM 4) D.sourceUnfoldrM
61 ]
70 ]
62 , bgroup "filtering"
71 , bgroup "filtering"
63− [ benchIO "filter-even" (D.filterEven 1) D.sourceUnfoldrM
72+ [ benchIO "filter-even" (D.filterEven 1) D.sourceUnfoldrM
64− , benchIO "filter-all-out" (D.filterAllOut 1) D.sourceUnfoldrM
73+ , benchIO "filter-all-out" (D.filterAllOut 1) D.sourceUnfoldrM
65− , benchIO "filter-all-in" (D.filterAllIn 1) D.sourceUnfoldrM
74+ , benchIO "filter-all-in" (D.filterAllIn 1) D.sourceUnfoldrM
66− , benchIO "take-all" (D.takeAll 1) D.sourceUnfoldrM
75+ , benchIO "take-all" (D.takeAll 1) D.sourceUnfoldrM
67− , benchIO "takeWhile-true" (D.takeWhileTrue 1) D.sourceUnfoldrM
76+ , benchIO "takeWhile-true" (D.takeWhileTrue 1) D.sourceUnfoldrM
77+ , benchIO "drop-one" (D.dropOne 1) D.sourceUnfoldrM
68− , benchIO "drop-all" (D.dropAll 1) D.sourceUnfoldrM
78+ , benchIO "drop-all" (D.dropAll 1) D.sourceUnfoldrM
69− , benchIO "dropWhile-true" (D.dropWhileTrue 1) D.sourceUnfoldrM
79+ , benchIO "dropWhile-true" (D.dropWhileTrue 1) D.sourceUnfoldrM
80+ , benchIO "dropWhile-false" (D.dropWhileFalse 1) D.sourceUnfoldrM
70 ]
81 ]
71 , bgroup "filteringN"
82 , bgroup "filteringN"
72− [ benchIO "filter-even" (D.filterEven 4) D.sourceUnfoldrM
83+ [ benchIO "filter-even" (D.filterEven 4) D.sourceUnfoldrM
73− , benchIO "filter-all-out" (D.filterAllOut 4) D.sourceUnfoldrM
84+ , benchIO "filter-all-out" (D.filterAllOut 4) D.sourceUnfoldrM
74− , benchIO "filter-all-in" (D.filterAllIn 4) D.sourceUnfoldrM
85+ , benchIO "filter-all-in" (D.filterAllIn 4) D.sourceUnfoldrM
75− , benchIO "take-all" (D.takeAll 4) D.sourceUnfoldrM
86+ , benchIO "take-all" (D.takeAll 4) D.sourceUnfoldrM
76− , benchIO "takeWhile-true" (D.takeWhileTrue 4) D.sourceUnfoldrM
87+ , benchIO "takeWhile-true" (D.takeWhileTrue 4) D.sourceUnfoldrM
88+ , benchIO "drop-one" (D.dropOne 4) D.sourceUnfoldrM
77− , benchIO "drop-all" (D.dropAll 4) D.sourceUnfoldrM
89+ , benchIO "drop-all" (D.dropAll 4) D.sourceUnfoldrM
78− , benchIO "dropWhile-true" (D.dropWhileTrue 4) D.sourceUnfoldrM
90+ , benchIO "dropWhile-true" (D.dropWhileTrue 4) D.sourceUnfoldrM
91+ , benchIO "dropWhile-false" (D.dropWhileFalse 4) D.sourceUnfoldrM
79 ]
92 ]
80 , benchIO "zip" D.zip D.sourceUnfoldrM
93 , benchIO "zip" D.zip D.sourceUnfoldrM
81 , bgroup "composed"
94 , bgroup "composed"
@@ -128,22 +141,26 @@ main =
128 -- , benchIO "concat" K.concat K.sourceUnfoldrM
141 -- , benchIO "concat" K.concat K.sourceUnfoldrM
129 ]
142 ]
130 , bgroup "filtering"
143 , bgroup "filtering"
131− [ benchIO "filter-even" (K.filterEven 1) K.sourceUnfoldrM
144+ [ benchIO "filter-even" (K.filterEven 1) K.sourceUnfoldrM
132− , benchIO "filter-all-out" (K.filterAllOut 1) K.sourceUnfoldrM
145+ , benchIO "filter-all-out" (K.filterAllOut 1) K.sourceUnfoldrM
133− , benchIO "filter-all-in" (K.filterAllIn 1) K.sourceUnfoldrM
146+ , benchIO "filter-all-in" (K.filterAllIn 1) K.sourceUnfoldrM
134− , benchIO "take-all" (K.takeAll 1) K.sourceUnfoldrM
147+ , benchIO "take-all" (K.takeAll 1) K.sourceUnfoldrM
135− , benchIO "takeWhile-true" (K.takeWhileTrue 1) K.sourceUnfoldrM
148+ , benchIO "takeWhile-true" (K.takeWhileTrue 1) K.sourceUnfoldrM
149+ , benchIO "drop-one" (K.dropOne 1) K.sourceUnfoldrM
136− , benchIO "drop-all" (K.dropAll 1) K.sourceUnfoldrM
150+ , benchIO "drop-all" (K.dropAll 1) K.sourceUnfoldrM
137− , benchIO "dropWhile-true" (K.dropWhileTrue 1) K.sourceUnfoldrM
151+ , benchIO "dropWhile-true" (K.dropWhileTrue 1) K.sourceUnfoldrM
152+ , benchIO "dropWhile-false" (K.dropWhileFalse 1) K.sourceUnfoldrM
138 ]
153 ]
139 , bgroup "filteringN"
154 , bgroup "filteringN"
140− [ benchIO "filter-even" (K.filterEven 4) K.sourceUnfoldrM
155+ [ benchIO "filter-even" (K.filterEven 4) K.sourceUnfoldrM
141− , benchIO "filter-all-out" (K.filterAllOut 4) K.sourceUnfoldrM
156+ , benchIO "filter-all-out" (K.filterAllOut 4) K.sourceUnfoldrM
142− , benchIO "filter-all-in" (K.filterAllIn 4) K.sourceUnfoldrM
157+ , benchIO "filter-all-in" (K.filterAllIn 4) K.sourceUnfoldrM
143− , benchIO "take-all" (K.takeAll 4) K.sourceUnfoldrM
158+ , benchIO "take-all" (K.takeAll 4) K.sourceUnfoldrM
144− , benchIO "takeWhile-true" (K.takeWhileTrue 4) K.sourceUnfoldrM
159+ , benchIO "takeWhile-true" (K.takeWhileTrue 4) K.sourceUnfoldrM
160+ , benchIO "drop-one" (K.dropOne 4) K.sourceUnfoldrM
145− , benchIO "drop-all" (K.dropAll 4) K.sourceUnfoldrM
161+ , benchIO "drop-all" (K.dropAll 4) K.sourceUnfoldrM
146− , benchIO "dropWhile-true" (K.dropWhileTrue 4) K.sourceUnfoldrM
162+ , benchIO "dropWhile-true" (K.dropWhileTrue 4) K.sourceUnfoldrM
163+ , benchIO "dropWhile-false" (K.dropWhileFalse 4) K.sourceUnfoldrM
147 ]
164 ]
148 , benchIO "zip" K.zip K.sourceUnfoldrM
165 , benchIO "zip" K.zip K.sourceUnfoldrM
149 , bgroup "composed"
166 , bgroup "composed"
benchmark/Chart.hs+51−30
@@ -21,18 +21,24 @@ import BenchShow
21------------------------------------------------------------------------------
21------------------------------------------------------------------------------
22
22
23data BenchType = Linear | LinearAsync | LinearRate | Nested | Base
23data BenchType = Linear | LinearAsync | LinearRate | Nested | Base
24+ deriving Show
24
25
25data Options = Options
26data Options = Options
26 { genGraphs :: Bool
27 { genGraphs :: Bool
28+ , groupDiff :: Bool
27 , benchType :: BenchType
29 , benchType :: BenchType
28− }
30+ } deriving Show
29
31
30−defaultOptions = Options False Linear
32+defaultOptions = Options False False Linear
31
33
32setGenGraphs val = do
34setGenGraphs val = do
33 (args, opts) <- get
35 (args, opts) <- get
34 put (args, opts { genGraphs = val })
36 put (args, opts { genGraphs = val })
35
37
38+setGroupDiff val = do
39+ (args, opts) <- get
40+ put (args, opts { groupDiff = val })
41+
36setBenchType val = do
42setBenchType val = do
37 (args, opts) <- get
43 (args, opts) <- get
38 put (args, opts { benchType = val })
44 put (args, opts { benchType = val })
@@ -66,15 +72,25 @@ parseOptions :: IO (Maybe Options)
66parseOptions = do
72parseOptions = do
67 args <- getArgs
73 args <- getArgs
68 runMaybeT $ flip evalStateT (args, defaultOptions) $ do
74 runMaybeT $ flip evalStateT (args, defaultOptions) $ do
69− x <- shift
75+ parseLoop
76+ fmap snd get
77+
78+ where
79+
80+ parseOpt opt =
70− case x of
81+ case opt of
71− Just "--graphs" -> setGenGraphs True
82+ "--graphs" -> setGenGraphs True
83+ "--group-diff" -> setGroupDiff True
72− Just "--benchmark" -> parseBench
84+ "--benchmark" -> parseBench
73− Just str -> do
85+ str -> do
74 liftIO $ putStrLn $ "Unrecognized option " <> str
86 liftIO $ putStrLn $ "Unrecognized option " <> str
75 mzero
87 mzero
88+
89+ parseLoop = do
90+ next <- shift
91+ case next of
92+ Just opt -> parseOpt opt >> parseLoop
76 Nothing -> return ()
93 Nothing -> return ()
77− fmap snd get
78
94
79ignoringErr a = catch a (\(ErrorCall err :: ErrorCall) ->
95ignoringErr a = catch a (\(ErrorCall err :: ErrorCall) ->
80 putStrLn $ "Failed with error:\n" <> err <> "\nSkipping.")
96 putStrLn $ "Failed with error:\n" <> err <> "\nSkipping.")
@@ -169,13 +185,27 @@ makeLinearRateGraphs cfg inputFile = do
169 return ()
185 return ()
170
186
171------------------------------------------------------------------------------
187------------------------------------------------------------------------------
172−-- Charts for base streams
188+-- Reports/Charts for base streams
173------------------------------------------------------------------------------
189------------------------------------------------------------------------------
174
190
175−makeBaseGraphs :: Config -> String -> IO ()
191+classifyBase b
176−makeBaseGraphs cfg inputFile = do
192+ | "streamD/" `isPrefixOf` b = ("streamD",) <$> stripPrefix "streamD/" b
177− putStrLn "Not implemented"
193+ | "streamK/" `isPrefixOf` b = ("streamK",) <$> stripPrefix "streamK/" b
178− return ()
194+ | otherwise = Nothing
195+
196+showStreamDVsK Options{..} cfg inp out =
197+ let cfg' = cfg { classifyBenchmark = classifyBase }
198+ in if genGraphs
199+ then ignoringErr $ graph inp "streamD-vs-streamK"
200+ cfg' {outputDir = Just out}
201+ else ignoringErr $ report inp Nothing cfg'
202+
203+showBaseStreams Options{..} cfg inp out =
204+ let cfg' = cfg { classifyBenchmark = classifyBase }
205+ in if genGraphs
206+ then ignoringErr $ graph inp "streamD"
207+ cfg' {outputDir = Just out}
208+ else ignoringErr $ report inp Nothing cfg'
179
209
180------------------------------------------------------------------------------
210------------------------------------------------------------------------------
181-- text reports
211-- text reports
@@ -195,20 +225,6 @@ benchShow Options{..} cfg func inp out =
195 then func cfg {outputDir = Just out} inp
225 then func cfg {outputDir = Just out} inp
196 else ignoringErr $ report inp Nothing cfg
226 else ignoringErr $ report inp Nothing cfg
197
227
198−showStreamDVsK Options{..} cfg func inp out =
199− let cfg' = cfg { classifyBenchmark = classify }
200− in if genGraphs
201− then ignoringErr $ graph inp "streamD-vs-streamK"
202− cfg' {outputDir = Just out}
203− else ignoringErr $ report inp Nothing cfg'
204−
205− where
206−
207− classify b
208− | "streamD/" `isPrefixOf` b = ("streamD",) <$> stripPrefix "streamD/" b
209− | "streamK/" `isPrefixOf` b = ("streamK",) <$> stripPrefix "streamK/" b
210− | otherwise = Nothing
211−
212main :: IO ()
228main :: IO ()
213main = do
229main = do
214 let cfg = defaultConfig
230 let cfg = defaultConfig
@@ -235,6 +251,11 @@ main = do
235 Nested -> benchShow opts cfg makeNestedGraphs
251 Nested -> benchShow opts cfg makeNestedGraphs
236 "charts/nested/results.csv"
252 "charts/nested/results.csv"
237 "charts/nested"
253 "charts/nested"
254+ Base ->
255+ if groupDiff
238− Base -> showStreamDVsK opts cfg makeBaseGraphs
256+ then showStreamDVsK opts cfg
257+ "charts/base/results.csv"
258+ "charts/base"
259+ else showBaseStreams opts cfg
239− "charts/base/results.csv"
260+ "charts/base/results.csv"
240− "charts/base"
261+ "charts/base"
benchmark/StreamDOps.hs+21−5
@@ -14,7 +14,7 @@ import Data.Maybe (isJust)
14import Prelude
14import Prelude
15 (Monad, Int, (+), ($), (.), return, (>), even, (<=),
15 (Monad, Int, (+), ($), (.), return, (>), even, (<=),
16 subtract, undefined, Maybe(..), not, mapM_, (>>=),
16 subtract, undefined, Maybe(..), not, mapM_, (>>=),
17− maxBound)
17+ maxBound, fmap, odd)
18
18
19import qualified Streamly.Streams.StreamD as S
19import qualified Streamly.Streams.StreamD as S
20
20
@@ -138,31 +138,47 @@ composeN n f =
138
138
139{-# INLINE scan #-}
139{-# INLINE scan #-}
140{-# INLINE map #-}
140{-# INLINE map #-}
141+{-# INLINE fmap #-}
141{-# INLINE mapM #-}
142{-# INLINE mapM #-}
143+{-# INLINE mapMaybe #-}
142{-# INLINE filterEven #-}
144{-# INLINE filterEven #-}
143{-# INLINE filterAllOut #-}
145{-# INLINE filterAllOut #-}
144{-# INLINE filterAllIn #-}
146{-# INLINE filterAllIn #-}
145{-# INLINE takeOne #-}
147{-# INLINE takeOne #-}
146{-# INLINE takeAll #-}
148{-# INLINE takeAll #-}
147{-# INLINE takeWhileTrue #-}
149{-# INLINE takeWhileTrue #-}
150+{-# INLINE takeWhileMTrue #-}
151+{-# INLINE dropOne #-}
148{-# INLINE dropAll #-}
152{-# INLINE dropAll #-}
149{-# INLINE dropWhileTrue #-}
153{-# INLINE dropWhileTrue #-}
154+{-# INLINE dropWhileMTrue #-}
155+{-# INLINE dropWhileFalse #-}
150−scan, map, mapM, filterEven, filterAllOut,
156+scan, map, fmap, mapM, mapMaybe, mapMaybeM, filterEven, filterAllOut,
151− filterAllIn, takeOne, takeAll, takeWhileTrue, dropAll, dropWhileTrue
157+ filterAllIn, takeOne, takeAll, takeWhileTrue, takeWhileMTrue, dropOne,
158+ dropAll, dropWhileTrue, dropWhileMTrue, dropWhileFalse
152 :: Monad m
159 :: Monad m
153 => Int -> Stream m Int -> m ()
160 => Int -> Stream m Int -> m ()
154
161
155scan n = composeN n $ S.scanl' (+) 0
162scan n = composeN n $ S.scanl' (+) 0
163+fmap n = composeN n $ Prelude.fmap (+1)
156map n = composeN n $ S.map (+1)
164map n = composeN n $ S.map (+1)
157mapM n = composeN n $ S.mapM return
165mapM n = composeN n $ S.mapM return
166+mapMaybe n = composeN n $ S.mapMaybe
167+ (\x -> if Prelude.odd x then Nothing else Just x)
168+mapMaybeM n = composeN n $ S.mapMaybeM
169+ (\x -> if Prelude.odd x then return Nothing else return $ Just x)
158filterEven n = composeN n $ S.filter even
170filterEven n = composeN n $ S.filter even
159filterAllOut n = composeN n $ S.filter (> maxValue)
171filterAllOut n = composeN n $ S.filter (> maxValue)
160filterAllIn n = composeN n $ S.filter (<= maxValue)
172filterAllIn n = composeN n $ S.filter (<= maxValue)
161takeOne n = composeN n $ S.take 1
173takeOne n = composeN n $ S.take 1
162takeAll n = composeN n $ S.take maxValue
174takeAll n = composeN n $ S.take maxValue
163takeWhileTrue n = composeN n $ S.takeWhile (<= maxValue)
175takeWhileTrue n = composeN n $ S.takeWhile (<= maxValue)
176+takeWhileMTrue n = composeN n $ S.takeWhileM (return . (<= maxValue))
177+dropOne n = composeN n $ S.drop 1
164−dropAll n = composeN n $ S.drop maxValue
178+dropAll n = composeN n $ S.drop maxValue
179+dropWhileTrue n = composeN n $ S.dropWhile (<= maxValue)
180+dropWhileMTrue n = composeN n $ S.dropWhileM (return . (<= maxValue))
165−dropWhileTrue n = composeN n $ S.dropWhile (<= maxValue)
181+dropWhileFalse n = composeN n $ S.dropWhile (<= 1)
166
182
167-------------------------------------------------------------------------------
183-------------------------------------------------------------------------------
168-- Zipping and concat
184-- Zipping and concat
benchmark/StreamKOps.hs+17−12
@@ -162,27 +162,32 @@ composeN n f =
162{-# INLINE takeOne #-}
162{-# INLINE takeOne #-}
163{-# INLINE takeAll #-}
163{-# INLINE takeAll #-}
164{-# INLINE takeWhileTrue #-}
164{-# INLINE takeWhileTrue #-}
165+{-# INLINE dropOne #-}
165{-# INLINE dropAll #-}
166{-# INLINE dropAll #-}
166{-# INLINE dropWhileTrue #-}
167{-# INLINE dropWhileTrue #-}
168+{-# INLINE dropWhileFalse #-}
167scan, map, filterEven, filterAllOut,
169scan, map, filterEven, filterAllOut,
168− filterAllIn, takeOne, takeAll, takeWhileTrue, dropAll, dropWhileTrue
170+ filterAllIn, takeOne, takeAll, takeWhileTrue, dropAll, dropOne,
171+ dropWhileTrue, dropWhileFalse
169 :: Monad m
172 :: Monad m
170 => Int -> Stream m Int -> m ()
173 => Int -> Stream m Int -> m ()
171
174
172{-# INLINE mapM #-}
175{-# INLINE mapM #-}
173mapM :: S.MonadAsync m => Int -> Stream m Int -> m ()
176mapM :: S.MonadAsync m => Int -> Stream m Int -> m ()
174
177
175−scan n = composeN n $ S.scanl' (+) 0
178+scan n = composeN n $ S.scanl' (+) 0
176−map n = composeN n $ fmap (+1)
179+map n = composeN n $ fmap (+1)
177−mapM n = composeN n $ S.mapM return
180+mapM n = composeN n $ S.mapM return
178−filterEven n = composeN n $ S.filter even
181+filterEven n = composeN n $ S.filter even
179−filterAllOut n = composeN n $ S.filter (> maxValue)
182+filterAllOut n = composeN n $ S.filter (> maxValue)
180−filterAllIn n = composeN n $ S.filter (<= maxValue)
183+filterAllIn n = composeN n $ S.filter (<= maxValue)
181−takeOne n = composeN n $ S.take 1
184+takeOne n = composeN n $ S.take 1
182−takeAll n = composeN n $ S.take maxValue
185+takeAll n = composeN n $ S.take maxValue
183−takeWhileTrue n = composeN n $ S.takeWhile (<= maxValue)
186+takeWhileTrue n = composeN n $ S.takeWhile (<= maxValue)
187+dropOne n = composeN n $ S.drop 1
184−dropAll n = composeN n $ S.drop maxValue
188+dropAll n = composeN n $ S.drop maxValue
189+dropWhileTrue n = composeN n $ S.dropWhile (<= maxValue)
185−dropWhileTrue n = composeN n $ S.dropWhile (<= maxValue)
190+dropWhileFalse n = composeN n $ S.dropWhile (<= 1)
186
191
187-------------------------------------------------------------------------------
192-------------------------------------------------------------------------------
188-- Zipping and concat
193-- Zipping and concat