@@ -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------------------------------------------------------------------------------