Chat server: Difference between revisions

(Added Haskell)
Line 680:
}</lang>
 
<lang haskell>{-# LANGUAGE OverloadedStrings #-}
=={{header|Haskell}}==
<lang haskell>{-# LANGUAGE OverloadedStrings #-}
import Network
import System.IO
Line 696 ⟶ 695:
 
type ServerApp = ReaderT ThreadData IO
data UserSpeaker = ServerUserServer | Client Text
data ThreadData = ThreadData { threadHandle :: Handle
, userTableMV :: MVar (Map Text Handle)}
Line 724 ⟶ 723:
removeUser name = do
echoLocal $ "Exception with " <> name <> ", removing from userTable"
broadcast ServerUserServer $ name <> " has left the server"
modifyUserTable (M.delete name)
 
Line 739 ⟶ 738:
addUser
else do putMVarT usersMV (M.insert name h userTable)
broadcast ServerUserServer $ name <> " has joined the server"
echoRemote "Welcome to the server!\n>> Other users:"
readMVarT usersMV >>=
Line 746 ⟶ 745:
return name
 
broadcast :: UserSpeaker -> Text -> ServerApp ()
broadcast user msg =
viewUsers >>= readMVarT >>= mapM_ (f . snd) . fn . M.toList
where f h = liftIO $ T.hPutStrLn h $ nm <> msg
(fn, nm) = case user of
ServerUserServer -> (id, ">> ")
Client t -> (filter ((/=t) . fst), t <> "> ")
 
Line 764 ⟶ 763:
T.putStrLn "Server started"
newMVar (M.empty) >>= clientLoop server
</lang>
 
=={{header|Java}}==
Anonymous user