| module TSocket(TSocket(..)) where | 
 | import Thrift | 
 | import Data.IORef | 
 | import Network | 
 | import IO | 
 | import Control.Exception | 
 | data TSocket = TSocket{host::[Char],port::PortNumber,chan :: Maybe Handle} | 
 |  | 
 | instance TTransport TSocket where | 
 |     tisOpen a = case chan a of | 
 |                   Just _ -> True | 
 |                   Nothing -> False | 
 |     topen a = do h <- connectTo (host a) (PortNumber (port a)) | 
 |                  return $ (a{chan = Just h})  | 
 |     tclose a = case chan a of  | 
 |                  Just h -> do hClose h | 
 |                               return $ a{chan=Nothing} | 
 |                  Nothing -> return a | 
 |     tread a 0 = return [] | 
 |     tread a n = case chan a of  | 
 |                   Just h -> handle (\e -> throwDyn (TransportExn "TSocket: Could not read." TE_UNKNOWN)) | 
 |                       (do c <- hGetChar h  | 
 |                           l <- tread a (n-1) | 
 |                           return $ c:l) | 
 |                   Nothing -> return [] | 
 |     twrite a s = case chan a of | 
 |                    Just h -> hPutStr h s | 
 |                    Nothing -> return () | 
 |     tflush a = case chan a of | 
 |                  Just h -> hFlush h | 
 |                  Nothing -> return () | 
 |  | 
 |  |