on master help sign in
Remove the MonadIO constraints on a few Array APIs

- concat - concatRev - interposeSuffix

commit6efb0875f9900e8f0a61ddecd568ed7015f8a2e6 authorAdithya Kumar <adithya@composewell.com> dateWed 17 Jan 2024, 15:56 (3 years ago) parente6434d9
4 files changed+47−36
core/docs/ApiChangelogs/0.2.0-0.2.2.txt+7−8 core/src/Streamly/Internal/Data/Array.hs+2−2 core/src/Streamly/Internal/Data/Array/Type.hs+4−4 core/src/Streamly/Internal/Data/MutArray/Type.hs+34−22
core/docs/ApiChangelogs/0.2.0-0.2.2.txt+7−8
@@ -197,6 +197,8 @@ Internal API diff
197197 [A] createOfWith :: forall m a. (MonadIO m, Unbox a) => (Int -> m (MutArray a)) -> Int -> Fold m a (MutArray a)
198198 [A] createOf :: forall m a. (MonadIO m, Unbox a) => Int -> Fold m a (MutArray a)
199199 [A] create :: forall m a. (MonadIO m, Unbox a) => Fold m a (MutArray a)
200+ [A] concatWith :: forall m a. (Monad m, Unbox a) => (forall b. IO b -> m b) -> Stream m (MutArray a) -> Stream m a
201+ [A] concatRevWith :: forall m a. (Monad m, Unbox a) => (forall b. IO b -> m b) -> Stream m (MutArray a) -> Stream m a
200202 [A] concatRev :: forall m a. (MonadIO m, Unbox a) => Stream m (MutArray a) -> Stream m a
201203 [A] concat :: forall m a. (MonadIO m, Unbox a) => Stream m (MutArray a) -> Stream m a
202204 [A] compactOnByteSuffix :: MonadIO m => Word8 -> Stream m (MutArray Word8) -> Stream m (MutArray Word8)
@@ -215,15 +217,12 @@ Internal API diff
215217[D] Streamly.Internal.Data.Array.Stream
216218 [C] interposeSuffix
217219 [O] interposeSuffix :: (Monad m, Unbox a) => a -> Stream m (Array a) -> Stream m a
218− [N] interposeSuffix :: forall m a. (MonadIO m, Unbox a) => a -> Stream m (Array a) -> Stream m a
220+ [N] interposeSuffix :: forall m a. (Monad m, Unbox a) => a -> Stream m (Array a) -> Stream m a
219221 [D] flattenArraysRev :: forall m a. (MonadIO m, Unbox a) => Stream m (Array a) -> Stream m a
220222 [D] flattenArrays :: forall m a. (MonadIO m, Unbox a) => Stream m (Array a) -> Stream m a
221223 [C] concatRev
222224 [O] concatRev :: (Monad m, Unbox a) => Stream m (Array a) -> Stream m a
223− [N] concatRev :: forall m a. (MonadIO m, Unbox a) => Stream m (Array a) -> Stream m a
224− [C] concat
225− [O] concat :: (Monad m, Unbox a) => Stream m (Array a) -> Stream m a
226− [N] concat :: (MonadIO m, Unbox a) => Stream m (Array a) -> Stream m a
225+ [N] concatRev :: forall m a. (Monad m, Unbox a) => Stream m (Array a) -> Stream m a
227226 [D] bufferChunks :: (MonadIO m, Unbox a) => Stream m a -> m (StreamK m (Array a))
228227[C] Streamly.Internal.Data.Array.Generic
229228 [A] createOf :: MonadIO m => Int -> Fold m a (Array a)
@@ -240,7 +239,7 @@ Internal API diff
240239 [A] parseBreakChunksK :: forall m a b. (MonadIO m, Unbox a) => Parser a m b -> StreamK m (Array a) -> m (Either ParseError b, StreamK m (Array a))
241240 [D] nil :: Array a
242241 [A] lCompactGE :: (MonadIO m, Unbox a) => Int -> Fold m (Array a) () -> Fold m (Array a) ()
243− [A] interposeSuffix :: forall m a. (MonadIO m, Unbox a) => a -> Stream m (Array a) -> Stream m a
242+ [A] interposeSuffix :: forall m a. (Monad m, Unbox a) => a -> Stream m (Array a) -> Stream m a
244243 [A] interpose :: (Monad m, Unbox a) => a -> Stream m (Array a) -> Stream m a
245244 [A] intercalateSuffix :: (Monad m, Unbox a) => Array a -> Stream m (Array a) -> Stream m a
246245 [A] indexReaderFromThenTo :: Unfold m (Int, Int, Int, Array a) a
@@ -267,8 +266,8 @@ Internal API diff
267266 [N] findIndicesOf :: (a -> Bool) -> Array a -> Stream Identity Int
268267 [A] fCompactGE :: (MonadIO m, Unbox a) => Int -> Fold m (Array a) (Array a)
269268 [A] empty :: Array a
270− [A] concatRev :: forall m a. (MonadIO m, Unbox a) => Stream m (Array a) -> Stream m a
271− [A] concat :: (MonadIO m, Unbox a) => Stream m (Array a) -> Stream m a
269+ [A] concatRev :: forall m a. (Monad m, Unbox a) => Stream m (Array a) -> Stream m a
270+ [A] concat :: (Monad m, Unbox a) => Stream m (Array a) -> Stream m a
272271 [A] compactOnByteSuffix :: MonadIO m => Word8 -> Stream m (Array Word8) -> Stream m (Array Word8)
273272 [A] compactOnByte :: MonadIO m => Word8 -> Stream m (Array Word8) -> Stream m (Array Word8)
274273 [A] compactLE :: (MonadIO m, Unbox a) => Int -> Stream m (Array a) -> Stream m (Array a)
core/src/Streamly/Internal/Data/Array.hs+2−2
@@ -591,7 +591,7 @@ data FlattenState s =
591591-- >>> interposeSuffix x = Stream.interposeSuffix x Array.reader
592592--
593593{-# INLINE_NORMAL interposeSuffix #-}
594−interposeSuffix :: forall m a. (MonadIO m, Unbox a)
594+interposeSuffix :: forall m a. (Monad m, Unbox a)
595595 => a -> Stream m (Array a) -> Stream m a
596596-- This does not require MonadIO constraint.
597597-- interposeSuffix x = D.interposeSuffix x reader
@@ -612,7 +612,7 @@ interposeSuffix sep (D.Stream step state) = D.Stream step' (OuterLoop state)
612612 return $ D.Yield sep $ OuterLoop st
613613
614614 step' _ (InnerLoop st contents p end) = do
615− x <- liftIO $ peekAt p contents
615+ x <- pure $ unsafeInlineIO $ peekAt p contents
616616 return $ D.Yield x (InnerLoop st contents (INDEX_NEXT(p,a)) end)
617617
618618-- | Insert the given array after each array and flatten.
core/src/Streamly/Internal/Data/Array/Type.hs+4−4
@@ -460,9 +460,9 @@ pinnedChunksOf n str = D.map unsafeFreeze $ MA.pinnedChunksOf n str
460460-- >>> concat = Stream.unfoldMany Array.reader
461461--
462462{-# INLINE_NORMAL concat #-}
463−concat :: (MonadIO m, Unbox a) => Stream m (Array a) -> Stream m a
463+concat :: (Monad m, Unbox a) => Stream m (Array a) -> Stream m a
464464-- XXX this requires MonadIO whereas the unfoldMany version does not
465−concat = MA.concat . D.map unsafeThaw
465+concat = MA.concatWith (pure . unsafeInlineIO) . D.map unsafeThaw
466466-- concat = D.unfoldMany reader
467467
468468{-# DEPRECATED flattenArrays "Please use \"unfoldMany reader\" instead." #-}
@@ -476,10 +476,10 @@ flattenArrays = concat
476476-- >>> concatRev = Stream.unfoldMany Array.readerRev
477477--
478478{-# INLINE_NORMAL concatRev #-}
479−concatRev :: forall m a. (MonadIO m, Unbox a)
479+concatRev :: forall m a. (Monad m, Unbox a)
480480 => D.Stream m (Array a) -> D.Stream m a
481481-- XXX this requires MonadIO whereas the unfoldMany version does not
482−concatRev = MA.concatRev . D.map unsafeThaw
482+concatRev = MA.concatRevWith (pure . unsafeInlineIO) . D.map unsafeThaw
483483-- concatRev = D.unfoldMany readerRev
484484
485485{-# DEPRECATED flattenArraysRev "Please use \"unfoldMany readerRev\" instead." #-}
core/src/Streamly/Internal/Data/MutArray/Type.hs+34−22
@@ -242,6 +242,8 @@ module Streamly.Internal.Data.MutArray.Type
242242
243243 -- *** Concat
244244 -- | Append the arrays in a stream to form a stream of elements.
245+ , concatWith
246+ , concatRevWith
245247 , concat
246248 , concatRev
247249
@@ -1653,16 +1655,10 @@ data FlattenState s contents a =
16531655 OuterLoop s
16541656 | InnerLoop s contents !Int !Int
16551657
1656−-- | Use the "reader" unfold instead.
1657−--
1658−-- @concat = unfoldMany reader@
1659−--
1660−-- We can try this if there are any fusion issues in the unfold.
1661−--
1662−{-# INLINE_NORMAL concat #-}
1663−concat :: forall m a. (MonadIO m, Unbox a)
1664− => D.Stream m (MutArray a) -> D.Stream m a
1665−concat (D.Stream step state) = D.Stream step' (OuterLoop state)
1658+{-# INLINE_NORMAL concatWith #-}
1659+concatWith :: forall m a. (Monad m, Unbox a)
1660+ => (forall b. IO b -> m b) -> D.Stream m (MutArray a) -> D.Stream m a
1661+concatWith liftio (D.Stream step state) = D.Stream step' (OuterLoop state)
16661662
16671663 where
16681664
@@ -1679,25 +1675,30 @@ concat (D.Stream step state) = D.Stream step' (OuterLoop state)
16791675 return $ D.Skip $ OuterLoop st
16801676
16811677 step' _ (InnerLoop st contents p end) = do
1682− x <- liftIO $ peekAt p contents
1678+ x <- liftio $ peekAt p contents
16831679 return $ D.Yield x (InnerLoop st contents (INDEX_NEXT(p,a)) end)
16841680
1681+-- | Use the "reader" unfold instead.
1682+--
1683+-- @concat = unfoldMany reader@
1684+--
1685+-- We can try this if there are any fusion issues in the unfold.
1686+--
1687+{-# INLINE_NORMAL concat #-}
1688+concat :: forall m a. (MonadIO m, Unbox a)
1689+ => D.Stream m (MutArray a) -> D.Stream m a
1690+concat = concatWith liftIO
1691+
16851692{-# DEPRECATED flattenArrays "Please use \"unfoldMany reader\" instead." #-}
16861693{-# INLINE flattenArrays #-}
16871694flattenArrays :: forall m a. (MonadIO m, Unbox a)
16881695 => D.Stream m (MutArray a) -> D.Stream m a
16891696flattenArrays = concat
16901697
1691−-- | Use the "readerRev" unfold instead.
1692−--
1693−-- @concat = unfoldMany readerRev@
1694−--
1695−-- We can try this if there are any fusion issues in the unfold.
1696−--
1697−{-# INLINE_NORMAL concatRev #-}
1698−concatRev :: forall m a. (MonadIO m, Unbox a)
1699− => D.Stream m (MutArray a) -> D.Stream m a
1700−concatRev (D.Stream step state) = D.Stream step' (OuterLoop state)
1698+{-# INLINE_NORMAL concatRevWith #-}
1699+concatRevWith :: forall m a. (Monad m, Unbox a)
1700+ => (forall b. IO b -> m b) -> D.Stream m (MutArray a) -> D.Stream m a
1701+concatRevWith liftio (D.Stream step state) = D.Stream step' (OuterLoop state)
17011702
17021703 where
17031704
@@ -1715,10 +1716,21 @@ concatRev (D.Stream step state) = D.Stream step' (OuterLoop state)
17151716 return $ D.Skip $ OuterLoop st
17161717
17171718 step' _ (InnerLoop st contents p start) = do
1718− x <- liftIO $ peekAt p contents
1719+ x <- liftio $ peekAt p contents
17191720 let cur = INDEX_PREV(p,a)
17201721 return $ D.Yield x (InnerLoop st contents cur start)
17211722
1723+-- | Use the "readerRev" unfold instead.
1724+--
1725+-- @concat = unfoldMany readerRev@
1726+--
1727+-- We can try this if there are any fusion issues in the unfold.
1728+--
1729+{-# INLINE_NORMAL concatRev #-}
1730+concatRev :: forall m a. (MonadIO m, Unbox a)
1731+ => D.Stream m (MutArray a) -> D.Stream m a
1732+concatRev = concatRevWith liftIO
1733+
17221734{-# DEPRECATED flattenArraysRev "Please use \"unfoldMany readerRev\" instead." #-}
17231735{-# INLINE flattenArraysRev #-}
17241736flattenArraysRev :: forall m a. (MonadIO m, Unbox a)