summaryrefslogtreecommitdiffstats
path: root/lib/Phi/Phi.hs
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2011-07-14 07:34:43 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2011-07-14 07:34:43 +0200
commit7c0f602343e84823d370c8742716ce6b7a8b9850 (patch)
tree1eec8fe4cb291503ccb877745f8fc28a82d63679 /lib/Phi/Phi.hs
parente4314c03faa77d71ad69ec37b83e2634e1a2a9c9 (diff)
downloadphi-7c0f602343e84823d370c8742716ce6b7a8b9850.tar
phi-7c0f602343e84823d370c8742716ce6b7a8b9850.zip
Handle X events asynchronously
Diffstat (limited to 'lib/Phi/Phi.hs')
-rw-r--r--lib/Phi/Phi.hs13
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/Phi/Phi.hs b/lib/Phi/Phi.hs
index 9df36f3..5d14181 100644
--- a/lib/Phi/Phi.hs
+++ b/lib/Phi/Phi.hs
@@ -2,7 +2,8 @@
module Phi.Phi ( Phi
, MessageBus
- , Message(..)
+ , Message
+ , fromMessage
, initPhi
, runPhi
, sendMessage
@@ -12,11 +13,15 @@ module Phi.Phi ( Phi
import Control.Concurrent.Chan
import Control.Monad
+import Data.Typeable
data Phi = Phi (Chan Message)
data MessageBus = MessageBus (Chan Message)
-data Message = forall a. Show a => Message a
+data Message = forall a. (Typeable a, Show a) => Message a
+
+fromMessage :: (Typeable a, Show a) => Message -> Maybe a
+fromMessage (Message m) = cast m
initPhi :: IO Phi
initPhi = liftM Phi newChan
@@ -24,8 +29,8 @@ initPhi = liftM Phi newChan
runPhi :: Phi -> IO ()
runPhi (Phi chan) = forever $ readChan chan
-sendMessage :: Phi -> Message -> IO ()
-sendMessage (Phi chan) = writeChan chan
+sendMessage :: (Typeable a, Show a) => Phi -> a -> IO ()
+sendMessage (Phi chan) = writeChan chan . Message
getMessageBus :: Phi -> IO MessageBus
getMessageBus (Phi chan) = liftM MessageBus $ dupChan chan