@@ -69,9 +69,9 @@ import Streamly.Data.Stream (Stream)
6969import Streamly.Internal.Data.Array.Unboxed.Type (Array(..))
7070import Streamly.Internal.Data.Array.Stream.Fold.Foreign (ArrayFold(..))
7171import Streamly.Internal.Data.Parser (ParseError(..))
72−import Streamly.Internal.Data.Stream.IsStream.Type
73− (IsStream, fromStreamD, toStreamD)
74−import Streamly.Internal.Data.SVar (adaptState, defState)
72+import Streamly.Internal.Data.Stream
73+ (fromStreamD, fromStreamK, toStreamD, toStreamK)
74+import Streamly.Internal.Data.SVar.Type (adaptState, defState)
7575import Streamly.Internal.Data.Array.Unboxed.Mut.Type
7676 (allocBytesToElemCount)
7777import Streamly.Internal.Data.Tuple.Strict (Tuple'(..))
@@ -79,27 +79,22 @@ import Streamly.Internal.Data.Tuple.Strict (Tuple'(..))
7979import qualified Streamly.Data.Fold as FL
8080import qualified Streamly.Internal.Data.Array.Unboxed as A
8181import qualified Streamly.Internal.Data.Array.Unboxed as Array
82−-- import qualified Streamly.Internal.Data.Array.Stream.Fold.Foreign
83−-- as ArrayFold
8482import qualified Streamly.Internal.Data.Array.Unboxed.Type as A
8583import qualified Streamly.Internal.Data.Array.Unboxed.Mut.Type as MA
8684import qualified Streamly.Internal.Data.Array.Stream.Mut.Foreign as AS
87−import qualified Streamly.Internal.Data.Fold.Type as FL
88− (Fold(..), Step(..))
85+import qualified Streamly.Internal.Data.Fold.Type as FL (Fold(..), Step(..))
8986import qualified Streamly.Internal.Data.Parser as PR
9087import qualified Streamly.Internal.Data.Parser.ParserD as PRD
9188 (Parser(..), Initial(..), fromParserK)
92−import qualified Streamly.Internal.Data.Stream.IsStream as S
89+import qualified Streamly.Internal.Data.Stream as S
9390import qualified Streamly.Internal.Data.Stream.StreamD as D
9491 ( fromList, nil, cons, map
95− , unfoldMany, append, splitInnerBy, splitInnerBySuffix
92+ , unfoldMany, append, splitInnerBy, splitInnerBySuffix, foldlM'
9693 )
9794import qualified Streamly.Internal.Data.Stream.StreamD.Type as D
9895 (Step(Yield, Stop, Skip), Stream(Stream))
9996import qualified Streamly.Internal.Data.Stream.StreamK.Type as K
10097 (Stream, cons, nil, fromPure, foldStream)
101−import qualified Streamly.Internal.Data.Stream as Stream
102− (fromStreamK, toStreamK)
10398
10499-- XXX Since these are immutable arrays MonadIO constraint can be removed from
105100-- most places.
@@ -115,8 +110,8 @@ import qualified Streamly.Internal.Data.Stream as Stream
115110--
116111-- /Pre-release/
117112{-# INLINE arraysOf #-}
118−arraysOf :: (IsStream t, MonadIO m, Unboxed a)
119− => Int -> t m a -> t m (Array a)
113+arraysOf :: (MonadIO m, Unboxed a)
114+ => Int -> Stream m a -> Stream m (Array a)
120115arraysOf n str = fromStreamD $ A.arraysOf n (toStreamD str)
121116
122117-------------------------------------------------------------------------------
@@ -135,7 +130,7 @@ arraysOf n str = fromStreamD $ A.arraysOf n (toStreamD str)
135130--
136131-- @since 0.7.0
137132{-# INLINE concat #-}
138−concat :: (IsStream t, Monad m, Unboxed a) => t m (Array a) -> t m a
133+concat :: (Monad m, Unboxed a) => Stream m (Array a) -> Stream m a
139134-- concat m = fromStreamD $ A.flattenArrays (toStreamD m)
140135-- concat m = fromStreamD $ D.concatMap A.toStreamD (toStreamD m)
141136concat m = fromStreamD $ D.unfoldMany A.read (toStreamD m)
@@ -147,7 +142,7 @@ concat m = fromStreamD $ D.unfoldMany A.read (toStreamD m)
147142--
148143-- @since 0.7.0
149144{-# INLINE concatRev #-}
150−concatRev :: (IsStream t, Monad m, Unboxed a) => t m (Array a) -> t m a
145+concatRev :: (Monad m, Unboxed a) => Stream m (Array a) -> Stream m a
151146-- concatRev m = fromStreamD $ A.flattenArraysRev (toStreamD m)
152147concatRev m = fromStreamD $ D.unfoldMany A.readRev (toStreamD m)
153148
@@ -160,12 +155,12 @@ concatRev m = fromStreamD $ D.unfoldMany A.readRev (toStreamD m)
160155--
161156-- /Pre-release/
162157{-# INLINE interpose #-}
163−interpose :: (Monad m, IsStream t, Unboxed a) => a -> t m (Array a) -> t m a
158+interpose :: (Monad m, Unboxed a) => a -> Stream m (Array a) -> Stream m a
164159interpose x = S.interpose x A.read
165160
166161{-# INLINE intercalateSuffix #-}
167−intercalateSuffix :: (Monad m, IsStream t, Unboxed a)
168− => Array a -> t m (Array a) -> t m a
162+intercalateSuffix :: (Monad m, Unboxed a)
163+ => Array a -> Stream m (Array a) -> Stream m a
169164intercalateSuffix = S.intercalateSuffix A.read
170165
171166-- | Flatten a stream of arrays appending the given element after each
@@ -173,8 +168,8 @@ intercalateSuffix = S.intercalateSuffix A.read
173168--
174169-- @since 0.7.0
175170{-# INLINE interposeSuffix #-}
176−interposeSuffix :: (Monad m, IsStream t, Unboxed a)
177− => a -> t m (Array a) -> t m a
171+interposeSuffix :: (Monad m, Unboxed a)
172+ => a -> Stream m (Array a) -> Stream m a
178173-- interposeSuffix x = fromStreamD . A.unlines x . toStreamD
179174interposeSuffix x = S.interposeSuffix x A.read
180175
@@ -302,19 +297,19 @@ _splitOn byte (D.Stream step state) = D.Stream step' (Initial state)
302297-- @since 0.7.0
303298{-# INLINE splitOn #-}
304299splitOn
305− :: (IsStream t, MonadIO m)
300+ :: (MonadIO m)
306301 => Word8
307− -> t m (Array Word8)
308− -> t m (Array Word8)
302+ -> Stream m (Array Word8)
303+ -> Stream m (Array Word8)
309304splitOn byte s =
310305 fromStreamD $ D.splitInnerBy (A.breakOn byte) A.splice $ toStreamD s
311306
312307{-# INLINE splitOnSuffix #-}
313308splitOnSuffix
314− :: (IsStream t, MonadIO m)
309+ :: (MonadIO m)
315310 => Word8
316− -> t m (Array Word8)
317− -> t m (Array Word8)
311+ -> Stream m (Array Word8)
312+ -> Stream m (Array Word8)
318313-- splitOn byte s = fromStreamD $ A.splitOn byte $ toStreamD s
319314splitOnSuffix byte s =
320315 fromStreamD $ D.splitInnerBySuffix (A.breakOn byte) A.splice $ toStreamD s
@@ -410,9 +405,9 @@ foldBreak ::
410405 -> m (b, Stream m (A.Array a))
411406-- foldBreak f s = fmap fromStreamD <$> foldBreakD f (toStreamD s)
412407foldBreak f =
413− fmap (fmap Stream.fromStreamK)
408+ fmap (fmap fromStreamK)
414409 . foldBreakK f
415− . Stream.toStreamK
410+ . toStreamK
416411-- If foldBreak performs better than runArrayFoldBreak we can use a rewrite
417412-- rule to rewrite runArrayFoldBreak to fold.
418413-- foldBreak f = runArrayFoldBreak (ArrayFold.fromFold f)
@@ -468,6 +463,10 @@ splitAtArrayListRev n ls
468463-- Fold to a single Array
469464-------------------------------------------------------------------------------
470465
466+{-# INLINE foldlM' #-}
467+foldlM' :: Monad m => (b -> a -> m b) -> m b -> Stream m a -> m b
468+foldlM' step begin = D.foldlM' step begin . S.toStreamD
469+
471470-- XXX Both of these implementations of splicing seem to perform equally well.
472471-- We need to perform benchmarks over a range of sizes though.
473472
@@ -478,16 +477,16 @@ spliceArraysLenUnsafe :: (MonadIO m, Unboxed a)
478477 => Int -> Stream m (MA.Array a) -> m (MA.Array a)
479478spliceArraysLenUnsafe len buffered = do
480479 arr <- liftIO $ MA.newArray len
481− S.foldlM' MA.spliceUnsafe (return arr) buffered
480+ foldlM' MA.spliceUnsafe (return arr) buffered
482481
483482{-# INLINE _spliceArrays #-}
484483_spliceArrays :: (MonadIO m, Unboxed a)
485484 => Stream m (Array a) -> m (Array a)
486485_spliceArrays s = do
487486 buffered <- S.foldr S.cons S.nil s
488− len <- S.sum (S.map Array.length buffered)
487+ len <- S.fold FL.sum (fmap Array.length buffered)
489488 arr <- liftIO $ MA.newArray len
490− final <- S.foldlM' writeArr (return arr) s
489+ final <- foldlM' writeArr (return arr) s
491490 return $ A.unsafeFreeze final
492491
493492 where
@@ -499,8 +498,8 @@ _spliceArraysBuffered :: (MonadIO m, Unboxed a)
499498 => Stream m (Array a) -> m (Array a)
500499_spliceArraysBuffered s = do
501500 buffered <- S.foldr S.cons S.nil s
502− len <- S.sum (S.map Array.length buffered)
503− A.unsafeFreeze <$> spliceArraysLenUnsafe len (S.map A.unsafeThaw s)
501+ len <- S.fold FL.sum (fmap Array.length buffered)
502+ A.unsafeFreeze <$> spliceArraysLenUnsafe len (fmap A.unsafeThaw s)
504503
505504{-# INLINE spliceArraysRealloced #-}
506505spliceArraysRealloced :: forall m a. (MonadIO m, Unboxed a)
@@ -509,7 +508,7 @@ spliceArraysRealloced s = do
509508 let n = allocBytesToElemCount (undefined :: a) (4 * 1024)
510509 idst = liftIO $ MA.newArray n
511510
512− arr <- S.foldlM' MA.spliceExp idst (S.map A.unsafeThaw s)
511+ arr <- foldlM' MA.spliceExp idst (fmap A.unsafeThaw s)
513512 liftIO $ A.unsafeFreeze <$> MA.rightSize arr
514513
515514-- XXX This should just be "fold A.write"
@@ -530,7 +529,7 @@ toArray = spliceArraysRealloced
530529--
531530{-
532531{-# INLINE toArraysInRange #-}
533−toArraysInRange :: (IsStream t, MonadIO m, Unboxed a)
532+toArraysInRange :: (MonadIO m, Unboxed a)
534533 => Int -> Int -> Fold m (Array a) b -> Fold m a b
535534toArraysInRange low high (Fold step initial extract) =
536535-}
@@ -785,9 +784,9 @@ parseBreak p s =
785784 fmap fromStreamD <$> parseBreakD (PRD.fromParserK p) (toStreamD s)
786785-}
787786parseBreak p =
788− fmap (fmap Stream.fromStreamK)
787+ fmap (fmap fromStreamK)
789788 . parseBreakK (PRD.fromParserK p)
790− . Stream.toStreamK
789+ . toStreamK
791790
792791-------------------------------------------------------------------------------
793792-- Elimination - Running Array Folds and parsers
@@ -1155,8 +1154,8 @@ runArrayFoldManyD
11551154-- /Pre-release/
11561155{-# INLINE runArrayFoldMany #-}
11571156runArrayFoldMany
1158− :: (IsStream t, MonadThrow m, Unboxed a)
1157+ :: (MonadThrow m, Unboxed a)
11591158 => ArrayFold m a b
1160− -> t m (Array a)
1161− -> t m b
1159+ -> Stream m (Array a)
1160+ -> Stream m b
11621161runArrayFoldMany p m = fromStreamD $ runArrayFoldManyD p (toStreamD m)