> module Register (startup, rLookup, rNew, rDelete,rDump, stop, Register) > where > import DHSCore (PidInt) #ifdef CONCDEBUG > import ConcurrentDebug as Concurrent #else > import ConcurrentDebugLess as Concurrent #endif > import IO XXX Won´t check for duplicate entries > type Answer = MVar (Maybe PidInt) > data Msgs = Lookup String Answer | New String PidInt | Delete String | Dump | Stop > data Register = RegRR { > chan :: Chan Msgs > } > class RegisterC a where > rLookup :: a -> String -> IO (Maybe PidInt) > rNew :: a -> String -> PidInt -> IO Bool > rDelete :: a -> String -> IO () > rDump :: a -> IO () > stop :: a -> IO () > instance RegisterC Register where > rLookup reg str = do > m <- newEmptyMVar > writeChan (chan reg) (Lookup str m) > res <- takeMVar m > return res XXX > rNew reg str ch = do > writeChan (chan reg) (New str ch) > return True > rDelete reg str = > writeChan (chan reg) (Delete str) > rDump reg = > writeChan (chan reg) Dump > stop reg = > writeChan (chan reg) Stop > startup = do > ch <- newChan > labelChan ch "Register.In" > forkIOLabel "Register" (registered ch []) > let reg = RegRR { > chan = ch > } > return reg > registered :: Chan Msgs -> [(String,PidInt)] -> IO () > registered inch list = do > v <- readChan inch > case v of > Lookup str out -> do > putMVar out (lookup str list) > registered inch list > New str pid -> do > registered inch (insert list str pid) > Delete str -> do > registered inch (delete list str) > Dump -> do > print (map fst list) > registered inch list > Stop -> return () > where > insert l key value = ((key,value) : l) > delete l key = filter (\(name,_) -> name /= key) l -- XXX suboptimal