2011-07-14 20:21:30 +02:00
|
|
|
{-# LANGUAGE ExistentialQuantification, DeriveDataTypeable, StandaloneDeriving #-}
|
2011-07-14 06:16:04 +02:00
|
|
|
|
|
|
|
module Phi.Phi ( Phi
|
2011-07-14 07:34:43 +02:00
|
|
|
, Message
|
2011-07-14 20:21:30 +02:00
|
|
|
, DefaultMessage(..)
|
2011-07-14 07:34:43 +02:00
|
|
|
, fromMessage
|
2011-07-14 06:16:04 +02:00
|
|
|
, initPhi
|
2011-07-15 02:51:50 +02:00
|
|
|
, dupPhi
|
2011-07-14 06:16:04 +02:00
|
|
|
, sendMessage
|
|
|
|
, receiveMessage
|
2011-07-16 13:21:24 +02:00
|
|
|
, messageAvailable
|
2011-07-14 06:16:04 +02:00
|
|
|
) where
|
|
|
|
|
2011-07-16 13:21:24 +02:00
|
|
|
import Control.Concurrent.STM
|
2011-07-14 06:16:04 +02:00
|
|
|
import Control.Monad
|
2011-07-15 09:17:57 +02:00
|
|
|
import Control.Monad.IO.Class
|
|
|
|
|
2011-07-14 07:34:43 +02:00
|
|
|
import Data.Typeable
|
2011-07-14 06:16:04 +02:00
|
|
|
|
2011-07-16 13:21:24 +02:00
|
|
|
data Phi = Phi (TChan Message)
|
2011-07-14 06:16:04 +02:00
|
|
|
|
2011-07-14 07:34:43 +02:00
|
|
|
data Message = forall a. (Typeable a, Show a) => Message a
|
2011-07-14 20:21:30 +02:00
|
|
|
deriving instance Show Message
|
|
|
|
|
2011-07-19 12:25:08 +02:00
|
|
|
data DefaultMessage = Repaint | ResetBackground | Shutdown | HoldShutdown | ReleaseShutdown deriving (Typeable, Show)
|
2011-07-14 07:34:43 +02:00
|
|
|
|
|
|
|
fromMessage :: (Typeable a, Show a) => Message -> Maybe a
|
|
|
|
fromMessage (Message m) = cast m
|
2011-07-14 06:16:04 +02:00
|
|
|
|
2011-07-15 09:17:57 +02:00
|
|
|
initPhi :: MonadIO m => m Phi
|
2011-07-16 13:21:24 +02:00
|
|
|
initPhi = liftM Phi $ liftIO $ atomically newTChan
|
2011-07-14 06:16:04 +02:00
|
|
|
|
2011-07-15 09:17:57 +02:00
|
|
|
dupPhi :: MonadIO m => Phi -> m Phi
|
2011-07-16 13:21:24 +02:00
|
|
|
dupPhi (Phi chan) = liftM Phi $ liftIO $ atomically $ dupTChan chan
|
2011-07-15 02:51:50 +02:00
|
|
|
|
2011-07-15 09:17:57 +02:00
|
|
|
sendMessage :: (MonadIO m, Typeable a, Show a) => Phi -> a -> m ()
|
2011-07-16 13:21:24 +02:00
|
|
|
sendMessage (Phi chan) = liftIO . atomically . writeTChan chan . Message
|
2011-07-14 06:16:04 +02:00
|
|
|
|
2011-07-15 09:17:57 +02:00
|
|
|
receiveMessage :: MonadIO m => Phi -> m Message
|
2011-07-16 13:21:24 +02:00
|
|
|
receiveMessage (Phi chan) = liftIO $ atomically $ readTChan chan
|
|
|
|
|
|
|
|
messageAvailable :: MonadIO m => Phi -> m Bool
|
|
|
|
messageAvailable (Phi chan) = liftIO $ liftM not $ atomically $ isEmptyTChan chan
|