35 lines
846 B
Haskell
35 lines
846 B
Haskell
|
{-# LANGUAGE ExistentialQuantification #-}
|
||
|
|
||
|
module Phi.Phi ( Phi
|
||
|
, MessageBus
|
||
|
, Message(..)
|
||
|
, initPhi
|
||
|
, runPhi
|
||
|
, sendMessage
|
||
|
, getMessageBus
|
||
|
, receiveMessage
|
||
|
) where
|
||
|
|
||
|
import Control.Concurrent.Chan
|
||
|
import Control.Monad
|
||
|
|
||
|
data Phi = Phi (Chan Message)
|
||
|
data MessageBus = MessageBus (Chan Message)
|
||
|
|
||
|
data Message = forall a. Show a => Message a
|
||
|
|
||
|
initPhi :: IO Phi
|
||
|
initPhi = liftM Phi newChan
|
||
|
|
||
|
runPhi :: Phi -> IO ()
|
||
|
runPhi (Phi chan) = forever $ readChan chan
|
||
|
|
||
|
sendMessage :: Phi -> Message -> IO ()
|
||
|
sendMessage (Phi chan) = writeChan chan
|
||
|
|
||
|
getMessageBus :: Phi -> IO MessageBus
|
||
|
getMessageBus (Phi chan) = liftM MessageBus $ dupChan chan
|
||
|
|
||
|
receiveMessage :: MessageBus -> IO Message
|
||
|
receiveMessage (MessageBus chan) = readChan chan
|