@@ -49,6 +49,8 @@ module Streamly.Mem.Array.Types
50 , toStreamD
50 , toStreamD
51 , toStreamDRev
51 , toStreamDRev
53 , toArrayN
55 , toArrayN
@@ -371,13 +373,14 @@ toStreamD Array{..} =
372 return $ D.Yield x (p `plusPtr` (sizeOf (undefined :: a)))
374 return $ D.Yield x (p `plusPtr` (sizeOf (undefined :: a)))
375{-# INLINE toStreamK #-}
376{-# INLINE toStreamK #-}
376−toStreamK :: forall t m a. (K.IsStream t, Monad m, Storable a) => Array a -> t m a
377+toStreamK :: forall t m a. (K.IsStream t, Storable a) => Array a -> t m a
377toStreamK Array{..} =
378toStreamK Array{..} =
378 let p = unsafeForeignPtrToPtr aStart
379 let p = unsafeForeignPtrToPtr aStart
381 go p | p == aEnd = K.nil
384 go p | p == aEnd = K.nil
382 | otherwise =
385 | otherwise =
383 -- See Note in toStreamD.
386 -- See Note in toStreamD.
@@ -405,6 +408,22 @@ toStreamDRev Array{..} =
406 return $ D.Yield x (p `plusPtr` negate (sizeOf (undefined :: a)))
409 return $ D.Yield x (p `plusPtr` negate (sizeOf (undefined :: a)))
411+{-# INLINE toStreamKRev #-}
412+toStreamKRev :: forall t m a. (K.IsStream t, Storable a) => Array a -> t m a
413+toStreamKRev Array {..} =
414+ let p = aEnd `plusPtr` negate (sizeOf (undefined :: a))
419+ go p | p < unsafeForeignPtrToPtr aStart = K.nil
421+ let !x = unsafeInlineIO $ do
423+ touchForeignPtr aStart
425+ in x `K.cons` go (p `plusPtr` negate (sizeOf (undefined :: a)))
408{-# INLINE_NORMAL foldl' #-}
427{-# INLINE_NORMAL foldl' #-}
409foldl' :: forall a b. Storable a => (b -> a -> b) -> b -> Array a -> b
428foldl' :: forall a b. Storable a => (b -> a -> b) -> b -> Array a -> b
410foldl' f z arr = runIdentity $ D.foldl' f z $ toStreamD arr
429foldl' f z arr = runIdentity $ D.foldl' f z $ toStreamD arr