@@ -1,8 +1,8 @@
1{-# OPTIONS_GHC -fno-warn-orphans #-}
1{-# OPTIONS_GHC -fno-warn-orphans #-}
3−{-# LANGUAGE CPP #-}
3+{-# LANGUAGE CPP #-}
4−{-# LANGUAGE MagicHash #-}
4+{-# LANGUAGE MagicHash #-}
5−{-# LANGUAGE UnboxedTuples #-}
5+{-# LANGUAGE UnboxedTuples #-}
7#include "inline.hs"
7#include "inline.hs"
@@ -29,15 +29,26 @@ module Streamly.Internal.Data.Array
29 , toStreamD
29 , toStreamD
30 , toStreamDRev
30 , toStreamDRev
32 , fromListN
36 , fromListN
33 , fromList
37 , fromList
34 , fromStreamDN
38 , fromStreamDN
35 , fromStreamD
39 , fromStreamD
39−import Prelude hiding (foldr, length)
49+import Prelude hiding (foldr, length, read)
40import Control.DeepSeq (NFData(..))
50import Control.DeepSeq (NFData(..))
51+import Control.Monad (when)
41import Control.Monad.IO.Class (liftIO, MonadIO)
52import Control.Monad.IO.Class (liftIO, MonadIO)
42import GHC.IO (unsafePerformIO)
53import GHC.IO (unsafePerformIO)
43import GHC.Base (Int(..))
54import GHC.Base (Int(..))
@@ -45,7 +56,10 @@ import Data.Functor.Identity (runIdentity)
45import Data.Primitive.Array hiding (fromList, fromListN)
56import Data.Primitive.Array hiding (fromList, fromListN)
46import qualified GHC.Exts as Exts
57import qualified GHC.Exts as Exts
59+import Streamly.Internal.Data.Unfold.Types (Unfold(..))
48import Streamly.Internal.Data.Fold.Types (Fold(..))
60import Streamly.Internal.Data.Fold.Types (Fold(..))
61+import Streamly.Streams.StreamK.Type (IsStream)
62+import Streamly.Streams.Serial (SerialT)
50import qualified Streamly.Streams.StreamD as D
64import qualified Streamly.Streams.StreamD as D
@@ -149,3 +163,41 @@ fromList xs = unsafePerformIO $ fromStreamD $ D.fromList xs
149instance NFData a => NFData (Array a) where
163instance NFData a => NFData (Array a) where
150 {-# INLINE rnf #-}
164 {-# INLINE rnf #-}
151 rnf = foldl' (\_ x -> rnf x) ()
165 rnf = foldl' (\_ x -> rnf x) ()
167+{-# INLINE fromStreamN #-}
168+fromStreamN :: MonadIO m => Int -> SerialT m a -> m (Array a)
170+ when (n < 0) $ error "fromStreamN: negative write count specified"
171+ fromStreamDN n $ D.toStreamD m
173+{-# INLINE fromStream #-}
174+fromStream :: MonadIO m => SerialT m a -> m (Array a)
175+fromStream m = fromStreamD $ D.toStreamD m
177+{-# INLINE_EARLY toStream #-}
178+toStream :: (Monad m, IsStream t) => Array a -> t m a
179+toStream = D.fromStreamD . toStreamD
181+{-# INLINE_EARLY toStreamRev #-}
182+toStreamRev :: (Monad m, IsStream t) => Array a -> t m a
183+toStreamRev = D.fromStreamD . toStreamDRev
186+fold :: Monad m => Fold m a b -> Array a -> m b
187+fold f arr = D.runFold f (toStreamD arr)
189+{-# INLINE streamFold #-}
190+streamFold :: Monad m => (SerialT m a -> m b) -> Array a -> m b
191+streamFold f arr = f (toStream arr)
193+{-# INLINE_NORMAL read #-}
194+read :: Monad m => Unfold m (Array a) a
195+read = Unfold step inject
197+ inject arr = return (arr, 0)
199+ | i == length arr = return D.Stop
200+ step (arr, (I# i)) =
202+ case Exts.indexArray# (array# arr) i of
203+ (# x #) -> D.Yield x (arr, I# i + 1)