@@ -27,41 +27,46 @@ import Prelude.Compat
28import Servant.API
28import Servant.API
30+-- | Helper type family to state the 'Enter' symmetry.
30type family Entered m n api where
31type family Entered m n api where
31− Entered m n (m a) = n a
32 Entered m n (a -> api) = a -> Entered m n api
32 Entered m n (a -> api) = a -> Entered m n api
33+ Entered m n (m a) = n a
33 Entered m n (api1 :<|> api2) = Entered m n api1 :<|> Entered m n api2
34 Entered m n (api1 :<|> api2) = Entered m n api1 :<|> Entered m n api2
35−class ( Entered m n typ ~ ret
37+ ( Entered m n typ ~ ret
36− , Entered n m ret ~ typ
38+ , Entered n m ret ~ typ
38− => Enter typ m n ret
39+ ) => Enter typ m n ret | typ m n -> ret, ret m n -> typ, ret typ m -> n, ret typ n -> m
41+ -- | Map the leafs of an API type.
40 enter :: (m :~> n) -> typ -> ret
42 enter :: (m :~> n) -> typ -> ret
42−-- ** Servant combinators
44+-- ** Servant combinators
45− ( Entered m1 n1 (typ1 :<|> typ2) ~ (ret1 :<|> ret2)
46− , Entered n1 m1 (ret1 :<|> ret2) ~ (typ1 :<|> typ2)
47− , Enter typ1 m1 n1 ret1, Enter typ2 m2 n2 ret2
47+ ( Enter typ1 m1 n1 ret1, Enter typ2 m2 n2 ret2
48 , m1 ~ m2, n1 ~ n2
48 , m1 ~ m2, n1 ~ n2
49+ , Entered m1 n1 (typ1 :<|> typ2) ~ (ret1 :<|> ret2)
50+ , Entered n1 m1 (ret1 :<|> ret2) ~ (typ1 :<|> typ2)
49 ) => Enter (typ1 :<|> typ2) m1 n1 (ret1 :<|> ret2)
51 ) => Enter (typ1 :<|> typ2) m1 n1 (ret1 :<|> ret2)
51 enter e (a :<|> b) = enter e a :<|> enter e b
53 enter e (a :<|> b) = enter e a :<|> enter e b
54− ( Entered m n (a -> typ) ~ (a -> ret)
57+ , Entered m n (a -> typ) ~ (a -> ret)
55 , Entered n m (a -> ret) ~ (a -> typ)
58 , Entered n m (a -> ret) ~ (a -> typ)
58− => Enter (a -> typ) m n (a -> ret)
59+ ) => Enter (a -> typ) m n (a -> ret)
60 enter arg f a = enter arg (f a)
61 enter arg f a = enter arg (f a)
62−-- ** Useful instances
63+-- ** Leaf instances
66+ ( Entered m n (m a) ~ n a
67+ , Entered n m (n a) ~ m a
64−instance Enter (m a) m n (n a) where
68+ ) => Enter (m a) m n (n a)
65 enter (NT f) = f
70 enter (NT f) = f
67-- | Like `lift`.
72-- | Like `lift`.