on master help sign in
Add api to generate Stream from memory Address
commit64512cec06f03641d14709330a94d6d99910b9c8 authorRanjeet Kumar Ranjan <ranjeetr@composewell.com> dateFri 22 Jul 2022, 18:01 (4 years ago) parent9ed94a6
3 files changed+58−2
core/src/Streamly/Internal/Data/Stream/Generate.hs+16−2 core/src/Streamly/Internal/Data/Stream/StreamD/Generate.hs+22 core/src/Streamly/Internal/Data/Unfold.hs+20
core/src/Streamly/Internal/Data/Stream/Generate.hs+16−2
@@ -27,13 +27,19 @@ module Streamly.Internal.Data.Stream.Generate
2727 -- * From Containers
2828 , fromFoldable
2929 , fromFoldableM
30+
31+ -- * From memory
32+ , fromPtr
3033 )
3134where
3235
36+import Control.Monad.IO.Class (MonadIO)
37+import Foreign.Storable (Storable)
38+import Foreign.Ptr (Ptr)
3339import Streamly.Internal.Data.Stream.Type (Stream, fromStreamK, toStreamK)
34−import Streamly.Internal.Data.Unfold (Unfold)
40+import Streamly.Internal.Data.Unfold.Type (Unfold)
3541
36−import qualified Streamly.Internal.Data.Stream.StreamD.Type as D
42+import qualified Streamly.Internal.Data.Stream.StreamD.Generate as D
3743import qualified Streamly.Internal.Data.Stream.StreamK.Type as K
3844import qualified Streamly.Internal.Data.Stream.Type as Stream
3945
@@ -140,3 +146,11 @@ fromFoldable = fromStreamK . K.fromFoldable
140146{-# INLINE fromFoldableM #-}
141147fromFoldableM :: (Monad m, Foldable f) => f (m a) -> Stream m a
142148fromFoldableM = Prelude.foldr Stream.consM Stream.nil
149+
150+------------------------------------------------------------------------------
151+-- From pointers
152+------------------------------------------------------------------------------
153+
154+{-# INLINE fromPtr #-}
155+fromPtr :: (MonadIO m, Storable a) => Int -> Ptr a -> Stream m a
156+fromPtr n = Stream.fromStreamD . D.fromPtr n
core/src/Streamly/Internal/Data/Stream/StreamD/Generate.hs+22
@@ -79,6 +79,9 @@ module Streamly.Internal.Data.Stream.StreamD.Generate
7979 , fromList
8080 , fromListM
8181
82+ -- * From Pointers
83+ , fromPtr
84+
8285 -- * Conversions
8386 , fromStreamK
8487 , toStreamK
@@ -86,8 +89,11 @@ module Streamly.Internal.Data.Stream.StreamD.Generate
8689where
8790
8891#include "inline.hs"
92+#include "ArrayMacros.h"
8993
9094import Control.Monad.IO.Class (MonadIO(..))
95+import Foreign.Ptr (Ptr, plusPtr)
96+import Foreign.Storable (Storable (peek), sizeOf)
9197import Streamly.Internal.Control.Concurrent (MonadAsync)
9298import Streamly.Internal.Data.Time.Clock
9399 (Clock(Monotonic), asyncClock, readClock)
@@ -459,3 +465,19 @@ fromListM = Stream step
459465 step _ (m:ms) = m >>= \x -> return $ Yield x ms
460466 step _ [] = return Stop
461467#endif
468+
469+-------------------------------------------------------------------------------
470+-- From pointers
471+-------------------------------------------------------------------------------
472+
473+{-# INLINE fromPtr #-}
474+fromPtr :: forall m a. (MonadIO m, Storable a) => Int -> Ptr a -> Stream m a
475+fromPtr count ptr = Stream step (count, ptr)
476+
477+ where
478+
479+ {-# INLINE_LATE step #-}
480+ step _ (0, _) = return Stop
481+ step _ (n, p) = do
482+ x <- liftIO $ peek p
483+ return $ Yield x (n - 1, PTR_NEXT(p, a))
core/src/Streamly/Internal/Data/Unfold.hs+20
@@ -177,6 +177,9 @@ module Streamly.Internal.Data.Unfold
177177 , fromList
178178 , fromListM
179179
180+ -- ** From Pointer
181+ , fromPtr
182+
180183 , fromStreamK
181184 , fromStreamD
182185
@@ -260,6 +263,8 @@ module Streamly.Internal.Data.Unfold
260263 )
261264where
262265
266+#include "ArrayMacros.h"
267+
263268import Control.Exception (Exception, mask_)
264269import Control.Monad.Catch (MonadCatch)
265270import Data.Functor (($>))
@@ -282,6 +287,9 @@ import Streamly.Internal.Data.Unfold.Type
282287import Prelude
283288 hiding (map, mapM, takeWhile, take, filter, const, zipWith
284289 , drop, dropWhile, either)
290+import Control.Monad.IO.Class (MonadIO (liftIO))
291+import Foreign (Storable, peek, sizeOf)
292+import Foreign.Ptr
285293
286294-- $setup
287295-- >>> import qualified Streamly.Data.Fold as Fold
@@ -627,6 +635,18 @@ fromListM = Unfold step pure
627635 step (x:xs) = (`Yield` xs) <$> x
628636 step [] = pure Stop
629637
638+{-# INLINE fromPtr #-}
639+fromPtr :: forall m a. (MonadIO m, Storable a) => Unfold m (Int, Ptr a) a
640+fromPtr = Unfold step return
641+
642+ where
643+
644+ {-# INLINE_LATE step #-}
645+ step (0, _) = return Stop
646+ step (n, p) = do
647+ x <- liftIO $ peek p
648+ return $ Yield x (n - 1, PTR_NEXT(p, a))
649+
630650------------------------------------------------------------------------------
631651-- Specialized Generation
632652------------------------------------------------------------------------------