module Network.Wai.Router where
import Control.Monad
import Network.Wai
import Control.Applicative
import Data.List

type RouteResponder = ((Maybe Response) -> IO ResponseReceived)
type AppResponder = (Response -> IO ResponseReceived)
type Router = Request -> RouteResponder -> IO ResponseReceived

runRouter :: Router -> Application
runRouter r req res = do
    r req myRes
  where
    myRes (Just resp) = res resp

fromApplication :: Application -> Router
fromApplication app req res = app req (res . pure)

route :: Router -> [Router] -> Router
route d rs req res = do
    r req $ cont d req $ res
  where
    r = foldl' build d rs
    build :: Router -> Router -> Router
    build r b req' res' = b req' (cont r req' res')
    cont :: Router -> Request -> RouteResponder -> RouteResponder
    cont b req resp response@(Just _) =
      resp response
    cont b req resp (Nothing) =
      b req resp