packages feed

servant-swagger 1.0.2 → 1.0.3

raw patch · 3 files changed

+39/−27 lines, 3 files

Files

CHANGELOG.md view
@@ -1,3 +1,9 @@+1.0.3+---++* Fixes:+    * Improve compile-time performance of `BodyTypes` even further (see [18e0d95](https://github.com/haskell-servant/servant-swagger/commit/18e0d95ef6fe9076dd9621cb515d8d1a189f71d3))!+ 1.0.2 --- 
servant-swagger.cabal view
@@ -1,5 +1,5 @@ name:                servant-swagger-version:             1.0.2+version:             1.0.3 synopsis:            Generate Swagger specification for your servant API. description:         Please see README.md homepage:            https://github.com/haskell-servant/servant-swagger
src/Servant/Swagger/Internal/TypeLevel/API.hs view
@@ -52,33 +52,39 @@   Elem x (x ': xs) = 'True   Elem x (y ': xs) = Elem x xs --- | @'AddBodyType' c cs a as@ adds type @a@ to the list @as@--- only if @c@ is in @cs@ and @a@ is not in @as@.--- This allows to build a list of unique body types.-type AddBodyType c cs a as = If (Elem c cs) (Insert a as) as---- | Insert type @x@ into a type list @xs@ only if it is not already there.-type Insert x xs = If (Elem x xs) xs (x ': xs)+-- | Remove duplicates from a type-level list.+type family Nub xs where+  Nub '[] = '[]+  Nub (x ': xs) = x ': Nub (Remove x xs) --- | Merge two lists, ignoring any type in @xs@ which occurs also in @ys@.-type family Merge xs ys where-  Merge '[] ys = ys-  Merge (x ': xs) ys = If (Elem x ys) (Merge xs ys) (x ': (Merge xs ys))+-- | Remove element from a type-level list.+type family Remove x xs where+  Remove x '[]       = '[]+  Remove x (x ': ys) =      Remove x ys+  Remove x (y ': ys) = y ': Remove x ys  -- | Extract a list of unique "body" types for a specific content-type from a servant API.-type family BodyTypes c api :: [*] where-  BodyTypes c (Delete  cs (Headers hdrs a)) = AddBodyType c cs a '[]-  BodyTypes c (Get     cs (Headers hdrs a)) = AddBodyType c cs a '[]-  BodyTypes c (Patch   cs (Headers hdrs a)) = AddBodyType c cs a '[]-  BodyTypes c (Post    cs (Headers hdrs a)) = AddBodyType c cs a '[]-  BodyTypes c (Put     cs (Headers hdrs a)) = AddBodyType c cs a '[]-  BodyTypes c (Delete  cs a) = AddBodyType c cs a '[]-  BodyTypes c (Get     cs a) = AddBodyType c cs a '[]-  BodyTypes c (Patch   cs a) = AddBodyType c cs a '[]-  BodyTypes c (Post    cs a) = AddBodyType c cs a '[]-  BodyTypes c (Put     cs a) = AddBodyType c cs a '[]-  BodyTypes c (ReqBody cs a :> api) = AddBodyType c cs a (BodyTypes c api)-  BodyTypes c (e :> api) = BodyTypes c api-  BodyTypes c (a :<|> b) = Merge (BodyTypes c a) (BodyTypes c b)-  BodyTypes c api = '[]+type BodyTypes c api = Nub (BodyTypes' c api)++-- | @'AddBodyType' c cs a as@ adds type @a@ to the list @as@+-- only if @c@ is in @cs@.+type AddBodyType c cs a as = If (Elem c cs) (a ': as) as++-- | Extract a list of "body" types for a specific content-type from a servant API.+-- To extract unique types see @'BodyTypes'@.+type family BodyTypes' c api :: [*] where+  BodyTypes' c (Delete  cs (Headers hdrs a)) = AddBodyType c cs a '[]+  BodyTypes' c (Get     cs (Headers hdrs a)) = AddBodyType c cs a '[]+  BodyTypes' c (Patch   cs (Headers hdrs a)) = AddBodyType c cs a '[]+  BodyTypes' c (Post    cs (Headers hdrs a)) = AddBodyType c cs a '[]+  BodyTypes' c (Put     cs (Headers hdrs a)) = AddBodyType c cs a '[]+  BodyTypes' c (Delete  cs a) = AddBodyType c cs a '[]+  BodyTypes' c (Get     cs a) = AddBodyType c cs a '[]+  BodyTypes' c (Patch   cs a) = AddBodyType c cs a '[]+  BodyTypes' c (Post    cs a) = AddBodyType c cs a '[]+  BodyTypes' c (Put     cs a) = AddBodyType c cs a '[]+  BodyTypes' c (ReqBody cs a :> api) = AddBodyType c cs a (BodyTypes' c api)+  BodyTypes' c (e :> api) = BodyTypes' c api+  BodyTypes' c (a :<|> b) = AppendList (BodyTypes' c a) (BodyTypes' c b)+  BodyTypes' c api = '[]