git.iko.soy/typeable/servant
on master help sign in
fmapRouter.
96f10adMatthias Fischmann
servant-server/src/Servant/Server/Internal/Router.hs+8−2
@@ -4,7 +4,7 @@ import Data.Map (Map)
4import qualified Data.Map as M
4import qualified Data.Map as M
5import Data.Monoid ((<>))
5import Data.Monoid ((<>))
6import Data.Text (Text)
6import Data.Text (Text)
7−import Network.Wai (Request, pathInfo)
7+import Network.Wai (Request, Response, pathInfo)
8import Servant.Server.Internal.PathInfo
8import Servant.Server.Internal.PathInfo
9import Servant.Server.Internal.RoutingApplication
9import Servant.Server.Internal.RoutingApplication
10
10
@@ -21,6 +21,13 @@ data Router =
21 | Choice Router Router
21 | Choice Router Router
22 -- ^ left-biased choice between two routers
22 -- ^ left-biased choice between two routers
23
23
24+fmapRouter :: (RouteResult Response -> RouteResult Response) -> Router -> Router
25+fmapRouter f (LeafRouter a) = LeafRouter $ \req cont -> a req (cont . f)
26+fmapRouter f (StaticRouter m) = StaticRouter (fmapRouter f <$> m)
27+fmapRouter f (DynamicRouter d) = DynamicRouter (fmapRouter f <$> d)
28+fmapRouter f (Choice r1 r2) = Choice (fmapRouter f r1) (fmapRouter f r2)
29+fmapRouter f (WithRequest g) = WithRequest (fmapRouter f . g)
30+
24-- | Smart constructor for the choice between routers.
31-- | Smart constructor for the choice between routers.
25-- We currently optimize the following cases:
32-- We currently optimize the following cases:
26--
33--
@@ -69,4 +76,3 @@ runRouter (Choice r1 r2) request respond =
69 then runRouter r2 request $ \ mResponse2 ->
76 then runRouter r2 request $ \ mResponse2 ->
70 respond (mResponse1 <> mResponse2)
77 respond (mResponse1 <> mResponse2)
71 else respond mResponse1
78 else respond mResponse1
72−