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