{-# 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