on master help sign in
Add and export toStreamK, toStreamKRev to Streamly.Mem.Array.Types.
833888aPranay Sashank
src/Streamly/Mem/Array/Types.hs+22−3
@@ -49,6 +49,8 @@ module Streamly.Mem.Array.Types
49
49
50 , toStreamD
50 , toStreamD
51 , toStreamDRev
51 , toStreamDRev
52+ , toStreamK
53+ , toStreamKRev
52 , toList
54 , toList
53 , toArrayN
55 , toArrayN
54 , read
56 , read
@@ -371,13 +373,14 @@ toStreamD Array{..} =
371 return r
373 return r
372 return $ D.Yield x (p `plusPtr` (sizeOf (undefined :: a)))
374 return $ D.Yield x (p `plusPtr` (sizeOf (undefined :: a)))
373
375
374−
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
379 in go p
380 in go p
381+
380− where
382+ where
383+
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{..} =
405 return r
408 return r
406 return $ D.Yield x (p `plusPtr` negate (sizeOf (undefined :: a)))
409 return $ D.Yield x (p `plusPtr` negate (sizeOf (undefined :: a)))
407
410
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+
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