@@ -37,8 +37,8 @@ module Streamly.Internal.Data.Array.Type
37 , pinnedFromListN
37 , pinnedFromListN
38 , fromListRev
38 , fromListRev
39 , fromListRevN
39 , fromListRevN
40− , fromStreamDN
40+ , fromStreamN
41− , fromStreamD
41+ , fromStream
42 , fromPureStreamN
42 , fromPureStreamN
43 , fromPureStream
43 , fromPureStream
44 , fromByteStr#
44 , fromByteStr#
@@ -101,6 +101,8 @@ module Streamly.Internal.Data.Array.Type
101 , flattenArrays
101 , flattenArrays
102 , flattenArraysRev
102 , flattenArraysRev
103 , fromArrayStreamK
103 , fromArrayStreamK
@@ -108,7 +110,7 @@ where
108#include "inline.hs"
110#include "inline.hs"
110import Control.Exception (assert)
112import Control.Exception (assert)
111−import Control.Monad (replicateM)
113+import Control.Monad (replicateM, when)
112import Control.Monad.IO.Class (MonadIO(..))
114import Control.Monad.IO.Class (MonadIO(..))
113import Data.Functor.Identity (Identity(..))
115import Data.Functor.Identity (Identity(..))
114import Data.Int (Int8, Int16, Int32, Int64)
116import Data.Int (Int8, Int16, Int32, Int64)
@@ -314,15 +316,45 @@ pinnedFromList xs = unsafePerformIO $ unsafeFreeze <$> MA.pinnedFromList xs
314fromListRev :: Unbox a => [a] -> Array a
316fromListRev :: Unbox a => [a] -> Array a
315fromListRev xs = unsafePerformIO $ unsafeFreeze <$> MA.fromListRev xs
317fromListRev xs = unsafePerformIO $ unsafeFreeze <$> MA.fromListRev xs
319+-- | Create an 'Array' from the first N elements of a stream. The array is
320+-- allocated to size N, if the stream terminates before N elements then the
321+-- array may hold less than N elements.
323+-- >>> fromStreamN n = Stream.fold (Array.writeN n)
317−{-# INLINE_NORMAL fromStreamDN #-}
326+{-# INLINE_NORMAL fromStreamN #-}
327+fromStreamN :: (MonadIO m, Unbox a) => Int -> Stream m a -> m (Array a)
329+ when (n < 0) $ error "writeN: negative write count specified"
330+ unsafeFreeze <$> MA.fromStreamN n m
331+-- fromStreamN n = D.fold (writeN n)
333+{-# DEPRECATED fromStreamDN "Please use fromStreamN instead." #-}
318fromStreamDN :: forall m a. (MonadIO m, Unbox a)
334fromStreamDN :: forall m a. (MonadIO m, Unbox a)
319 => Int -> D.Stream m a -> m (Array a)
335 => Int -> D.Stream m a -> m (Array a)
320−fromStreamDN limit str = unsafeFreeze <$> MA.fromStreamDN limit str
336+fromStreamDN = fromStreamN
338+-- | Create an 'Array' from a stream. This is useful when we want to create a
339+-- single array from a stream of unknown size. 'writeN' is at least twice
340+-- as efficient when the size is already known.
342+-- >>> fromStream = Stream.fold Array.write
344+-- Note that if the input stream is too large memory allocation for the array
345+-- may fail. When the stream size is not known, `chunksOf` followed by
346+-- processing of indvidual arrays in the resulting stream should be preferred.
322{-# INLINE_NORMAL fromStreamD #-}
349{-# INLINE_NORMAL fromStreamD #-}
350+fromStream :: (MonadIO m, Unbox a) => Stream m a -> m (Array a)
351+fromStream = D.fold write
352+-- fromStreamD str = unsafeFreeze <$> MA.fromStream str
354+{-# DEPRECATED fromStreamD "Please use fromStream instead." #-}
323fromStreamD :: forall m a. (MonadIO m, Unbox a)
355fromStreamD :: forall m a. (MonadIO m, Unbox a)
324 => D.Stream m a -> m (Array a)
356 => D.Stream m a -> m (Array a)
325−fromStreamD str = unsafeFreeze <$> MA.fromStreamD str
357+fromStreamD = fromStream
327-------------------------------------------------------------------------------
359-------------------------------------------------------------------------------
328-- Cloning
360-- Cloning