on master help sign in
Remove the MonadIO constraints on a few Array APIs
6efb087Adithya Kumar
core/docs/ApiChangelogs/0.2.0-0.2.2.txt+7−8
@@ -197,6 +197,8 @@ Internal API diff
197 [A] createOfWith :: forall m a. (MonadIO m, Unbox a) => (Int -> m (MutArray a)) -> Int -> Fold m a (MutArray a)
197 [A] createOfWith :: forall m a. (MonadIO m, Unbox a) => (Int -> m (MutArray a)) -> Int -> Fold m a (MutArray a)
198 [A] createOf :: forall m a. (MonadIO m, Unbox a) => Int -> Fold m a (MutArray a)
198 [A] createOf :: forall m a. (MonadIO m, Unbox a) => Int -> Fold m a (MutArray a)
199 [A] create :: forall m a. (MonadIO m, Unbox a) => Fold m a (MutArray a)
199 [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
200 [A] concatRev :: forall m a. (MonadIO m, Unbox a) => Stream m (MutArray a) -> Stream m a
202 [A] concatRev :: forall m a. (MonadIO m, Unbox a) => Stream m (MutArray a) -> Stream m a
201 [A] concat :: forall m a. (MonadIO m, Unbox a) => Stream m (MutArray a) -> Stream m a
203 [A] concat :: forall m a. (MonadIO m, Unbox a) => Stream m (MutArray a) -> Stream m a
202 [A] compactOnByteSuffix :: MonadIO m => Word8 -> Stream m (MutArray Word8) -> Stream m (MutArray Word8)
204 [A] compactOnByteSuffix :: MonadIO m => Word8 -> Stream m (MutArray Word8) -> Stream m (MutArray Word8)
@@ -215,15 +217,12 @@ Internal API diff
215[D] Streamly.Internal.Data.Array.Stream
217[D] Streamly.Internal.Data.Array.Stream
216 [C] interposeSuffix
218 [C] interposeSuffix
217 [O] interposeSuffix :: (Monad m, Unbox a) => a -> Stream m (Array a) -> Stream m a
219 [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
219 [D] flattenArraysRev :: forall m a. (MonadIO m, Unbox a) => Stream m (Array a) -> Stream m a
221 [D] flattenArraysRev :: forall m a. (MonadIO m, Unbox a) => Stream m (Array a) -> Stream m a
220 [D] flattenArrays :: forall m a. (MonadIO m, Unbox a) => Stream m (Array a) -> Stream m a
222 [D] flattenArrays :: forall m a. (MonadIO m, Unbox a) => Stream m (Array a) -> Stream m a
221 [C] concatRev
223 [C] concatRev
222 [O] concatRev :: (Monad m, Unbox a) => Stream m (Array a) -> Stream m a
224 [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
227 [D] bufferChunks :: (MonadIO m, Unbox a) => Stream m a -> m (StreamK m (Array a))
226 [D] bufferChunks :: (MonadIO m, Unbox a) => Stream m a -> m (StreamK m (Array a))
228[C] Streamly.Internal.Data.Array.Generic
227[C] Streamly.Internal.Data.Array.Generic
229 [A] createOf :: MonadIO m => Int -> Fold m a (Array a)
228 [A] createOf :: MonadIO m => Int -> Fold m a (Array a)
@@ -240,7 +239,7 @@ Internal API diff
240 [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))
239 [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))
241 [D] nil :: Array a
240 [D] nil :: Array a
242 [A] lCompactGE :: (MonadIO m, Unbox a) => Int -> Fold m (Array a) () -> Fold m (Array a) ()
241 [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
244 [A] interpose :: (Monad m, Unbox a) => a -> Stream m (Array a) -> Stream m a
243 [A] interpose :: (Monad m, Unbox a) => a -> Stream m (Array a) -> Stream m a
245 [A] intercalateSuffix :: (Monad m, Unbox a) => Array a -> Stream m (Array a) -> Stream m a
244 [A] intercalateSuffix :: (Monad m, Unbox a) => Array a -> Stream m (Array a) -> Stream m a
246 [A] indexReaderFromThenTo :: Unfold m (Int, Int, Int, Array a) a
245 [A] indexReaderFromThenTo :: Unfold m (Int, Int, Int, Array a) a
@@ -267,8 +266,8 @@ Internal API diff
267 [N] findIndicesOf :: (a -> Bool) -> Array a -> Stream Identity Int
266 [N] findIndicesOf :: (a -> Bool) -> Array a -> Stream Identity Int
268 [A] fCompactGE :: (MonadIO m, Unbox a) => Int -> Fold m (Array a) (Array a)
267 [A] fCompactGE :: (MonadIO m, Unbox a) => Int -> Fold m (Array a) (Array a)
269 [A] empty :: Array a
268 [A] empty :: Array a
270− [A] concatRev :: forall m a. (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
271− [A] concat :: (MonadIO m, Unbox a) => Stream m (Array a) -> Stream m a
270+ [A] concat :: (Monad m, Unbox a) => Stream m (Array a) -> Stream m a
272 [A] compactOnByteSuffix :: MonadIO m => Word8 -> Stream m (Array Word8) -> Stream m (Array Word8)
271 [A] compactOnByteSuffix :: MonadIO m => Word8 -> Stream m (Array Word8) -> Stream m (Array Word8)
273 [A] compactOnByte :: MonadIO m => Word8 -> Stream m (Array Word8) -> Stream m (Array Word8)
272 [A] compactOnByte :: MonadIO m => Word8 -> Stream m (Array Word8) -> Stream m (Array Word8)
274 [A] compactLE :: (MonadIO m, Unbox a) => Int -> Stream m (Array a) -> Stream m (Array a)
273 [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 =
591-- >>> interposeSuffix x = Stream.interposeSuffix x Array.reader
591-- >>> interposeSuffix x = Stream.interposeSuffix x Array.reader
592--
592--
593{-# INLINE_NORMAL interposeSuffix #-}
593{-# INLINE_NORMAL interposeSuffix #-}
594−interposeSuffix :: forall m a. (MonadIO m, Unbox a)
594+interposeSuffix :: forall m a. (Monad m, Unbox a)
595 => a -> Stream m (Array a) -> Stream m a
595 => a -> Stream m (Array a) -> Stream m a
596-- This does not require MonadIO constraint.
596-- This does not require MonadIO constraint.
597-- interposeSuffix x = D.interposeSuffix x reader
597-- interposeSuffix x = D.interposeSuffix x reader
@@ -612,7 +612,7 @@ interposeSuffix sep (D.Stream step state) = D.Stream step' (OuterLoop state)
612 return $ D.Yield sep $ OuterLoop st
612 return $ D.Yield sep $ OuterLoop st
613
613
614 step' _ (InnerLoop st contents p end) = do
614 step' _ (InnerLoop st contents p end) = do
615− x <- liftIO $ peekAt p contents
615+ x <- pure $ unsafeInlineIO $ peekAt p contents
616 return $ D.Yield x (InnerLoop st contents (INDEX_NEXT(p,a)) end)
616 return $ D.Yield x (InnerLoop st contents (INDEX_NEXT(p,a)) end)
617
617
618-- | Insert the given array after each array and flatten.
618-- | 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
460-- >>> concat = Stream.unfoldMany Array.reader
460-- >>> concat = Stream.unfoldMany Array.reader
461--
461--
462{-# INLINE_NORMAL concat #-}
462{-# 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
464-- XXX this requires MonadIO whereas the unfoldMany version does not
464-- 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
466-- concat = D.unfoldMany reader
466-- concat = D.unfoldMany reader
467
467
468{-# DEPRECATED flattenArrays "Please use \"unfoldMany reader\" instead." #-}
468{-# DEPRECATED flattenArrays "Please use \"unfoldMany reader\" instead." #-}
@@ -476,10 +476,10 @@ flattenArrays = concat
476-- >>> concatRev = Stream.unfoldMany Array.readerRev
476-- >>> concatRev = Stream.unfoldMany Array.readerRev
477--
477--
478{-# INLINE_NORMAL concatRev #-}
478{-# INLINE_NORMAL concatRev #-}
479−concatRev :: forall m a. (MonadIO m, Unbox a)
479+concatRev :: forall m a. (Monad m, Unbox a)
480 => D.Stream m (Array a) -> D.Stream m a
480 => D.Stream m (Array a) -> D.Stream m a
481-- XXX this requires MonadIO whereas the unfoldMany version does not
481-- 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
483-- concatRev = D.unfoldMany readerRev
483-- concatRev = D.unfoldMany readerRev
484
484
485{-# DEPRECATED flattenArraysRev "Please use \"unfoldMany readerRev\" instead." #-}
485{-# 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
242
242
243 -- *** Concat
243 -- *** Concat
244 -- | Append the arrays in a stream to form a stream of elements.
244 -- | Append the arrays in a stream to form a stream of elements.
245+ , concatWith
246+ , concatRevWith
245 , concat
247 , concat
246 , concatRev
248 , concatRev
247
249
@@ -1653,16 +1655,10 @@ data FlattenState s contents a =
1653 OuterLoop s
1655 OuterLoop s
1654 | InnerLoop s contents !Int !Int
1656 | InnerLoop s contents !Int !Int
1655
1657
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 #-}
1658+{-# INLINE_NORMAL concatWith #-}
1663−concat :: forall m a. (MonadIO m, Unbox a)
1659+concatWith :: forall m a. (Monad m, Unbox a)
1664− => D.Stream m (MutArray a) -> D.Stream m a
1660+ => (forall b. IO b -> m b) -> D.Stream m (MutArray a) -> D.Stream m a
1665−concat (D.Stream step state) = D.Stream step' (OuterLoop state)
1661+concatWith liftio (D.Stream step state) = D.Stream step' (OuterLoop state)
1666
1662
1667 where
1663 where
1668
1664
@@ -1679,25 +1675,30 @@ concat (D.Stream step state) = D.Stream step' (OuterLoop state)
1679 return $ D.Skip $ OuterLoop st
1675 return $ D.Skip $ OuterLoop st
1680
1676
1681 step' _ (InnerLoop st contents p end) = do
1677 step' _ (InnerLoop st contents p end) = do
1682− x <- liftIO $ peekAt p contents
1678+ x <- liftio $ peekAt p contents
1683 return $ D.Yield x (InnerLoop st contents (INDEX_NEXT(p,a)) end)
1679 return $ D.Yield x (InnerLoop st contents (INDEX_NEXT(p,a)) end)
1684
1680
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+
1685{-# DEPRECATED flattenArrays "Please use \"unfoldMany reader\" instead." #-}
1692{-# DEPRECATED flattenArrays "Please use \"unfoldMany reader\" instead." #-}
1686{-# INLINE flattenArrays #-}
1693{-# INLINE flattenArrays #-}
1687flattenArrays :: forall m a. (MonadIO m, Unbox a)
1694flattenArrays :: forall m a. (MonadIO m, Unbox a)
1688 => D.Stream m (MutArray a) -> D.Stream m a
1695 => D.Stream m (MutArray a) -> D.Stream m a
1689flattenArrays = concat
1696flattenArrays = concat
1690
1697
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+{-# INLINE_NORMAL concatRevWith #-}
1698−concatRev :: forall m a. (MonadIO m, Unbox a)
1699+concatRevWith :: forall m a. (Monad m, Unbox a)
1699− => D.Stream m (MutArray a) -> D.Stream m a
1700+ => (forall b. IO b -> m b) -> D.Stream m (MutArray a) -> D.Stream m a
1700−concatRev (D.Stream step state) = D.Stream step' (OuterLoop state)
1701+concatRevWith liftio (D.Stream step state) = D.Stream step' (OuterLoop state)
1701
1702
1702 where
1703 where
1703
1704
@@ -1715,10 +1716,21 @@ concatRev (D.Stream step state) = D.Stream step' (OuterLoop state)
1715 return $ D.Skip $ OuterLoop st
1716 return $ D.Skip $ OuterLoop st
1716
1717
1717 step' _ (InnerLoop st contents p start) = do
1718 step' _ (InnerLoop st contents p start) = do
1718− x <- liftIO $ peekAt p contents
1719+ x <- liftio $ peekAt p contents
1719 let cur = INDEX_PREV(p,a)
1720 let cur = INDEX_PREV(p,a)
1720 return $ D.Yield x (InnerLoop st contents cur start)
1721 return $ D.Yield x (InnerLoop st contents cur start)
1721
1722
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+
1722{-# DEPRECATED flattenArraysRev "Please use \"unfoldMany readerRev\" instead." #-}
1734{-# DEPRECATED flattenArraysRev "Please use \"unfoldMany readerRev\" instead." #-}
1723{-# INLINE flattenArraysRev #-}
1735{-# INLINE flattenArraysRev #-}
1724flattenArraysRev :: forall m a. (MonadIO m, Unbox a)
1736flattenArraysRev :: forall m a. (MonadIO m, Unbox a)