{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Control.Moffy.Samples.Handle.TChan (handle, handleNew) where

import Control.Moffy
import Control.Moffy.Handle
import Control.Concurrent.STM
import Data.Time
import System.Timeout

handle :: Maybe DiffTime -> TChan (EvReqs es) -> TChan (EvOccs es) -> Handle' IO es
handle :: forall (es :: Set (*)).
Maybe DiffTime
-> TChan (EvReqs es) -> TChan (EvOccs es) -> Handle' IO es
handle Maybe DiffTime
mt TChan (EvReqs es)
cr TChan (EvOccs es)
c EvReqs es
rqs = forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) (forall a. Int -> IO a -> IO (Maybe a)
timeout forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (RealFrac a, Integral b) => a -> b
round forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Num a => a -> a -> a
* DiffTime
1000000)) Maybe DiffTime
mt do
	forall a. STM a -> IO a
atomically forall a b. (a -> b) -> a -> b
$ forall a. TChan a -> a -> STM ()
writeTChan TChan (EvReqs es)
cr EvReqs es
rqs
	forall a. STM a -> IO a
atomically forall a b. (a -> b) -> a -> b
$ forall a. TChan a -> STM a
readTChan TChan (EvOccs es)
c

handleNew :: TChan (EvReqs es) -> TChan (EvOccs es) -> Handle' IO es
handleNew :: forall (es :: Set (*)).
TChan (EvReqs es) -> TChan (EvOccs es) -> Handle' IO es
handleNew TChan (EvReqs es)
cer TChan (EvOccs es)
ceo EvReqs es
rqs = do
	forall a. STM a -> IO a
atomically forall a b. (a -> b) -> a -> b
$ forall a. TChan a -> a -> STM ()
writeTChan TChan (EvReqs es)
cer EvReqs es
rqs
	forall a. STM a -> IO a
atomically forall a b. (a -> b) -> a -> b
$ forall a. TChan a -> STM (Maybe a)
tryReadTChan TChan (EvOccs es)
ceo