Where it all begins: the function main

Have a look at Main.hs module at the core of this web application.

Two bits of code that should jump out at you as being important are

  1. startSystemState (Proxy :: Proxy AppState) -- start the HAppS state system
  2. simpleHTTP (Conf {port=p}) controller -- start serving web pages

We'll pospone learning about the HAppS state system (the first line) for later.

To learn more about what the controller function is doing, , open this file in ghci: cd src; ghci Main.hs and have a look at these functions using ghci :info .

*Main> :i controller
controller :: [ServerPartT IO Response]
-- Defined at Controller.hs...
*Main> :i ServerPartT
newtype ServerPartT m a
= ServerPartT {unServerPartT :: Request -> WebT m a}
-- Defined in HAppS.Server.SimpleHTTP
instance [overlap ok] (Monad m) => Monad (ServerPartT m)
-- Defined in HAppS.Server.SimpleHTTP
*Main> :i WebT
newtype WebT m a = WebT {unWebT :: m (Result a)}
-- Defined in HAppS.Server.SimpleHTTP
instance [overlap ok] (Monad m) => Monad (WebT m)
-- Defined in HAppS.Server.SimpleHTTP
*Main> :i Result
data Result a
= NoHandle | Ok (Response -> Response) a | Escape Response
-- Defined in HAppS.Server.SimpleHTTP
instance [overlap ok] (Show a) => Show (Result a)
-- Defined in HAppS.Server.SimpleHTTP

The controller function is a list of ServerPartTs, which are basically handlers that accept an HTTP request and return a response. Well, ok... this is a bit obfuscated by the many types involved in the construction, and if you want to be pedantic it's probably a bit more complicated than that, but you don't need to understand all the details at this point. So, for the moment, just think about a ServerPartT as a wrapper over a function that takes an HTTP request and returns a response. We look at what is going on in the controller code in basic url handling, next.

$!

Now you have a choice about what to read next.

If you are in a hurry to write a HAppS application without delving too much into what's going on behind the scenes, read , which looks at what's happening in the controller code.

If you want to understand the HAppS type system in more detail, read understanding HAppS types.

!$