@@ -23,16 +23,16 @@ module Streamly.Internal.Data.Array.Stream.Foreign
24 -- * Elimination
24 -- * Elimination
25 -- ** Element Folds
25 -- ** Element Folds
26− , fold
26+ , foldBreak
27− , parse
27+ , parseBreak
28− , parseD
28+ , parseBreakD
30 -- ** Array Folds
30 -- ** Array Folds
31− , foldArr
31+ , runArrayFold
32− , foldArr_
32+ , runArrayFoldBreak
33 -- , parseArr
33 -- , parseArr
34− , parseArrD
34+ , runArrayParserDBreak
35− , foldArrMany
35+ , runArrayFoldMany
@@ -82,6 +82,8 @@ import Streamly.Internal.Data.Array.Foreign.Mut.Type
83import qualified Streamly.Internal.Data.Array.Foreign as A
83import qualified Streamly.Internal.Data.Array.Foreign as A
84import qualified Streamly.Internal.Data.Array.Foreign as Array
84import qualified Streamly.Internal.Data.Array.Foreign as Array
85+-- import qualified Streamly.Internal.Data.Array.Stream.Fold.Foreign
85import qualified Streamly.Internal.Data.Array.Foreign.Type as A
87import qualified Streamly.Internal.Data.Array.Foreign.Type as A
86import qualified Streamly.Internal.Data.Array.Foreign.Mut.Type as MA
88import qualified Streamly.Internal.Data.Array.Foreign.Mut.Type as MA
87import qualified Streamly.Internal.Data.Array.Stream.Mut.Foreign as AS
89import qualified Streamly.Internal.Data.Array.Stream.Mut.Foreign as AS
@@ -359,15 +361,20 @@ foldD (Fold fstep initial extract) stream@(D.Stream step state) = do
359-- | Fold an array stream using the supplied 'Fold'. Returns the fold result
361-- | Fold an array stream using the supplied 'Fold'. Returns the fold result
360-- and the unconsumed stream.
362-- and the unconsumed stream.
364+-- > foldBreak f = runArrayFoldBreak (ArrayFold.fromFold f)
362-- /Internal/
366-- /Internal/
364−{-# INLINE_NORMAL fold #-}
368+{-# INLINE_NORMAL foldBreak #-}
365−fold ::
369+foldBreak ::
366 (MonadIO m, Storable a)
370 (MonadIO m, Storable a)
367 => FL.Fold m a b
371 => FL.Fold m a b
368 -> SerialT m (A.Array a)
372 -> SerialT m (A.Array a)
369 -> m (b, SerialT m (A.Array a))
373 -> m (b, SerialT m (A.Array a))
370−fold f s = fmap fromStreamD <$> foldD f (toStreamD s)
374+foldBreak f s = fmap fromStreamD <$> foldD f (toStreamD s)
375+-- If fold performs better than runArrayFoldBreak we can rewrite runArrayFoldBreak to
377+-- fold f = runArrayFoldBreak (ArrayFold.fromFold f)
372-------------------------------------------------------------------------------
379-------------------------------------------------------------------------------
373-- Fold to a single Array
380-- Fold to a single Array
@@ -524,13 +531,15 @@ newtype List a = List {getList :: [a]}
525-- XXX This should be written using CPS (as parseK) if we want it to scale wrt
532-- XXX This should be written using CPS (as parseK) if we want it to scale wrt
526-- to the number of times it can be called on the same stream.
533-- to the number of times it can be called on the same stream.
527−{-# INLINE_NORMAL parseD #-}
534+{-# INLINE_NORMAL parseBreakD #-}
528−parseD ::
535+parseBreakD ::
529 forall m a b. (MonadIO m, MonadThrow m, Storable a)
536 forall m a b. (MonadIO m, MonadThrow m, Storable a)
530 => PRD.Parser m a b
537 => PRD.Parser m a b
531 -> D.Stream m (Array.Array a)
538 -> D.Stream m (Array.Array a)
532 -> m (b, D.Stream m (Array.Array a))
539 -> m (b, D.Stream m (Array.Array a))
533−parseD (PRD.Parser pstep initial extract) stream@(D.Stream step state) = do
541+ (PRD.Parser pstep initial extract) stream@(D.Stream step state) = do
534 res <- initial
543 res <- initial
535 case res of
544 case res of
536 PRD.IPartial s -> go SPEC state (List []) s
545 PRD.IPartial s -> go SPEC state (List []) s
@@ -608,25 +617,36 @@ parseD (PRD.Parser pstep initial extract) stream@(D.Stream step state) = do
609-- /Internal/
618-- /Internal/
611−{-# INLINE_NORMAL parse #-}
620+{-# INLINE_NORMAL parseBreak #-}
612−parse ::
621+parseBreak ::
613 (MonadIO m, MonadThrow m, Storable a)
622 (MonadIO m, MonadThrow m, Storable a)
614 => PR.Parser m a b
623 => PR.Parser m a b
615 -> SerialT m (A.Array a)
624 -> SerialT m (A.Array a)
616 -> m (b, SerialT m (A.Array a))
625 -> m (b, SerialT m (A.Array a))
617−parse p s = fmap fromStreamD <$> parseD (PRD.fromParserK p) (toStreamD s)
627+ fmap fromStreamD <$> parseBreakD (PRD.fromParserK p) (toStreamD s)
619-------------------------------------------------------------------------------
629-------------------------------------------------------------------------------
620-- Elimination - Running Array Folds and parsers
630-- Elimination - Running Array Folds and parsers
621-------------------------------------------------------------------------------
631-------------------------------------------------------------------------------
633+-- | Note that this is not the same as using a @Parser m (Array a) b@ with the
634+-- regular "Streamly.Internal.Data.IsStream.parse" function. The regular parse
635+-- would consume the input arrays as single unit. This parser parses in the way
636+-- as described in the ArrayFold module. The input arrays are treated as @n@
637+-- element units and can be consumed partially. The remaining elements are
638+-- inserted in the source stream as an array.
623−{-# INLINE_NORMAL parseArrD #-}
640+{-# INLINE_NORMAL runArrayParserDBreak #-}
624−parseArrD ::
641+runArrayParserDBreak ::
625 forall m a b. (MonadIO m, MonadThrow m, Storable a)
642 forall m a b. (MonadIO m, MonadThrow m, Storable a)
626 => PRD.Parser m (Array a) b
643 => PRD.Parser m (Array a) b
627 -> D.Stream m (Array.Array a)
644 -> D.Stream m (Array.Array a)
628 -> m (b, D.Stream m (Array.Array a))
645 -> m (b, D.Stream m (Array.Array a))
629−parseArrD (PRD.Parser pstep initial extract) stream@(D.Stream step state) = do
647+ (PRD.Parser pstep initial extract)
648+ stream@(D.Stream step state) = do
630 res <- initial
650 res <- initial
631 case res of
651 case res of
632 PRD.IPartial s -> go SPEC state (List []) s
652 PRD.IPartial s -> go SPEC state (List []) s
@@ -695,26 +715,27 @@ parseArr ::
695 => ASF.Parser m a b
715 => ASF.Parser m a b
696 -> SerialT m (A.Array a)
716 -> SerialT m (A.Array a)
697 -> m (b, SerialT m (A.Array a))
717 -> m (b, SerialT m (A.Array a))
698−parseArr p s = fmap fromStreamD <$> parseD p (toStreamD s)
718+parseArr p s = fmap fromStreamD <$> parseBreakD p (toStreamD s)
701-- | Fold an array stream using the supplied array stream 'Fold'.
721-- | Fold an array stream using the supplied array stream 'Fold'.
703-- /Pre-release/
723-- /Pre-release/
705−{-# INLINE foldArr #-}
725+{-# INLINE runArrayFold #-}
706−foldArr :: (MonadIO m, MonadThrow m, Storable a) =>
726+runArrayFold :: (MonadIO m, MonadThrow m, Storable a) =>
707 ArrayFold m a b -> SerialT m (A.Array a) -> m b
727 ArrayFold m a b -> SerialT m (A.Array a) -> m b
708−foldArr (ArrayFold p) s = fst <$> parseArrD p (toStreamD s)
728+runArrayFold (ArrayFold p) s = fst <$> runArrayParserDBreak p (toStreamD s)
710-- | Like 'fold' but also returns the remaining stream.
730-- | Like 'fold' but also returns the remaining stream.
712-- /Pre-release/
732-- /Pre-release/
714−{-# INLINE foldArr_ #-}
734+{-# INLINE runArrayFoldBreak #-}
715−foldArr_ :: (MonadIO m, MonadThrow m, Storable a) =>
735+runArrayFoldBreak :: (MonadIO m, MonadThrow m, Storable a) =>
716 ArrayFold m a b -> SerialT m (A.Array a) -> m (b, SerialT m (A.Array a))
736 ArrayFold m a b -> SerialT m (A.Array a) -> m (b, SerialT m (A.Array a))
737+runArrayFoldBreak (ArrayFold p) s =
717−foldArr_ (ArrayFold p) s = second fromStreamD <$> parseArrD p (toStreamD s)
738+ second fromStreamD <$> runArrayParserDBreak p (toStreamD s)
719{-# ANN type ParseChunksState Fuse #-}
740{-# ANN type ParseChunksState Fuse #-}
720data ParseChunksState x inpBuf st pst =
741data ParseChunksState x inpBuf st pst =
@@ -724,13 +745,15 @@ data ParseChunksState x inpBuf st pst =
724 | ParseChunksBuf inpBuf st inpBuf !pst
745 | ParseChunksBuf inpBuf st inpBuf !pst
725 | ParseChunksYield x (ParseChunksState x inpBuf st pst)
746 | ParseChunksYield x (ParseChunksState x inpBuf st pst)
727−{-# INLINE_NORMAL foldArrManyD #-}
748+{-# INLINE_NORMAL runArrayFoldManyD #-}
728−foldArrManyD
749+runArrayFoldManyD
729 :: (MonadThrow m, Storable a)
750 :: (MonadThrow m, Storable a)
730 => ArrayFold m a b
751 => ArrayFold m a b
731 -> D.Stream m (Array a)
752 -> D.Stream m (Array a)
732 -> D.Stream m b
753 -> D.Stream m b
733−foldArrManyD (ArrayFold (PRD.Parser pstep initial extract)) (D.Stream step state) =
755+ (ArrayFold (PRD.Parser pstep initial extract)) (D.Stream step state) =
734 D.Stream stepOuter (ParseChunksInit [] state)
757 D.Stream stepOuter (ParseChunksInit [] state)
@@ -844,16 +867,16 @@ foldArrManyD (ArrayFold (PRD.Parser pstep initial extract)) (D.Stream step state
845 stepOuter _ (ParseChunksYield a next) = return $ D.Yield a next
868 stepOuter _ (ParseChunksYield a next) = return $ D.Yield a next
847−-- | Apply an array stream 'Fold' repeatedly on an array stream and emit the
870+-- | Apply an 'ArrayFold' repeatedly on an array stream and emit the
848-- fold outputs in the output stream.
871-- fold outputs in the output stream.
850-- See "Streamly.Prelude.foldMany" for more details.
873-- See "Streamly.Prelude.foldMany" for more details.
852-- /Pre-release/
875-- /Pre-release/
853−{-# INLINE foldArrMany #-}
876+{-# INLINE runArrayFoldMany #-}
854−foldArrMany
877+runArrayFoldMany
855 :: (IsStream t, MonadThrow m, Storable a)
878 :: (IsStream t, MonadThrow m, Storable a)
856 => ArrayFold m a b
879 => ArrayFold m a b
857 -> t m (Array a)
880 -> t m (Array a)
859−foldArrMany p m = fromStreamD $ foldArrManyD p (toStreamD m)
882+runArrayFoldMany p m = fromStreamD $ runArrayFoldManyD p (toStreamD m)