on master help sign in
Add functional dependency back to Enter
d4cffe6Oleg Grenrus
servant/src/Servant/Utils/Enter.hs+20−15
@@ -27,41 +27,46 @@ import Prelude.Compat
27
27
28import Servant.API
28import Servant.API
29
29
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
34
35
36+class
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
37− )
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
39 where
40 where
41+ -- | Map the leafs of an API type.
40 enter :: (m :~> n) -> typ -> ret
42 enter :: (m :~> n) -> typ -> ret
41
43
42−-- ** Servant combinators
44+-- ** Servant combinators
43
45
44instance
46instance
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)
50 where
52 where
51 enter e (a :<|> b) = enter e a :<|> enter e b
53 enter e (a :<|> b) = enter e a :<|> enter e b
52
54
53instance
55instance
56+ ( Enter typ m n ret
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)
56− , Enter typ m n ret
57− )
58− => Enter (a -> typ) m n (a -> ret)
59+ ) => Enter (a -> typ) m n (a -> ret)
59 where
60 where
60 enter arg f a = enter arg (f a)
61 enter arg f a = enter arg (f a)
61
62
62−-- ** Useful instances
63+-- ** Leaf instances
63
64
65+instance
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)
69+ where
65 enter (NT f) = f
70 enter (NT f) = f
66
71
67-- | Like `lift`.
72-- | Like `lift`.