binary-io-0.3.0: lib/Data/Binary/IO/Internal/AwaitNotify.hs
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_HADDOCK hide #-}
module Data.Binary.IO.Internal.AwaitNotify
( Await (..)
, Notify (..)
, newAwaitNotify
)
where
import qualified Foreign
import Data.Word (Word8)
import qualified System.IO as IO
import qualified System.Process as Process
-- | Await signal from a paired 'Notify'. Returns 'False' if the paired 'Notify' does not exist
-- (any more).
newtype Await = Await
{ runAwait :: IO Bool }
-- | Notify the paired 'Await'.
newtype Notify = Notify
{ runNotify :: IO () }
newAwaitNotify :: IO (Await, Notify)
newAwaitNotify = do
buf <- Foreign.calloc @Word8
(read, write) <- Process.createPipe
IO.hSetBuffering read IO.NoBuffering
IO.hSetBuffering write IO.NoBuffering
IO.hSetBinaryMode read True
IO.hSetBinaryMode write True
let notify = IO.hPutBuf write buf 1
let await = (> 0) <$> IO.hGetBufSome read buf 1
pure (Await await, Notify notify)