@@ -1,8 +1,8 @@
11{-# OPTIONS_GHC -fno-warn-orphans #-}
22
3−{-# LANGUAGE CPP #-}
4−{-# LANGUAGE MagicHash #-}
5−{-# LANGUAGE UnboxedTuples #-}
3+{-# LANGUAGE CPP #-}
4+{-# LANGUAGE MagicHash #-}
5+{-# LANGUAGE UnboxedTuples #-}
66
77#include "inline.hs"
88
@@ -29,15 +29,26 @@ module Streamly.Internal.Data.Array
2929 , toStreamD
3030 , toStreamDRev
3131
32+ , toStream
33+ , toStreamRev
34+ , read
35+
3236 , fromListN
3337 , fromList
3438 , fromStreamDN
3539 , fromStreamD
40+
41+ , fromStreamN
42+ , fromStream
43+
44+ , streamFold
45+ , fold
3646 )
3747where
3848
39−import Prelude hiding (foldr, length)
49+import Prelude hiding (foldr, length, read)
4050import Control.DeepSeq (NFData(..))
51+import Control.Monad (when)
4152import Control.Monad.IO.Class (liftIO, MonadIO)
4253import GHC.IO (unsafePerformIO)
4354import GHC.Base (Int(..))
@@ -45,7 +56,10 @@ import Data.Functor.Identity (runIdentity)
4556import Data.Primitive.Array hiding (fromList, fromListN)
4657import qualified GHC.Exts as Exts
4758
59+import Streamly.Internal.Data.Unfold.Types (Unfold(..))
4860import Streamly.Internal.Data.Fold.Types (Fold(..))
61+import Streamly.Streams.StreamK.Type (IsStream)
62+import Streamly.Streams.Serial (SerialT)
4963
5064import qualified Streamly.Streams.StreamD as D
5165
@@ -149,3 +163,41 @@ fromList xs = unsafePerformIO $ fromStreamD $ D.fromList xs
149163instance NFData a => NFData (Array a) where
150164 {-# INLINE rnf #-}
151165 rnf = foldl' (\_ x -> rnf x) ()
166+
167+{-# INLINE fromStreamN #-}
168+fromStreamN :: MonadIO m => Int -> SerialT m a -> m (Array a)
169+fromStreamN n m = do
170+ when (n < 0) $ error "fromStreamN: negative write count specified"
171+ fromStreamDN n $ D.toStreamD m
172+
173+{-# INLINE fromStream #-}
174+fromStream :: MonadIO m => SerialT m a -> m (Array a)
175+fromStream m = fromStreamD $ D.toStreamD m
176+
177+{-# INLINE_EARLY toStream #-}
178+toStream :: (Monad m, IsStream t) => Array a -> t m a
179+toStream = D.fromStreamD . toStreamD
180+
181+{-# INLINE_EARLY toStreamRev #-}
182+toStreamRev :: (Monad m, IsStream t) => Array a -> t m a
183+toStreamRev = D.fromStreamD . toStreamDRev
184+
185+{-# INLINE fold #-}
186+fold :: Monad m => Fold m a b -> Array a -> m b
187+fold f arr = D.runFold f (toStreamD arr)
188+
189+{-# INLINE streamFold #-}
190+streamFold :: Monad m => (SerialT m a -> m b) -> Array a -> m b
191+streamFold f arr = f (toStream arr)
192+
193+{-# INLINE_NORMAL read #-}
194+read :: Monad m => Unfold m (Array a) a
195+read = Unfold step inject
196+ where
197+ inject arr = return (arr, 0)
198+ step (arr, i)
199+ | i == length arr = return D.Stop
200+ step (arr, (I# i)) =
201+ return $
202+ case Exts.indexArray# (array# arr) i of
203+ (# x #) -> D.Yield x (arr, I# i + 1)