@@ -17,8 +17,6 @@ module Streamly.Internal.Data.Array.Generic
1717 , writeWith
1818 , writeLastN
1919
20− , fromStreamDN
21− , fromStreamD
2220 , fromStreamN
2321 , fromStream
2422
@@ -30,8 +28,6 @@ module Streamly.Internal.Data.Array.Generic
3028 , reader
3129
3230 , toList
33− , readStreamD
34− , readRevStreamD
3531 , read
3632 , readRev
3733
@@ -48,7 +44,7 @@ where
4844
4945#include "inline.hs"
5046
51−import Control.Monad (when, replicateM)
47+import Control.Monad (replicateM)
5248import Control.Monad.IO.Class (liftIO, MonadIO)
5349import GHC.Base (MutableArray#, RealWorld)
5450import GHC.IO (unsafePerformIO)
@@ -122,38 +118,23 @@ write = fmap unsafeFreeze MArray.write
122118-- Construction - from streams
123119-------------------------------------------------------------------------------
124120
125−{-# INLINE_NORMAL fromStreamDN #-}
126−fromStreamDN :: MonadIO m => Int -> D.Stream m a -> m (Array a)
127−fromStreamDN limit str = do
128− marr <- liftIO $ MArray.new (max limit 0)
129− i <-
130− D.foldlM'
131− (\i x -> i `seq` liftIO $ MArray.putIndexUnsafe i marr x >> return (i + 1))
132− (return 0) $
133− D.take limit str
134− return $ unsafeFreeze $ marr { MArray.arrLen = i }
135−
136−{-# INLINE fromStreamD #-}
137−fromStreamD :: MonadIO m => D.Stream m a -> m (Array a)
138−fromStreamD = D.fold write
139−
140121{-# INLINE fromStreamN #-}
141122fromStreamN :: MonadIO m => Int -> Stream m a -> m (Array a)
142−fromStreamN n m = do
143− when (n < 0) $ error "fromStreamN: negative write count specified"
144− fromStreamDN n m
123+fromStreamN n = D.fold (writeN n)
145124
146125{-# INLINE fromStream #-}
147126fromStream :: MonadIO m => Stream m a -> m (Array a)
148−fromStream = fromStreamD
127+fromStream = D.fold write
128+
129+-- XXX Consider foldr/build fusion in toList/fromList
149130
150131{-# INLINABLE fromListN #-}
151132fromListN :: Int -> [a] -> Array a
152−fromListN n xs = unsafePerformIO $ fromStreamDN n $ D.fromList xs
133+fromListN n xs = unsafePerformIO $ fromStreamN n $ D.fromList xs
153134
154135{-# INLINABLE fromList #-}
155136fromList :: [a] -> Array a
156−fromList xs = unsafePerformIO $ fromStreamD $ D.fromList xs
137+fromList xs = unsafePerformIO $ fromStream $ D.fromList xs
157138
158139-------------------------------------------------------------------------------
159140-- Elimination - Unfolds
@@ -184,23 +165,15 @@ toList arr = loop 0
184165 loop i | i == len = []
185166 loop i = getIndexUnsafe arr i : loop (i + 1)
186167
187−{-# INLINE_NORMAL readStreamD #-}
188−readStreamD :: MonadIO m => Array a -> D.Stream m a
189−readStreamD = MArray.toStreamD . unsafeThaw
190−
191−{-# INLINE_NORMAL readRevStreamD #-}
192−readRevStreamD :: Monad m => Array a -> D.Stream m a
193−readRevStreamD arr@Array{..} =
194− D.map (getIndexUnsafe arr)
195− $ D.enumerateFromThenToIntegral (arrLen - 1) (arrLen - 2) 0
196−
197−{-# INLINE_EARLY read #-}
168+{-# INLINE_NORMAL read #-}
198169read :: MonadIO m => Array a -> Stream m a
199−read = readStreamD
170+read = MArray.toStreamD . unsafeThaw
200171
201−{-# INLINE_EARLY readRev #-}
172+{-# INLINE_NORMAL readRev #-}
202173readRev :: Monad m => Array a -> Stream m a
203−readRev = readRevStreamD
174+readRev arr@Array{..} =
175+ D.map (getIndexUnsafe arr)
176+ $ D.enumerateFromThenToIntegral (arrLen - 1) (arrLen - 2) 0
204177
205178-------------------------------------------------------------------------------
206179-- Elimination - using Folds
@@ -208,15 +181,15 @@ readRev = readRevStreamD
208181
209182{-# INLINE_NORMAL foldl' #-}
210183foldl' :: (b -> a -> b) -> b -> Array a -> b
211−foldl' f z arr = unsafePerformIO $ D.foldl' f z $ readStreamD arr
184+foldl' f z arr = unsafePerformIO $ D.foldl' f z $ read arr
212185
213186{-# INLINE_NORMAL foldr #-}
214187foldr :: (a -> b -> b) -> b -> Array a -> b
215−foldr f z arr = unsafePerformIO $ D.foldr f z $ readStreamD arr
188+foldr f z arr = unsafePerformIO $ D.foldr f z $ read arr
216189
217190{-# INLINE fold #-}
218191fold :: MonadIO m => Fold m a b -> Array a -> m b
219−fold f arr = D.fold f (readStreamD arr)
192+fold f arr = D.fold f (read arr)
220193
221194{-# INLINE streamFold #-}
222195streamFold :: MonadIO m => (Stream m a -> m b) -> Array a -> m b