on master help sign in
Add fromPrimVar - generate a stream from a Prim Var
4374014Harendra Kumar
src/Streamly/Internal/Data/Stream/StreamD.hs+9
@@ -103,6 +103,7 @@ module Streamly.Internal.Data.Stream.StreamD
103 , fromListM
103 , fromListM
104 , fromStreamK
104 , fromStreamK
105 , fromStreamD
105 , fromStreamD
106+ , fromPrimVar
106 , fromSVar
107 , fromSVar
107
108
108 -- * Elimination
109 -- * Elimination
@@ -333,6 +334,7 @@ import qualified Control.Monad.Reader as Reader
333import qualified Control.Monad.State.Strict as State
334import qualified Control.Monad.State.Strict as State
334import qualified Prelude
335import qualified Prelude
335
336
337+import Streamly.Internal.Mutable.Prim.Var (MonadMut, Prim, Var, readVar)
336import Streamly.Internal.Data.Atomics (atomicModifyIORefCAS_)
338import Streamly.Internal.Data.Atomics (atomicModifyIORefCAS_)
337import Streamly.Internal.Memory.Array.Types (Array(..))
339import Streamly.Internal.Memory.Array.Types (Array(..))
338import Streamly.Internal.Data.Fold.Types (Fold(..))
340import Streamly.Internal.Data.Fold.Types (Fold(..))
@@ -664,6 +666,13 @@ fromListM = Stream step
664toStreamD :: (K.IsStream t, Monad m) => t m a -> Stream m a
666toStreamD :: (K.IsStream t, Monad m) => t m a -> Stream m a
665toStreamD = fromStreamK . K.toStream
667toStreamD = fromStreamK . K.toStream
666
668
669+{-# INLINE_NORMAL fromPrimVar #-}
670+fromPrimVar :: (MonadMut m, Prim a) => Var m a -> Stream m a
671+fromPrimVar var = Stream step ()
672+ where
673+ {-# INLINE_LATE step #-}
674+ step _ () = readVar var >>= \x -> return $ Yield x ()
675+
667-------------------------------------------------------------------------------
676-------------------------------------------------------------------------------
668-- Generation from SVar
677-- Generation from SVar
669-------------------------------------------------------------------------------
678-------------------------------------------------------------------------------
src/Streamly/Internal/Mutable/Prim/Var.hs+2
@@ -24,6 +24,8 @@
24module Streamly.Internal.Mutable.Prim.Var
24module Streamly.Internal.Mutable.Prim.Var
25 (
25 (
26 Var
26 Var
27+ , MonadMut
28+ , Prim
27
29
28 -- * Construction
30 -- * Construction
29
31
src/Streamly/Internal/Prelude.hs+10
@@ -58,6 +58,7 @@ module Streamly.Internal.Prelude
58 , fromListM
58 , fromListM
59 , K.fromFoldable
59 , K.fromFoldable
60 , fromFoldableM
60 , fromFoldableM
61+ , fromPrimVar
61
62
62 -- * Elimination
63 -- * Elimination
63
64
@@ -466,6 +467,7 @@ import Streamly.Internal.Data.Pipe.Types (Pipe (..))
466import Streamly.Internal.Data.Time.Units
467import Streamly.Internal.Data.Time.Units
467 (AbsTime, MilliSecond64(..), addToAbsTime, diffAbsTime, toRelTime,
468 (AbsTime, MilliSecond64(..), addToAbsTime, diffAbsTime, toRelTime,
468 toAbsTime)
469 toAbsTime)
470+import Streamly.Internal.Mutable.Prim.Var (MonadMut, Prim, Var)
469
471
470import Streamly.Internal.Data.Strict
472import Streamly.Internal.Data.Strict
471
473
@@ -872,6 +874,14 @@ fromHandle h = go
872 str <- liftIO $ IO.hGetLine h
874 str <- liftIO $ IO.hGetLine h
873 yld str go
875 yld str go
874
876
877+-- | Construct a stream by reading a 'Prim' 'Var' repeatedly.
878+--
879+-- /Internal/
880+--
881+{-# INLINE fromPrimVar #-}
882+fromPrimVar :: (IsStream t, MonadMut m, Prim a) => Var m a -> t m a
883+fromPrimVar = fromStreamD . D.fromPrimVar
884+
875------------------------------------------------------------------------------
885------------------------------------------------------------------------------
876-- Elimination by Folding
886-- Elimination by Folding
877------------------------------------------------------------------------------
887------------------------------------------------------------------------------