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