@@ -68,8 +68,7 @@ class BuildHeadersTo hs where
68instance OVERLAPPING_ BuildHeadersTo '[] where
68instance OVERLAPPING_ BuildHeadersTo '[] where
69 buildHeadersTo _ = HNil
69 buildHeadersTo _ = HNil
71−instance OVERLAPPABLE_ ( FromByteString v, BuildHeadersTo xs, KnownSymbol h
71+instance OVERLAPPABLE_ ( FromByteString v, BuildHeadersTo xs, KnownSymbol h )
72− , Contains h xs ~ 'False)
73 => BuildHeadersTo ((Header h v) ': xs) where
72 => BuildHeadersTo ((Header h v) ': xs) where
74 buildHeadersTo headers =
73 buildHeadersTo headers =
75 let wantedHeader = CI.mk . pack $ symbolVal (Proxy :: Proxy h)
74 let wantedHeader = CI.mk . pack $ symbolVal (Proxy :: Proxy h)
@@ -89,7 +88,7 @@ class GetHeaders ls where
89instance OVERLAPPING_ GetHeaders (HList '[]) where
88instance OVERLAPPING_ GetHeaders (HList '[]) where
90 getHeaders _ = []
89 getHeaders _ = []
92−instance OVERLAPPABLE_ ( KnownSymbol h, ToByteString x, GetHeaders (HList xs))
91+instance OVERLAPPABLE_ ( KnownSymbol h, ToByteString x, GetHeaders (HList xs) )
93 => GetHeaders (HList (Header h x ': xs)) where
92 => GetHeaders (HList (Header h x ': xs)) where
94 getHeaders hdrs = case hdrs of
93 getHeaders hdrs = case hdrs of
95 Header val `HCons` rest -> (headerName , toByteString' val):getHeaders rest
94 Header val `HCons` rest -> (headerName , toByteString' val):getHeaders rest
@@ -100,7 +99,7 @@ instance OVERLAPPABLE_ ( KnownSymbol h, ToByteString x, GetHeaders (HList xs))
100instance OVERLAPPING_ GetHeaders (Headers '[] a) where
99instance OVERLAPPING_ GetHeaders (Headers '[] a) where
101 getHeaders _ = []
100 getHeaders _ = []
103−instance OVERLAPPABLE_ ( KnownSymbol h, GetHeaders (HList rest), ToByteString v)
102+instance OVERLAPPABLE_ ( KnownSymbol h, GetHeaders (HList rest), ToByteString v )
104 => GetHeaders (Headers (Header h v ': rest) a) where
103 => GetHeaders (Headers (Header h v ': rest) a) where
105 getHeaders hs = getHeaders $ getHeadersHList hs
104 getHeaders hs = getHeaders $ getHeadersHList hs
@@ -112,20 +111,15 @@ class AddHeader h v orig new
112 addHeader :: v -> orig -> new -- ^ N.B.: The same header can't be added multiple times
111 addHeader :: v -> orig -> new -- ^ N.B.: The same header can't be added multiple times
115−instance OVERLAPPING_ ( KnownSymbol h, ToByteString v, Contains h (fst ': rest) ~ 'False)
114+instance OVERLAPPING_ ( KnownSymbol h, ToByteString v )
116 => AddHeader h v (Headers (fst ': rest) a) (Headers (Header h v ': fst ': rest) a) where
115 => AddHeader h v (Headers (fst ': rest) a) (Headers (Header h v ': fst ': rest) a) where
117 addHeader a (Headers resp heads) = Headers resp (HCons (Header a) heads)
116 addHeader a (Headers resp heads) = Headers resp (HCons (Header a) heads)
119instance OVERLAPPABLE_ ( KnownSymbol h, ToByteString v
118instance OVERLAPPABLE_ ( KnownSymbol h, ToByteString v
120− , new ~ (Headers '[Header h v] a))
119+ , new ~ (Headers '[Header h v] a) )
121 => AddHeader h v a new where
120 => AddHeader h v a new where
122 addHeader a resp = Headers resp (HCons (Header a) HNil)
121 addHeader a resp = Headers resp (HCons (Header a) HNil)
124−type family Contains x xs where
125− Contains x ((Header x a) ': xs) = 'True
126− Contains x ((Header y a) ': xs) = Contains x xs
127− Contains x '[] = 'False
130-- >>> import Servant.API
124-- >>> import Servant.API
131-- >>> import Data.Aeson
125-- >>> import Data.Aeson