@@ -1,14 +1,16 @@
1−{-# LANGUAGE CPP #-}
2−{-# LANGUAGE DataKinds #-}
3−{-# LANGUAGE FlexibleContexts #-}
4−{-# LANGUAGE FlexibleInstances #-}
5−{-# LANGUAGE InstanceSigs #-}
6−{-# LANGUAGE OverloadedStrings #-}
7−{-# LANGUAGE PolyKinds #-}
8−{-# LANGUAGE ScopedTypeVariables #-}
9−{-# LANGUAGE TypeFamilies #-}
10−{-# LANGUAGE TypeOperators #-}
11−{-# LANGUAGE UndecidableInstances #-}
1+{-# LANGUAGE CPP #-}
2+{-# LANGUAGE DataKinds #-}
3+{-# LANGUAGE FlexibleContexts #-}
4+{-# LANGUAGE FlexibleInstances #-}
5+{-# LANGUAGE FunctionalDependencies #-}
6+{-# LANGUAGE InstanceSigs #-}
7+{-# LANGUAGE MultiParamTypeClasses #-}
8+{-# LANGUAGE OverloadedStrings #-}
9+{-# LANGUAGE PolyKinds #-}
10+{-# LANGUAGE ScopedTypeVariables #-}
11+{-# LANGUAGE TypeFamilies #-}
12+{-# LANGUAGE TypeOperators #-}
13+{-# LANGUAGE UndecidableInstances #-}
1214
1315#include "overlapping-compat.h"
1416-- | This module provides 'client' which can automatically generate
@@ -18,6 +20,7 @@ module Servant.Client
1820 ( AuthClientData
1921 , AuthenticateReq(..)
2022 , client
23+ , staticClient
2124 , HasClient(..)
2225 , ClientM
2326 , mkAuthenticateReq
@@ -60,6 +63,36 @@ import Servant.Common.Req
6063client :: HasClient layout => Proxy layout -> Client layout
6164client p = clientWithRoute p defReq
6265
66+
67+class Foo layout where
68+ type StaticClient layout :: *
69+ staticClient :: Proxy layout -> BaseUrl -> StaticClient layout
70+
71+instance (Foo left, Foo right) => Foo (left :<|> right) where
72+ type StaticClient (left :<|> right) = StaticClient left :<|> StaticClient right
73+ staticClient p url =
74+ staticClient pleft url :<|>
75+ staticClient pright url
76+ where pleft = Proxy :: Proxy left
77+ pright = Proxy :: Proxy right
78+
79+instance OVERLAPPABLE_ (Client (combinator :> api) ~ Client api, Foo api) => Foo (combinator :> api) where
80+ type StaticClient (combinator :> api) = StaticClient api
81+ staticClient p url = staticClient (Proxy :: Proxy api) url
82+
83+instance OVERLAPPING_ (MimeRender ct a, Client (ReqBody (ct ': cts) a :> sublayout) ~ (a -> Client sublayout), Foo sublayout)
84+ => Foo (ReqBody (ct ': cts) a :> sublayout) where
85+ type StaticClient (ReqBody (ct ': cts) a :> sublayout) = a -> Client sublayout
86+ staticClient p url = _
87+
88+instance (Client (Verb method status ctypes result) ~ (Manager -> BaseUrl -> ClientM result), ctypes ~ (c ': ct), MimeUnrender c result, ReflectMethod method) => Foo (Verb method status ctypes result) where
89+ type StaticClient (Verb method status ctypes result) = Manager -> ClientM result
90+ staticClient p url = \ mgr -> (client p) mgr url
91+
92+instance Foo Raw where
93+ type StaticClient Raw = H.Method -> Manager -> ClientM (Int, ByteString, MediaType, [HTTP.Header], Response ByteString)
94+ staticClient p url = \h m -> (client p) h m url
95+
6396-- | This class lets us define how each API combinator
6497-- influences the creation of an HTTP request. It's mostly
6598-- an internal class, you can just use 'client'.