@@ -287,56 +287,6 @@ currentTime value g _ = S.take value $ Internal.currentTime g
287runStream :: Monad m => Stream m a -> m ()
287runStream :: Monad m => Stream m a -> m ()
288runStream = S.drain
288runStream = S.drain
290−{-# INLINE toList #-}
291−toList :: Monad m => Stream m Int -> m [Int]
295−{-# INLINE maximum #-}
296−{-# INLINE minimum #-}
298−{-# INLINE findIndex #-}
299−{-# INLINE elemIndex #-}
300−{-# INLINE foldl1'Reduce #-}
301−_head, last, minimum, maximum, foldl1'Reduce
302− :: Monad m => Stream m Int -> m (Maybe Int)
304−find, findIndex, elemIndex
305− :: Monad m => Int -> Stream m Int -> m (Maybe Int)
307−{-# INLINE minimumBy #-}
308−{-# INLINE maximumBy #-}
309−minimumBy, maximumBy :: Monad m => Stream m Int -> m (Maybe Int)
311−{-# INLINE foldl'Reduce #-}
312−{-# INLINE foldl'ReduceMap #-}
313−{-# INLINE foldlM'Reduce #-}
314−{-# INLINE foldrMReduce #-}
315−{-# INLINE length #-}
317−{-# INLINE product #-}
318−foldl'Reduce, foldl'ReduceMap, foldlM'Reduce, foldrMReduce, length, sum, product
320− => Stream m Int -> m Int
322−{-# INLINE foldl'Build #-}
323−{-# INLINE foldlM'Build #-}
324−{-# INLINE foldrMBuild #-}
325−foldrMBuild, foldl'Build, foldlM'Build
327− => Stream m Int -> m [Int]
335−{-# INLINE notElem #-}
336−_null :: Monad m => Stream m Int -> m Bool
338−elem, notElem, all, any, and, or :: Monad m => Int -> Stream m Int -> m Bool
340{-# INLINE toNull #-}
290{-# INLINE toNull #-}
341toNull :: Monad m => (t m a -> S.SerialT m a) -> t m a -> m ()
291toNull :: Monad m => (t m a -> S.SerialT m a) -> t m a -> m ()
342toNull t = runStream . t
292toNull t = runStream . t
@@ -367,8 +317,10 @@ nullHeadTail s = do
368{-# INLINE mapM_ #-}
318{-# INLINE mapM_ #-}
369mapM_ :: Monad m => Stream m Int -> m ()
319mapM_ :: Monad m => Stream m Int -> m ()
370−mapM_ = S.mapM_ (\_ -> return ())
320+mapM_ = S.mapM_ (\_ -> return ())
322+{-# INLINE toList #-}
323+toList :: Monad m => Stream m Int -> m [Int]
372toList = S.toList
324toList = S.toList
374{-# INLINE toListRev #-}
326{-# INLINE toListRev #-}
@@ -377,41 +329,125 @@ toListRev = Internal.toListRev
378{-# INLINE foldrMElem #-}
330{-# INLINE foldrMElem #-}
379foldrMElem :: Monad m => Int -> Stream m Int -> m Bool
331foldrMElem :: Monad m => Int -> Stream m Int -> m Bool
380−foldrMElem e m = S.foldrM (\x xs -> if x == e then return P.True else xs)
336+ then return P.True
381− (return P.False) m
338+ (return P.False)
383{-# INLINE foldrMToStream #-}
341{-# INLINE foldrMToStream #-}
384foldrMToStream :: Monad m => Stream m Int -> m (Stream Identity Int)
342foldrMToStream :: Monad m => Stream m Int -> m (Stream Identity Int)
385−foldrMToStream = S.foldr S.cons S.nil
343+foldrMToStream = S.foldr S.cons S.nil
345+{-# INLINE foldrMBuild #-}
346+foldrMBuild :: Monad m => Stream m Int -> m [Int]
347+foldrMBuild = S.foldrM (\x xs -> xs >>= return . (x :)) (return [])
387−foldrMBuild = S.foldrM (\x xs -> xs >>= return . (x :)) (return [])
349+{-# INLINE foldl'Build #-}
350+foldl'Build :: Monad m => Stream m Int -> m [Int]
388foldl'Build = S.foldl' (flip (:)) []
351foldl'Build = S.foldl' (flip (:)) []
353+{-# INLINE foldlM'Build #-}
354+foldlM'Build :: Monad m => Stream m Int -> m [Int]
389foldlM'Build = S.foldlM' (\xs x -> return $ x : xs) []
355foldlM'Build = S.foldlM' (\xs x -> return $ x : xs) []
357+{-# INLINE foldrMReduce #-}
358+foldrMReduce :: Monad m => Stream m Int -> m Int
391foldrMReduce = S.foldrM (\x xs -> xs >>= return . (x +)) (return 0)
359foldrMReduce = S.foldrM (\x xs -> xs >>= return . (x +)) (return 0)
361+{-# INLINE foldl'Reduce #-}
362+foldl'Reduce :: Monad m => Stream m Int -> m Int
392foldl'Reduce = S.foldl' (+) 0
363foldl'Reduce = S.foldl' (+) 0
365+{-# INLINE foldl'ReduceMap #-}
366+foldl'ReduceMap :: Monad m => Stream m Int -> m Int
393−foldl'ReduceMap = P.fmap (+1) . S.foldl' (+) 0
367+foldl'ReduceMap = P.fmap (+ 1) . S.foldl' (+) 0
369+{-# INLINE foldl1'Reduce #-}
370+foldl1'Reduce :: Monad m => Stream m Int -> m (Maybe Int)
394foldl1'Reduce = S.foldl1' (+)
371foldl1'Reduce = S.foldl1' (+)
373+{-# INLINE foldlM'Reduce #-}
374+foldlM'Reduce :: Monad m => Stream m Int -> m Int
395foldlM'Reduce = S.foldlM' (\xs a -> return $ a + xs) 0
375foldlM'Reduce = S.foldlM' (\xs a -> return $ a + xs) 0
378+last :: Monad m => Stream m Int -> m (Maybe Int)
397−last = S.last
379+last = S.last
382+_null :: Monad m => Stream m Int -> m Bool
398−_null = S.null
383+_null = S.null
386+_head :: Monad m => Stream m Int -> m (Maybe Int)
399−_head = S.head
387+_head = S.head
390+elem :: Monad m => Int -> Stream m Int -> m Bool
400−elem value = S.elem (value + 1)
391+elem value = S.elem (value + 1)
393+{-# INLINE notElem #-}
394+notElem :: Monad m => Int -> Stream m Int -> m Bool
401notElem value = S.notElem (value + 1)
395notElem value = S.notElem (value + 1)
397+{-# INLINE length #-}
398+length :: Monad m => Stream m Int -> m Int
402length = S.length
399length = S.length
402+all :: Monad m => Int -> Stream m Int -> m Bool
403−all value = S.all (<= (value + 1))
403+all value = S.all (<= (value + 1))
406+any :: Monad m => Int -> Stream m Int -> m Bool
404−any value = S.any (> (value + 1))
407+any value = S.any (> (value + 1))
410+and :: Monad m => Int -> Stream m Int -> m Bool
405−and value = S.and . S.map (<= (value + 1))
411+and value = S.and . S.map (<= (value + 1))
414+or :: Monad m => Int -> Stream m Int -> m Bool
406−or value = S.or . S.map (> (value + 1))
415+or value = S.or . S.map (> (value + 1))
418+find :: Monad m => Int -> Stream m Int -> m (Maybe Int)
407−find value = S.find (== (value + 1))
419+find value = S.find (== (value + 1))
421+{-# INLINE findIndex #-}
422+findIndex :: Monad m => Int -> Stream m Int -> m (Maybe Int)
408findIndex value = S.findIndex (== (value + 1))
423findIndex value = S.findIndex (== (value + 1))
425+{-# INLINE elemIndex #-}
426+elemIndex :: Monad m => Int -> Stream m Int -> m (Maybe Int)
409elemIndex value = S.elemIndex (value + 1)
427elemIndex value = S.elemIndex (value + 1)
429+{-# INLINE maximum #-}
430+maximum :: Monad m => Stream m Int -> m (Maybe Int)
410maximum = S.maximum
431maximum = S.maximum
433+{-# INLINE minimum #-}
434+minimum :: Monad m => Stream m Int -> m (Maybe Int)
411minimum = S.minimum
435minimum = S.minimum
438+sum :: Monad m => Stream m Int -> m Int
412−sum = S.sum
439+sum = S.sum
441+{-# INLINE product #-}
442+product :: Monad m => Stream m Int -> m Int
413product = S.product
443product = S.product
445+{-# INLINE minimumBy #-}
446+minimumBy :: Monad m => Stream m Int -> m (Maybe Int)
414minimumBy = S.minimumBy compare
447minimumBy = S.minimumBy compare
449+{-# INLINE maximumBy #-}
450+maximumBy :: Monad m => Stream m Int -> m (Maybe Int)
415maximumBy = S.maximumBy compare
451maximumBy = S.maximumBy compare
417-------------------------------------------------------------------------------
453-------------------------------------------------------------------------------
@@ -423,9 +459,12 @@ transform :: Monad m => Stream m a -> m ()
423transform = runStream
459transform = runStream
425{-# INLINE composeN #-}
461{-# INLINE composeN #-}
426−composeN
462+composeN ::
427− :: MonadIO m
463+ MonadIO m
428− => Int -> (Stream m Int -> Stream m Int) -> Stream m Int -> m ()
465+ -> (Stream m Int -> Stream m Int)
429composeN n f =
468composeN n f =
430 case n of
469 case n of
431 1 -> transform . f
470 1 -> transform . f
@@ -436,9 +475,12 @@ composeN n f =
437-- polymorphic stream version of composeN
476-- polymorphic stream version of composeN
438{-# INLINE composeN' #-}
477{-# INLINE composeN' #-}
439−composeN'
478+composeN' ::
440− :: (S.IsStream t, Monad m)
479+ (S.IsStream t, Monad m)
441− => Int -> (t m Int -> Stream m Int) -> t m Int -> m ()
481+ -> (t m Int -> Stream m Int)
442composeN' n f =
484composeN' n f =
443 case n of
485 case n of
444 1 -> transform . f
486 1 -> transform . f
@@ -448,71 +490,47 @@ composeN' n f =
448 _ -> undefined
490 _ -> undefined
450{-# INLINE scan #-}
492{-# INLINE scan #-}
493+scan :: MonadIO m => Int -> Stream m Int -> m ()
494+scan n = composeN n $ S.scanl' (+) 0
451{-# INLINE scanl1' #-}
496{-# INLINE scanl1' #-}
454−{-# INLINE mapMaybe #-}
455−{-# INLINE filterEven #-}
456−{-# INLINE filterAllOut #-}
457−{-# INLINE filterAllIn #-}
458−{-# INLINE _takeOne #-}
459−{-# INLINE takeAll #-}
460−{-# INLINE takeWhileTrue #-}
461−{-# INLINE _takeWhileMTrue #-}
462−{-# INLINE dropOne #-}
463−{-# INLINE dropAll #-}
464−{-# INLINE dropWhileTrue #-}
465−{-# INLINE _dropWhileMTrue #-}
466−{-# INLINE dropWhileFalse #-}
467−{-# INLINE findIndices #-}
468−{-# INLINE elemIndices #-}
469−{-# INLINE insertBy #-}
470−{-# INLINE deleteBy #-}
471−{-# INLINE reverse #-}
472−{-# INLINE reverse' #-}
473−{-# INLINE foldrS #-}
474−{-# INLINE foldrSMap #-}
475−{-# INLINE foldrT #-}
476−{-# INLINE foldrTMap #-}
477−scan, scanl1', map, fmap, mapMaybe, filterEven,
480− foldrS, foldrSMap, foldrT, foldrTMap
482− => Int -> Stream m Int -> m ()
497+scanl1' :: MonadIO m => Int -> Stream m Int -> m ()
483−
498+scanl1' n = composeN n $ S.scanl1' (+)
485− filterAllIn, takeAll, takeWhileTrue, _takeWhileMTrue,
486− dropAll, dropWhileTrue, _dropWhileMTrue, dropWhileFalse,
487− findIndices, elemIndices, insertBy, deleteBy
489− => Int -> Int -> Stream m Int -> m ()
491−{-# INLINE mapMaybeM #-}
500+{-# INLINE fmap #-}
492−{-# INLINE intersperse #-}
493−mapMaybeM :: S.MonadAsync m => Int -> Stream m Int -> m ()
501+fmap :: MonadIO m => Int -> Stream m Int -> m ()
494−intersperse :: S.MonadAsync m => Int -> Int -> Stream m Int -> m ()
502+fmap n = composeN n $ P.fmap (+ 1)
498{-# INLINE fmap' #-}
504{-# INLINE fmap' #-}
499−mapM, map' :: (S.IsStream t, S.MonadAsync m)
506+ (S.IsStream t, S.MonadAsync m, P.Functor (t m))
500− => (t m Int -> S.SerialT m Int) -> Int -> t m Int -> m ()
507+ => (t m Int -> S.SerialT m Int)
511+fmap' t n = composeN' n $ t . P.fmap (+ 1)
502−fmap' :: (S.IsStream t, S.MonadAsync m, P.Functor (t m))
513+{-# INLINE map #-}
503− => (t m Int -> S.SerialT m Int) -> Int -> t m Int -> m ()
514+map :: MonadIO m => Int -> Stream m Int -> m ()
515+map n = composeN n $ S.map (+ 1)
505−{-# INLINE sequence #-}
517+{-# INLINE map' #-}
506−sequence :: (S.IsStream t, S.MonadAsync m)
519+ (S.IsStream t, S.MonadAsync m)
507− => (t m Int -> S.SerialT m Int) -> t m (m Int) -> m ()
520+ => (t m Int -> S.SerialT m Int)
524+map' t n = composeN' n $ t . S.map (+ 1)
509−scan n = composeN n $ S.scanl' (+) 0
526+{-# INLINE mapM #-}
510−scanl1' n = composeN n $ S.scanl1' (+)
527+mapM ::
511−fmap n = composeN n $ P.fmap (+1)
528+ (S.IsStream t, S.MonadAsync m)
512−fmap' t n = composeN' n $ t . P.fmap (+1)
529+ => (t m Int -> S.SerialT m Int)
513−map n = composeN n $ S.map (+1)
530+ -> Int
514−map' t n = composeN' n $ t . S.map (+1)
531+ -> t m Int
515−mapM t n = composeN' n $ t . S.mapM return
533+mapM t n = composeN' n $ t . S.mapM return
517{-# INLINE tap #-}
535{-# INLINE tap #-}
518tap :: MonadIO m => Int -> Stream m Int -> m ()
536tap :: MonadIO m => Int -> Stream m Int -> m ()
@@ -528,7 +546,8 @@ tapRate n str = do
528pollCounts :: Int -> Stream IO Int -> IO ()
546pollCounts :: Int -> Stream IO Int -> IO ()
529pollCounts n str = do
547pollCounts n str = do
530 composeN n (Internal.pollCounts (P.const P.True) f FL.drain) str
548 composeN n (Internal.pollCounts (P.const P.True) f FL.drain) str
531− where f = Internal.rollingMap (P.-) . Internal.delayPost 1
550+ f = Internal.rollingMap (P.-) . Internal.delayPost 1
533{-# INLINE tapAsyncS #-}
552{-# INLINE tapAsyncS #-}
534tapAsyncS :: S.MonadAsync m => Int -> Stream m Int -> m ()
553tapAsyncS :: S.MonadAsync m => Int -> Stream m Int -> m ()
@@ -538,34 +557,125 @@ tapAsyncS n = composeN n $ Par.tapAsync S.sum
538tapAsync :: S.MonadAsync m => Int -> Stream m Int -> m ()
557tapAsync :: S.MonadAsync m => Int -> Stream m Int -> m ()
539tapAsync n = composeN n $ Internal.tapAsync FL.sum
558tapAsync n = composeN n $ Internal.tapAsync FL.sum
560+{-# INLINE mapMaybe #-}
561+mapMaybe :: MonadIO m => Int -> Stream m Int -> m ()
541−mapMaybe n = composeN n $ S.mapMaybe
563+ composeN n $
542− (\x -> if P.odd x then Nothing else Just x)
567+ then Nothing
570+{-# INLINE mapMaybeM #-}
571+mapMaybeM :: S.MonadAsync m => Int -> Stream m Int -> m ()
543−mapMaybeM n = composeN n $ S.mapMaybeM
572+mapMaybeM n =
544− (\x -> if P.odd x then return Nothing else return $ Just x)
577+ then return Nothing
578+ else return $ Just x)
580+{-# INLINE sequence #-}
582+ (S.IsStream t, S.MonadAsync m)
583+ => (t m Int -> S.SerialT m Int)
545−sequence t = transform . t . S.sequence
586+sequence t = transform . t . S.sequence
588+{-# INLINE filterEven #-}
589+filterEven :: MonadIO m => Int -> Stream m Int -> m ()
546−filterEven n = composeN n $ S.filter even
590+filterEven n = composeN n $ S.filter even
592+{-# INLINE filterAllOut #-}
593+filterAllOut :: MonadIO m => Int -> Int -> Stream m Int -> m ()
547−filterAllOut value n = composeN n $ S.filter (> (value + 1))
594+filterAllOut value n = composeN n $ S.filter (> (value + 1))
596+{-# INLINE filterAllIn #-}
597+filterAllIn :: MonadIO m => Int -> Int -> Stream m Int -> m ()
548−filterAllIn value n = composeN n $ S.filter (<= (value + 1))
598+filterAllIn value n = composeN n $ S.filter (<= (value + 1))
600+{-# INLINE _takeOne #-}
601+_takeOne :: MonadIO m => Int -> Stream m Int -> m ()
549−_takeOne n = composeN n $ S.take 1
602+_takeOne n = composeN n $ S.take 1
604+{-# INLINE takeAll #-}
605+takeAll :: MonadIO m => Int -> Int -> Stream m Int -> m ()
550−takeAll value n = composeN n $ S.take (value + 1)
606+takeAll value n = composeN n $ S.take (value + 1)
608+{-# INLINE takeWhileTrue #-}
609+takeWhileTrue :: MonadIO m => Int -> Int -> Stream m Int -> m ()
551takeWhileTrue value n = composeN n $ S.takeWhile (<= (value + 1))
610takeWhileTrue value n = composeN n $ S.takeWhile (<= (value + 1))
612+{-# INLINE _takeWhileMTrue #-}
613+_takeWhileMTrue :: MonadIO m => Int -> Int -> Stream m Int -> m ()
552_takeWhileMTrue value n = composeN n $ S.takeWhileM (return . (<= (value + 1)))
614_takeWhileMTrue value n = composeN n $ S.takeWhileM (return . (<= (value + 1)))
616+{-# INLINE dropOne #-}
617+dropOne :: MonadIO m => Int -> Stream m Int -> m ()
553−dropOne n = composeN n $ S.drop 1
618+dropOne n = composeN n $ S.drop 1
620+{-# INLINE dropAll #-}
621+dropAll :: MonadIO m => Int -> Int -> Stream m Int -> m ()
554−dropAll value n = composeN n $ S.drop (value + 1)
622+dropAll value n = composeN n $ S.drop (value + 1)
624+{-# INLINE dropWhileTrue #-}
625+dropWhileTrue :: MonadIO m => Int -> Int -> Stream m Int -> m ()
555−dropWhileTrue value n = composeN n $ S.dropWhile (<= (value + 1))
626+dropWhileTrue value n = composeN n $ S.dropWhile (<= (value + 1))
628+{-# INLINE _dropWhileMTrue #-}
629+_dropWhileMTrue :: MonadIO m => Int -> Int -> Stream m Int -> m ()
556_dropWhileMTrue value n = composeN n $ S.dropWhileM (return . (<= (value + 1)))
630_dropWhileMTrue value n = composeN n $ S.dropWhileM (return . (<= (value + 1)))
632+{-# INLINE dropWhileFalse #-}
633+dropWhileFalse :: MonadIO m => Int -> Int -> Stream m Int -> m ()
557dropWhileFalse value n = composeN n $ S.dropWhile (> (value + 1))
634dropWhileFalse value n = composeN n $ S.dropWhile (> (value + 1))
636+{-# INLINE findIndices #-}
637+findIndices :: MonadIO m => Int -> Int -> Stream m Int -> m ()
558−findIndices value n = composeN n $ S.findIndices (== (value + 1))
638+findIndices value n = composeN n $ S.findIndices (== (value + 1))
640+{-# INLINE elemIndices #-}
641+elemIndices :: MonadIO m => Int -> Int -> Stream m Int -> m ()
559−elemIndices value n = composeN n $ S.elemIndices (value + 1)
642+elemIndices value n = composeN n $ S.elemIndices (value + 1)
644+{-# INLINE intersperse #-}
645+intersperse :: S.MonadAsync m => Int -> Int -> Stream m Int -> m ()
560−intersperse value n = composeN n $ S.intersperse (value + 1)
646+intersperse value n = composeN n $ S.intersperse (value + 1)
648+{-# INLINE insertBy #-}
649+insertBy :: MonadIO m => Int -> Int -> Stream m Int -> m ()
561−insertBy value n = composeN n $ S.insertBy compare (value + 1)
650+insertBy value n = composeN n $ S.insertBy compare (value + 1)
652+{-# INLINE deleteBy #-}
653+deleteBy :: MonadIO m => Int -> Int -> Stream m Int -> m ()
562−deleteBy value n = composeN n $ S.deleteBy (>=) (value + 1)
654+deleteBy value n = composeN n $ S.deleteBy (>=) (value + 1)
656+{-# INLINE reverse #-}
657+reverse :: MonadIO m => Int -> Stream m Int -> m ()
563−reverse n = composeN n $ S.reverse
658+reverse n = composeN n $ S.reverse
660+{-# INLINE reverse' #-}
661+reverse' :: MonadIO m => Int -> Stream m Int -> m ()
564−reverse' n = composeN n $ Internal.reverse'
662+reverse' n = composeN n $ Internal.reverse'
664+{-# INLINE foldrS #-}
665+foldrS :: MonadIO m => Int -> Stream m Int -> m ()
565−foldrS n = composeN n $ Internal.foldrS S.cons S.nil
666+foldrS n = composeN n $ Internal.foldrS S.cons S.nil
668+{-# INLINE foldrSMap #-}
669+foldrSMap :: MonadIO m => Int -> Stream m Int -> m ()
566−foldrSMap n = composeN n $ Internal.foldrS (\x xs -> x + 1 `S.cons` xs) S.nil
670+foldrSMap n = composeN n $ Internal.foldrS (\x xs -> x + 1 `S.cons` xs) S.nil
672+{-# INLINE foldrT #-}
673+foldrT :: MonadIO m => Int -> Stream m Int -> m ()
567−foldrT n = composeN n $ Internal.foldrT S.cons S.nil
674+foldrT n = composeN n $ Internal.foldrT S.cons S.nil
676+{-# INLINE foldrTMap #-}
677+foldrTMap :: MonadIO m => Int -> Stream m Int -> m ()
568−foldrTMap n = composeN n $ Internal.foldrT (\x xs -> x + 1 `S.cons` xs) S.nil
678+foldrTMap n = composeN n $ Internal.foldrT (\x xs -> x + 1 `S.cons` xs) S.nil
570{-# INLINE takeByTime #-}
680{-# INLINE takeByTime #-}
571takeByTime :: NanoSecond64 -> Int -> Stream IO Int -> IO ()
681takeByTime :: NanoSecond64 -> Int -> Stream IO Int -> IO ()
@@ -591,121 +701,183 @@ inspect $ hasNoTypeClasses 'dropByTime
591-------------------------------------------------------------------------------
701-------------------------------------------------------------------------------
593{-# INLINE transformMapM #-}
703{-# INLINE transformMapM #-}
705+ (S.IsStream t, S.MonadAsync m)
706+ => (t m Int -> S.SerialT m Int)
710+transformMapM t n = composeN' n $ t . Internal.transform (Pipe.mapM return)
594{-# INLINE transformComposeMapM #-}
712{-# INLINE transformComposeMapM #-}
595−{-# INLINE transformTeeMapM #-}
713+transformComposeMapM ::
596−{-# INLINE transformZipMapM #-}
714+ (S.IsStream t, S.MonadAsync m)
715+ => (t m Int -> S.SerialT m Int)
719+transformComposeMapM t n =
723+ (Pipe.mapM (\x -> return (x + 1)) `Pipe.compose`
724+ Pipe.mapM (\x -> return (x + 2)))
598−transformMapM, transformComposeMapM, transformTeeMapM,
726+{-# INLINE transformTeeMapM #-}
599− transformZipMapM :: (S.IsStream t, S.MonadAsync m)
728+ (S.IsStream t, S.MonadAsync m)
600− => (t m Int -> S.SerialT m Int) -> Int -> t m Int -> m ()
729+ => (t m Int -> S.SerialT m Int)
733+transformTeeMapM t n =
737+ (Pipe.mapM (\x -> return (x + 1)) `Pipe.tee`
738+ Pipe.mapM (\x -> return (x + 2)))
602−transformMapM t n = composeN' n $ t . Internal.transform (Pipe.mapM return)
740+{-# INLINE transformZipMapM #-}
603−transformComposeMapM t n = composeN' n $ t . Internal.transform
741+transformZipMapM ::
604− (Pipe.mapM (\x -> return (x + 1))
742+ (S.IsStream t, S.MonadAsync m)
605− `Pipe.compose` Pipe.mapM (\x -> return (x + 2)))
743+ => (t m Int -> S.SerialT m Int)
606−transformTeeMapM t n = composeN' n $ t . Internal.transform
744+ -> Int
607− (Pipe.mapM (\x -> return (x + 1))
745+ -> t m Int
608− `Pipe.tee` Pipe.mapM (\x -> return (x + 2)))
746+ -> m ()
609−transformZipMapM t n = composeN' n $ t . Internal.transform
747+transformZipMapM t n =
610− (Pipe.zipWith (+) (Pipe.mapM (\x -> return (x + 1)))
753+ (Pipe.mapM (\x -> return (x + 1)))
611− (Pipe.mapM (\x -> return (x + 2))))
754+ (Pipe.mapM (\x -> return (x + 2))))
613-------------------------------------------------------------------------------
756-------------------------------------------------------------------------------
614-- Mixed Transformation
757-- Mixed Transformation
615-------------------------------------------------------------------------------
758-------------------------------------------------------------------------------
617{-# INLINE scanMap #-}
760{-# INLINE scanMap #-}
761+scanMap :: MonadIO m => Int -> Stream m Int -> m ()
762+scanMap n = composeN n $ S.map (subtract 1) . S.scanl' (+) 0
618{-# INLINE dropMap #-}
764{-# INLINE dropMap #-}
765+dropMap :: MonadIO m => Int -> Stream m Int -> m ()
766+dropMap n = composeN n $ S.map (subtract 1) . S.drop 1
619{-# INLINE dropScan #-}
768{-# INLINE dropScan #-}
769+dropScan :: MonadIO m => Int -> Stream m Int -> m ()
770+dropScan n = composeN n $ S.scanl' (+) 0 . S.drop 1
620{-# INLINE takeDrop #-}
772{-# INLINE takeDrop #-}
773+takeDrop :: MonadIO m => Int -> Int -> Stream m Int -> m ()
774+takeDrop value n = composeN n $ S.drop 1 . S.take (value + 1)
621{-# INLINE takeScan #-}
776{-# INLINE takeScan #-}
777+takeScan :: MonadIO m => Int -> Int -> Stream m Int -> m ()
778+takeScan value n = composeN n $ S.scanl' (+) 0 . S.take (value + 1)
622{-# INLINE takeMap #-}
780{-# INLINE takeMap #-}
781+takeMap :: MonadIO m => Int -> Int -> Stream m Int -> m ()
782+takeMap value n = composeN n $ S.map (subtract 1) . S.take (value + 1)
623{-# INLINE filterDrop #-}
784{-# INLINE filterDrop #-}
624−{-# INLINE filterTake #-}
625−{-# INLINE filterScan #-}
626−{-# INLINE filterScanl1 #-}
627−{-# INLINE filterMap #-}
628−scanMap, dropMap, dropScan,
629− filterScan, filterScanl1
630− :: MonadIO m => Int -> Stream m Int -> m ()
632−takeDrop, takeScan, takeMap, filterDrop,
633− filterTake, filterMap
634− :: MonadIO m => Int -> Int -> Stream m Int -> m ()
785+filterDrop :: MonadIO m => Int -> Int -> Stream m Int -> m ()
636−scanMap n = composeN n $ S.map (subtract 1) . S.scanl' (+) 0
637−dropMap n = composeN n $ S.map (subtract 1) . S.drop 1
638−dropScan n = composeN n $ S.scanl' (+) 0 . S.drop 1
639−takeDrop value n = composeN n $ S.drop 1 . S.take (value + 1)
640−takeScan value n = composeN n $ S.scanl' (+) 0 . S.take (value + 1)
641−takeMap value n = composeN n $ S.map (subtract 1) . S.take (value + 1)
642filterDrop value n = composeN n $ S.drop 1 . S.filter (<= (value + 1))
786filterDrop value n = composeN n $ S.drop 1 . S.filter (<= (value + 1))
788+{-# INLINE filterTake #-}
789+filterTake :: MonadIO m => Int -> Int -> Stream m Int -> m ()
643filterTake value n = composeN n $ S.take (value + 1) . S.filter (<= (value + 1))
790filterTake value n = composeN n $ S.take (value + 1) . S.filter (<= (value + 1))
792+{-# INLINE filterScan #-}
793+filterScan :: MonadIO m => Int -> Stream m Int -> m ()
644filterScan n = composeN n $ S.scanl' (+) 0 . S.filter (<= maxBound)
794filterScan n = composeN n $ S.scanl' (+) 0 . S.filter (<= maxBound)
796+{-# INLINE filterScanl1 #-}
797+filterScanl1 :: MonadIO m => Int -> Stream m Int -> m ()
645filterScanl1 n = composeN n $ S.scanl1' (+) . S.filter (<= maxBound)
798filterScanl1 n = composeN n $ S.scanl1' (+) . S.filter (<= maxBound)
800+{-# INLINE filterMap #-}
801+filterMap :: MonadIO m => Int -> Int -> Stream m Int -> m ()
646−filterMap value n = composeN n $ S.map (subtract 1) . S.filter (<= (value + 1))
802+filterMap value n = composeN n $ S.map (subtract 1) . S.filter (<= (value + 1))
648-------------------------------------------------------------------------------
804-------------------------------------------------------------------------------
649-- Scan and fold
805-- Scan and fold
650-------------------------------------------------------------------------------
806-------------------------------------------------------------------------------
652−data Pair a b = Pair !a !b deriving (Generic, NFData)
810+ deriving (Generic, NFData)
654{-# INLINE sumProductFold #-}
812{-# INLINE sumProductFold #-}
655sumProductFold :: Monad m => Stream m Int -> m (Int, Int)
813sumProductFold :: Monad m => Stream m Int -> m (Int, Int)
656−sumProductFold = S.foldl' (\(s,p) x -> (s + x, p P.* x)) (0,1)
814+sumProductFold = S.foldl' (\(s, p) x -> (s + x, p P.* x)) (0, 1)
658{-# INLINE sumProductScan #-}
816{-# INLINE sumProductScan #-}
659sumProductScan :: Monad m => Stream m Int -> m (Pair Int Int)
817sumProductScan :: Monad m => Stream m Int -> m (Pair Int Int)
660−sumProductScan = S.foldl' (\(Pair _ p) (s0,x) -> Pair s0 (p P.* x)) (Pair 0 1)
819+ S.foldl' (\(Pair _ p) (s0, x) -> Pair s0 (p P.* x)) (Pair 0 1) .
661− . S.scanl' (\(s,_) x -> (s + x,x)) (0,0)
820+ S.scanl' (\(s, _) x -> (s + x, x)) (0, 0)
663-------------------------------------------------------------------------------
822-------------------------------------------------------------------------------
664-- Iteration
823-- Iteration
665-------------------------------------------------------------------------------
824-------------------------------------------------------------------------------
667−iterStreamLen, maxIters :: Int
826+{-# INLINE iterStreamLen #-}
668iterStreamLen = 10
828iterStreamLen = 10
830+{-# INLINE maxIters #-}
669maxIters = 10000
832maxIters = 10000
671{-# INLINE iterateSource #-}
834{-# INLINE iterateSource #-}
672−iterateSource
835+iterateSource ::
673− :: S.MonadAsync m
836+ S.MonadAsync m
674− => (Stream m Int -> Stream m Int) -> Int -> Int -> Stream m Int
837+ => (Stream m Int -> Stream m Int)
675iterateSource g i n = f i (sourceUnfoldrMN iterStreamLen n)
841iterateSource g i n = f i (sourceUnfoldrMN iterStreamLen n)
677− f (0 :: Int) m = g m
843+ f (0 :: Int) m = g m
678− f x m = g (f (x P.- 1) m)
844+ f x m = g (f (x P.- 1) m)
680−{-# INLINE iterateMapM #-}
846+-- this is quadratic
681{-# INLINE iterateScan #-}
847{-# INLINE iterateScan #-}
848+iterateScan :: S.MonadAsync m => Int -> Stream m Int
849+iterateScan = iterateSource (S.scanl' (+) 0) (maxIters `div` 10)
682{-# INLINE iterateScanl1 #-}
852{-# INLINE iterateScanl1 #-}
853+iterateScanl1 :: S.MonadAsync m => Int -> Stream m Int
854+iterateScanl1 = iterateSource (S.scanl1' (+)) (maxIters `div` 10)
856+{-# INLINE iterateMapM #-}
857+iterateMapM :: S.MonadAsync m => Int -> Stream m Int
858+iterateMapM = iterateSource (S.mapM return) maxIters
683{-# INLINE iterateFilterEven #-}
860{-# INLINE iterateFilterEven #-}
861+iterateFilterEven :: S.MonadAsync m => Int -> Stream m Int
862+iterateFilterEven = iterateSource (S.filter even) maxIters
684{-# INLINE iterateTakeAll #-}
864{-# INLINE iterateTakeAll #-}
685−{-# INLINE iterateDropOne #-}
686−{-# INLINE iterateDropWhileFalse #-}
687−{-# INLINE iterateDropWhileTrue #-}
688−iterateMapM, iterateScan, iterateScanl1, iterateFilterEven,
691− => Int -> Stream m Int
865+iterateTakeAll :: S.MonadAsync m => Int -> Int -> Stream m Int
866+iterateTakeAll value = iterateSource (S.take (value + 1)) maxIters
693−iterateTakeAll,
868+{-# INLINE iterateDropOne #-}
694− iterateDropWhileFalse, iterateDropWhileTrue
695− :: S.MonadAsync m
869+iterateDropOne :: S.MonadAsync m => Int -> Stream m Int
696− => Int -> Int -> Stream m Int
870+iterateDropOne = iterateSource (S.drop 1) maxIters
698−-- this is quadratic
872+{-# INLINE iterateDropWhileFalse #-}
699−iterateScan = iterateSource (S.scanl' (+) 0) (maxIters `div` 10)
873+iterateDropWhileFalse :: S.MonadAsync m => Int -> Int -> Stream m Int
700−-- so is this
874+iterateDropWhileFalse value =
701−iterateScanl1 = iterateSource (S.scanl1' (+)) (maxIters `div` 10)
875+ iterateSource (S.dropWhile (> (value + 1))) maxIters
703−iterateMapM = iterateSource (S.mapM return) maxIters
877+{-# INLINE iterateDropWhileTrue #-}
704−iterateFilterEven = iterateSource (S.filter even) maxIters
878+iterateDropWhileTrue :: S.MonadAsync m => Int -> Int -> Stream m Int
705−iterateTakeAll value = iterateSource (S.take (value + 1)) maxIters
879+iterateDropWhileTrue value =
706−iterateDropOne = iterateSource (S.drop 1) maxIters
707−iterateDropWhileFalse value = iterateSource (S.dropWhile (> (value + 1))) maxIters
708−iterateDropWhileTrue value = iterateSource (S.dropWhile (<= (value + 1))) maxIters
880+ iterateSource (S.dropWhile (<= (value + 1))) maxIters
710-------------------------------------------------------------------------------
882-------------------------------------------------------------------------------
711-- Combining streams
883-- Combining streams
@@ -718,34 +890,35 @@ iterateDropWhileTrue value = iterateSource (S.dropWhile (<= (value + 1))) maxI
718{-# INLINE serial2 #-}
890{-# INLINE serial2 #-}
719serial2 :: Int -> Int -> IO ()
891serial2 :: Int -> Int -> IO ()
720serial2 count n =
892serial2 count n =
722− (sourceUnfoldrMN count n)
723− (sourceUnfoldrMN count (n + 1))
893+ S.drain $ S.serial (sourceUnfoldrMN count n) (sourceUnfoldrMN count (n + 1))
725{-# INLINE serial4 #-}
895{-# INLINE serial4 #-}
726serial4 :: Int -> Int -> IO ()
896serial4 :: Int -> Int -> IO ()
727serial4 count n =
897serial4 count n =
728− S.drain $ S.serial
899+ S.serial
729− ((S.serial (sourceUnfoldrMN count n)
900+ ((S.serial (sourceUnfoldrMN count n) (sourceUnfoldrMN count (n + 1))))
730− (sourceUnfoldrMN count (n + 1))))
901+ ((S.serial
731− ((S.serial (sourceUnfoldrMN count (n+2))
902+ (sourceUnfoldrMN count (n + 2))
732− (sourceUnfoldrMN count (n + 3))))
903+ (sourceUnfoldrMN count (n + 3))))
734{-# INLINE append2 #-}
905{-# INLINE append2 #-}
735append2 :: Int -> Int -> IO ()
906append2 :: Int -> Int -> IO ()
736append2 count n =
907append2 count n =
737− S.drain $ Internal.append
908+ S.drain $
738− (sourceUnfoldrMN count n)
739− (sourceUnfoldrMN count (n + 1))
909+ Internal.append (sourceUnfoldrMN count n) (sourceUnfoldrMN count (n + 1))
741{-# INLINE append4 #-}
911{-# INLINE append4 #-}
742append4 :: Int -> Int -> IO ()
912append4 :: Int -> Int -> IO ()
743append4 count n =
913append4 count n =
744− S.drain $ Internal.append
915+ Internal.append
745− ((Internal.append (sourceUnfoldrMN count n)
917+ (sourceUnfoldrMN count n)
746− (sourceUnfoldrMN count (n + 1))))
918+ (sourceUnfoldrMN count (n + 1))))
747− ((Internal.append (sourceUnfoldrMN count (n+2))
920+ (sourceUnfoldrMN count (n + 2))
748− (sourceUnfoldrMN count (n + 3))))
921+ (sourceUnfoldrMN count (n + 3))))
750#ifdef INSPECTION
923#ifdef INSPECTION
751inspect $ hasNoTypeClasses 'append2
924inspect $ hasNoTypeClasses 'append2
@@ -759,15 +932,19 @@ inspect $ 'append2 `hasNoType` ''D.AppendState
760{-# INLINE wSerial2 #-}
933{-# INLINE wSerial2 #-}
761wSerial2 :: Int -> Int -> IO ()
934wSerial2 :: Int -> Int -> IO ()
762−wSerial2 value n = S.drain $ S.wSerial
935+wSerial2 value n =
763− (sourceUnfoldrMN (value `div` 2) n)
938+ (sourceUnfoldrMN (value `div` 2) n)
764− (sourceUnfoldrMN (value `div` 2) (n + 1))
939+ (sourceUnfoldrMN (value `div` 2) (n + 1))
766{-# INLINE interleave2 #-}
941{-# INLINE interleave2 #-}
767interleave2 :: Int -> Int -> IO ()
942interleave2 :: Int -> Int -> IO ()
943+interleave2 value n =
768−interleave2 value n = S.drain $ Internal.interleave
945+ Internal.interleave
769− (sourceUnfoldrMN (value `div` 2) n)
946+ (sourceUnfoldrMN (value `div` 2) n)
770− (sourceUnfoldrMN (value `div` 2) (n + 1))
947+ (sourceUnfoldrMN (value `div` 2) (n + 1))
772#ifdef INSPECTION
949#ifdef INSPECTION
773inspect $ hasNoTypeClasses 'interleave2
950inspect $ hasNoTypeClasses 'interleave2
@@ -777,9 +954,11 @@ inspect $ 'interleave2 `hasNoType` ''D.InterleaveState
778{-# INLINE roundRobin2 #-}
955{-# INLINE roundRobin2 #-}
779roundRobin2 :: Int -> Int -> IO ()
956roundRobin2 :: Int -> Int -> IO ()
957+roundRobin2 value n =
780−roundRobin2 value n = S.drain $ Internal.roundrobin
959+ Internal.roundrobin
781− (sourceUnfoldrMN (value `div` 2) n)
960+ (sourceUnfoldrMN (value `div` 2) n)
782− (sourceUnfoldrMN (value `div` 2) (n + 1))
961+ (sourceUnfoldrMN (value `div` 2) (n + 1))
784#ifdef INSPECTION
963#ifdef INSPECTION
785inspect $ hasNoTypeClasses 'roundRobin2
964inspect $ hasNoTypeClasses 'roundRobin2
@@ -794,7 +973,9 @@ inspect $ 'roundRobin2 `hasNoType` ''D.InterleaveState
794{-# INLINE mergeBy #-}
973{-# INLINE mergeBy #-}
795mergeBy :: Int -> Int -> IO ()
974mergeBy :: Int -> Int -> IO ()
796mergeBy count n =
975mergeBy count n =
797− S.drain $ S.mergeBy P.compare
977+ S.mergeBy
798 (sourceUnfoldrMN count n)
979 (sourceUnfoldrMN count n)
799 (sourceUnfoldrMN count (n + 1))
980 (sourceUnfoldrMN count (n + 1))
@@ -811,9 +992,8 @@ inspect $ 'mergeBy `hasNoType` ''D.Step
811{-# INLINE zip #-}
992{-# INLINE zip #-}
812zip :: Int -> Int -> IO ()
993zip :: Int -> Int -> IO ()
813zip count n =
994zip count n =
814− S.drain $ S.zipWith (,)
995+ S.drain $
815− (sourceUnfoldrMN count n)
816− (sourceUnfoldrMN count (n + 1))
996+ S.zipWith (,) (sourceUnfoldrMN count n) (sourceUnfoldrMN count (n + 1))
818#ifdef INSPECTION
998#ifdef INSPECTION
819inspect $ hasNoTypeClasses 'zip
999inspect $ hasNoTypeClasses 'zip
@@ -824,7 +1004,9 @@ inspect $ 'zip `hasNoType` ''D.Step
824{-# INLINE zipM #-}
1004{-# INLINE zipM #-}
825zipM :: Int -> Int -> IO ()
1005zipM :: Int -> Int -> IO ()
826zipM count n =
1006zipM count n =
827− S.drain $ S.zipWithM (curry return)
1009+ (curry return)
828 (sourceUnfoldrMN count n)
1010 (sourceUnfoldrMN count n)
829 (sourceUnfoldrMN count (n + 1))
1011 (sourceUnfoldrMN count (n + 1))
@@ -837,35 +1019,35 @@ inspect $ 'zipM `hasNoType` ''D.Step
837{-# INLINE zipAsync #-}
1019{-# INLINE zipAsync #-}
838zipAsync :: (S.IsStream t, S.MonadAsync m) => Int -> Int -> t m (Int, Int)
1020zipAsync :: (S.IsStream t, S.MonadAsync m) => Int -> Int -> t m (Int, Int)
839zipAsync count n = do
1021zipAsync count n = do
841− (sourceUnfoldrMN count n)
842− (sourceUnfoldrMN count (n + 1))
1022+ S.zipAsyncWith (,) (sourceUnfoldrMN count n) (sourceUnfoldrMN count (n + 1))
844{-# INLINE zipAsyncM #-}
1024{-# INLINE zipAsyncM #-}
845zipAsyncM :: (S.IsStream t, S.MonadAsync m) => Int -> Int -> t m (Int, Int)
1025zipAsyncM :: (S.IsStream t, S.MonadAsync m) => Int -> Int -> t m (Int, Int)
846zipAsyncM count n = do
1026zipAsyncM count n = do
847− S.zipAsyncWithM (curry return)
1027+ S.zipAsyncWithM
848 (sourceUnfoldrMN count n)
1029 (sourceUnfoldrMN count n)
849 (sourceUnfoldrMN count (n + 1))
1030 (sourceUnfoldrMN count (n + 1))
851{-# INLINE zipAsyncAp #-}
1032{-# INLINE zipAsyncAp #-}
852zipAsyncAp :: (S.IsStream t, S.MonadAsync m) => Int -> Int -> t m (Int, Int)
1033zipAsyncAp :: (S.IsStream t, S.MonadAsync m) => Int -> Int -> t m (Int, Int)
853−zipAsyncAp count n = do
1034+zipAsyncAp count n = do
854− S.zipAsyncly $ (,)
1035+ S.zipAsyncly $
855− <$> (sourceUnfoldrMN count n)
856− <*> (sourceUnfoldrMN count (n + 1))
1036+ (,) <$> (sourceUnfoldrMN count n) <*> (sourceUnfoldrMN count (n + 1))
858{-# INLINE mergeAsyncByM #-}
1038{-# INLINE mergeAsyncByM #-}
859mergeAsyncByM :: (S.IsStream t, S.MonadAsync m) => Int -> Int -> t m Int
1039mergeAsyncByM :: (S.IsStream t, S.MonadAsync m) => Int -> Int -> t m Int
860mergeAsyncByM count n = do
1040mergeAsyncByM count n = do
861− S.mergeAsyncByM (\a b -> return (a `compare` b))
1042+ (\a b -> return (a `compare` b))
862 (sourceUnfoldrMN count n)
1043 (sourceUnfoldrMN count n)
863 (sourceUnfoldrMN count (n + 1))
1044 (sourceUnfoldrMN count (n + 1))
865{-# INLINE mergeAsyncBy #-}
1046{-# INLINE mergeAsyncBy #-}
866mergeAsyncBy :: (S.IsStream t, S.MonadAsync m) => Int -> Int -> t m Int
1047mergeAsyncBy :: (S.IsStream t, S.MonadAsync m) => Int -> Int -> t m Int
867mergeAsyncBy count n = do
1048mergeAsyncBy count n = do
868− S.mergeAsyncBy compare
1049+ S.mergeAsyncBy
869 (sourceUnfoldrMN count n)
1051 (sourceUnfoldrMN count n)
870 (sourceUnfoldrMN count (n + 1))
1052 (sourceUnfoldrMN count (n + 1))
@@ -874,10 +1056,11 @@ mergeAsyncBy count n = do
874-------------------------------------------------------------------------------
1056-------------------------------------------------------------------------------
876{-# INLINE isPrefixOf #-}
1058{-# INLINE isPrefixOf #-}
877−{-# INLINE isSubsequenceOf #-}
878−isPrefixOf, isSubsequenceOf :: Monad m => Stream m Int -> m Bool
1059+isPrefixOf :: Monad m => Stream m Int -> m Bool
880isPrefixOf src = S.isPrefixOf src src
1060isPrefixOf src = S.isPrefixOf src src
1062+{-# INLINE isSubsequenceOf #-}
1063+isSubsequenceOf :: Monad m => Stream m Int -> m Bool
881isSubsequenceOf src = S.isSubsequenceOf src src
1064isSubsequenceOf src = S.isSubsequenceOf src src
883{-# INLINE stripPrefix #-}
1066{-# INLINE stripPrefix #-}