-import Control.Concurrent
-import qualified Data.ByteString.Lazy.Char8 as B
-import Data.ByteString.Lazy.Char8 (ByteString)
-import Data.Map as M
-import Data.Map (Map)
-import Network
-import Network.HTTP.Lucu.Config
-import Network.HTTP.Lucu.Parser
-import Network.HTTP.Lucu.Request
-import Network.HTTP.Lucu.Resource
-import Network.HTTP.Lucu.Response
-import System.IO
-
-
-type ResourceTable = Map [String] (Resource ())
-
-
-mkResourceTable :: [ ([String], Resource ()) ] -> ResourceTable
-mkResourceTable = M.fromList
-
-
-runHttpd :: Config -> ResourceTable -> IO ()
-runHttpd cnf table
- = withSocketsDo $
- do so <- listenOn (cnfServerPort cnf)
- loop so
+-- |This is the entry point of Lucu httpd. It listens to a socket and
+-- waits for clients. 'runHttpd' never stops by itself so the only way
+-- to stop it is to raise an exception in the thread running it.
+--
+-- Example:
+--
+-- > {-# LANGUAGE OverloadedStrings #-}
+-- > {-# LANGUAGE QuasiQuotes #-}
+-- > module Main where
+-- > import Network
+-- > import Network.HTTP.Lucu
+-- >
+-- > main :: IO ()
+-- > main = let config = defaultConfig
+-- > resources = mkResTree [ ([], helloWorld) ]
+-- > in
+-- > withSocketsDo $ runHttpd config resourcees []
+-- >
+-- > helloWorld :: Resource
+-- > helloWorld = emptyResource {
+-- > resGet
+-- > = Just $ do setContentType [mimeType| text/plain |]
+-- > putChunk "Hello, world!"
+-- > }
+--
+-- FIXME: update the above example
+runHttpd ∷ Config → SchemeMap → IO ()
+runHttpd cnf sm
+ = do let launchers
+ = catMaybes
+ [ do addr ← cnfServerV4Addr cnf
+ return ( launchListener =≪ listenOn AF_INET addr (cnfServerPort cnf)
+ )
+ , do addr ← cnfServerV6Addr cnf
+ return ( launchListener =≪ listenOn AF_INET6 addr (cnfServerPort cnf)
+ )
+#if defined(HAVE_SSL)
+ , do scnf ← cnfSSLConfig cnf
+ addr ← cnfServerV4Addr cnf
+ return ( do so ← listenOn AF_INET addr (sslServerPort scnf)
+ launchListener (sslContext scnf, so)
+ )
+ , do scnf ← cnfSSLConfig cnf
+ addr ← cnfServerV6Addr cnf
+ return ( do so ← listenOn AF_INET6 addr (sslServerPort scnf)
+ launchListener (sslContext scnf, so)
+ )
+#endif
+ ]
+ sequence_ launchers
+ waitForever