@@ -49,6 +49,8 @@ module Streamly.Mem.Array.Types
4949
5050 , toStreamD
5151 , toStreamDRev
52+ , toStreamK
53+ , toStreamKRev
5254 , toList
5355 , toArrayN
5456 , read
@@ -371,13 +373,14 @@ toStreamD Array{..} =
371373 return r
372374 return $ D.Yield x (p `plusPtr` (sizeOf (undefined :: a)))
373375
374−
375376{-# 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
377378toStreamK Array{..} =
378379 let p = unsafeForeignPtrToPtr aStart
379380 in go p
380− where
381+
382+ where
383+
381384 go p | p == aEnd = K.nil
382385 | otherwise =
383386 -- See Note in toStreamD.
@@ -405,6 +408,22 @@ toStreamDRev Array{..} =
405408 return r
406409 return $ D.Yield x (p `plusPtr` negate (sizeOf (undefined :: a)))
407410
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))
415+ in go p
416+
417+ where
418+
419+ go p | p < unsafeForeignPtrToPtr aStart = K.nil
420+ | otherwise =
421+ let !x = unsafeInlineIO $ do
422+ r <- peek p
423+ touchForeignPtr aStart
424+ return r
425+ in x `K.cons` go (p `plusPtr` negate (sizeOf (undefined :: a)))
426+
408427{-# INLINE_NORMAL foldl' #-}
409428foldl' :: forall a b. Storable a => (b -> a -> b) -> b -> Array a -> b
410429foldl' f z arr = runIdentity $ D.foldl' f z $ toStreamD arr