Skip to content

Instantly share code, notes, and snippets.

@michaelt
Created October 7, 2016 02:47
Show Gist options
  • Save michaelt/3c8e7a0590691ab1c34e5c088c490bae to your computer and use it in GitHub Desktop.
Save michaelt/3c8e7a0590691ab1c34e5c088c490bae to your computer and use it in GitHub Desktop.
sink to run with the await oneshot rule
{-#LANGUAGE BangPatterns #-}
import Pipes
import qualified Pipes.Prelude as P
import Control.Monad.Trans.State.Strict
import GHC.Magic
import qualified Pipes.Internal as I
import Data.IORef
import Control.Monad
emit :: Int -> Int -> IORef Int -> Producer Int IO ()
emit !large !m ref = do
n <- liftIO (readIORef ref)
when (n < large) $ yield n >> emit large (m+1) ref
receive :: IORef Int -> Consumer Int IO ()
receive ref = do
n <- await
liftIO $ writeIORef ref $! (n+1::Int)
receive ref
main = do
ref <- newIORef 0
let b = receive ref
large = 10000000 :: Int
larger = 2*large
runEffect $ emit large 0 ref >-> b
readIORef ref >>= print
runEffect $ emit larger 0 ref >-> b
readIORef ref >>= print
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment