equal
deleted
inserted
replaced
3 import IO |
3 import IO |
4 import System.IO |
4 import System.IO |
5 import Control.Concurrent |
5 import Control.Concurrent |
6 import Control.Concurrent.STM |
6 import Control.Concurrent.STM |
7 import Control.Exception (finally) |
7 import Control.Exception (finally) |
|
8 import Data.Word |
|
9 import Data.Char |
8 |
10 |
9 data ClientInfo = |
11 data ClientInfo = |
10 ClientInfo |
12 ClientInfo |
11 { |
13 { |
12 chan :: TChan String, |
14 chan :: TChan String, |
13 handle :: Handle, |
15 handle :: Handle, |
14 nick :: String, |
16 nick :: String, |
|
17 protocol :: Word16, |
15 room :: String, |
18 room :: String, |
16 isMaster :: Bool |
19 isMaster :: Bool |
17 } |
20 } |
18 |
21 |
19 data RoomInfo = |
22 data RoomInfo = |
54 return res |
57 return res |
55 |
58 |
56 tselect :: [ClientInfo] -> STM (String, ClientInfo) |
59 tselect :: [ClientInfo] -> STM (String, ClientInfo) |
57 tselect = foldl orElse retry . map (\ci -> (flip (,) ci) `fmap` readTChan (chan ci)) |
60 tselect = foldl orElse retry . map (\ci -> (flip (,) ci) `fmap` readTChan (chan ci)) |
58 |
61 |
|
62 maybeRead :: Read a => String -> Maybe a |
|
63 maybeRead s = case reads s of |
|
64 [(x, rest)] | all isSpace rest -> Just x |
|
65 _ -> Nothing |
|
66 |