]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/SocketLike.hs
Better name-rewriting engine
[Lucu.git] / Network / HTTP / Lucu / SocketLike.hs
index f64e24bcad680f86d4ec3067f4f9d583558fcd68..b9668e067d47a281516c9fc1cc0c6835a693a20a 100644 (file)
@@ -1,31 +1,42 @@
+{-# LANGUAGE
+    FlexibleContexts
+  , FlexibleInstances
+  , TypeFamilies
+  , UnicodeSyntax
+  #-}
+-- |Type class for things behaves like a 'So.Socket'.
 module Network.HTTP.Lucu.SocketLike
     ( SocketLike(..)
     )
     where
-
 import qualified Network.Socket as So
-import           Network.HTTP.Lucu.HandleLike
+import Network.HTTP.Lucu.HandleLike
 import qualified OpenSSL.Session as SSL
+import Prelude.Unicode
 import qualified System.IO as I
 
-
-class (HandleLike (Handle s)) => SocketLike s where
-    type Handle s :: *
-    accept :: s -> IO (Handle s, So.SockAddr)
-
+class (HandleLike (Handle s)) ⇒ SocketLike s where
+    type Handle s ∷ ★
+    accept        ∷ s → IO (Handle s, So.SockAddr)
+    socketPort    ∷ s → IO So.PortNumber
 
 instance SocketLike So.Socket where
     type Handle So.Socket = I.Handle
+
     accept soSelf
-        = do (soPeer, addr) <- So.accept soSelf
-             hPeer          <- So.socketToHandle soPeer I.ReadWriteMode
+        = do (soPeer, addr)  So.accept soSelf
+             hPeer           So.socketToHandle soPeer I.ReadWriteMode
              return (hPeer, addr)
 
+    socketPort = So.socketPort
 
 instance SocketLike (SSL.SSLContext, So.Socket) where
     type Handle (SSL.SSLContext, So.Socket) = SSL.SSL
+
     accept (ctx, soSelf)
-        = do (soPeer, addr) <- So.accept soSelf
-             ssl            <- SSL.connection ctx soPeer
+        = do (soPeer, addr)  So.accept soSelf
+             ssl             SSL.connection ctx soPeer
              SSL.accept ssl
              return (ssl, addr)
+
+    socketPort = So.socketPort ∘ snd