git.iko.soy/typeable/servant
on master help sign in
Merge pull request #996 from phadej/remove-enter

Remove Servant.Utils.Enter

commit5854071641a882074079c281db3ec8f02692faa1 authorOleg Grenrus <oleg.grenrus@iki.fi> dateMon 25 Jun 2018, 01:25 (8 years ago) parentae05ef57150f2b
3 files changed−158
servant/servant.cabal−3 servant/src/Servant/Utils/Enter.hs−122 servant/test/Servant/Utils/EnterSpec.hs−33
servant/servant.cabal−3
@@ -63,7 +63,6 @@ library
6363 Servant.API.Verbs
6464 Servant.API.WithNamedContext
6565 Servant.Utils.Links
66− Servant.Utils.Enter
6766
6867 -- Bundled with GHC: Lower bound to not force re-installs
6968 -- text and mtl are bundled starting with GHC-8.4
@@ -89,7 +88,6 @@ library
8988 , http-api-data >= 0.3.8.1 && < 0.4
9089 , http-media >= 0.7.1.2 && < 0.8
9190 , http-types >= 0.12.1 && < 0.13
92− , natural-transformation >= 0.4 && < 0.5
9391 , mmorph >= 1.1.2 && < 1.2
9492 , tagged >= 0.8.5 && < 0.9
9593 , singleton-bool >= 0.1.4 && < 0.2
@@ -134,7 +132,6 @@ test-suite spec
134132 Servant.API.ContentTypesSpec
135133 Servant.API.ResponseHeadersSpec
136134 Servant.Utils.LinksSpec
137− Servant.Utils.EnterSpec
138135
139136 -- Dependencies inherited from the library. No need to specify bounds.
140137 build-depends:
servant/src/Servant/Utils/Enter.hsdeleted−122
@@ -1,122 +0,0 @@
1−{-# LANGUAGE CPP #-}
2−{-# LANGUAGE FlexibleInstances #-}
3−{-# LANGUAGE FunctionalDependencies #-}
4−{-# LANGUAGE MultiParamTypeClasses #-}
5−{-# LANGUAGE RankNTypes #-}
6−{-# LANGUAGE ScopedTypeVariables #-}
7−{-# LANGUAGE TypeFamilies #-}
8−{-# LANGUAGE TypeOperators #-}
9−{-# LANGUAGE UndecidableInstances #-}
10−module Servant.Utils.Enter {-# DEPRECATED "Use hoistServer or hoistServerWithContext from servant-server" #-} (
11− module Servant.Utils.Enter,
12− -- * natural-transformation re-exports
13− (:~>)(..),
14− ) where
15−
16−import Control.Monad.Identity
17−import Control.Monad.Morph
18−import Control.Monad.Reader
19−import qualified Control.Monad.State.Lazy as LState
20−import qualified Control.Monad.State.Strict as SState
21−import qualified Control.Monad.Writer.Lazy as LWriter
22−import qualified Control.Monad.Writer.Strict as SWriter
23−import Control.Natural
24−import Data.Tagged
25− (Tagged, retag)
26−import Prelude ()
27−import Prelude.Compat
28−import Servant.API
29−
30−-- | Helper type family to state the 'Enter' symmetry.
31−type family Entered m n api where
32− Entered m n (a -> api) = a -> Entered m n api
33− Entered m n (m a) = n a
34− Entered m n (api1 :<|> api2) = Entered m n api1 :<|> Entered m n api2
35− Entered m n (Tagged m a) = Tagged n a
36−
37−class
38− ( Entered m n typ ~ ret
39− , Entered n m ret ~ typ
40− ) => Enter typ m n ret | typ m n -> ret, ret m n -> typ, ret typ m -> n, ret typ n -> m
41− where
42− -- | Map the leafs of an API type.
43− enter :: (m :~> n) -> typ -> ret
44−
45−-- ** Servant combinators
46−
47−instance
48− ( Enter typ1 m1 n1 ret1, Enter typ2 m2 n2 ret2
49− , m1 ~ m2, n1 ~ n2
50− , Entered m1 n1 (typ1 :<|> typ2) ~ (ret1 :<|> ret2)
51− , Entered n1 m1 (ret1 :<|> ret2) ~ (typ1 :<|> typ2)
52− ) => Enter (typ1 :<|> typ2) m1 n1 (ret1 :<|> ret2)
53− where
54− enter e (a :<|> b) = enter e a :<|> enter e b
55−
56−instance
57− ( Enter typ m n ret
58− , Entered m n (a -> typ) ~ (a -> ret)
59− , Entered n m (a -> ret) ~ (a -> typ)
60− ) => Enter (a -> typ) m n (a -> ret)
61− where
62− enter arg f a = enter arg (f a)
63−
64−-- ** Leaf instances
65−
66−instance
67− ( Entered m n (Tagged m a) ~ Tagged n a
68− , Entered n m (Tagged n a) ~ Tagged m a
69− ) => Enter (Tagged m a) m n (Tagged n a)
70− where
71− enter _ = retag
72−
73−instance
74− ( Entered m n (m a) ~ n a
75− , Entered n m (n a) ~ m a
76− ) => Enter (m a) m n (n a)
77− where
78− enter (NT f) = f
79−
80−-- | Like `lift`.
81−liftNat :: (Control.Monad.Morph.MonadTrans t, Monad m) => m :~> t m
82−liftNat = NT Control.Monad.Morph.lift
83−
84−runReaderTNat :: r -> (ReaderT r m :~> m)
85−runReaderTNat a = NT (`runReaderT` a)
86−
87−evalStateTLNat :: Monad m => s -> (LState.StateT s m :~> m)
88−evalStateTLNat a = NT (`LState.evalStateT` a)
89−
90−evalStateTSNat :: Monad m => s -> (SState.StateT s m :~> m)
91−evalStateTSNat a = NT (`SState.evalStateT` a)
92−
93−-- | Log the contents of `SWriter.WriterT` with the function provided as the
94−-- first argument, and return the value of the @WriterT@ computation
95−logWriterTSNat :: MonadIO m => (w -> IO ()) -> (SWriter.WriterT w m :~> m)
96−logWriterTSNat logger = NT $ \x -> do
97− (a, w) <- SWriter.runWriterT x
98− liftIO $ logger w
99− return a
100−
101−-- | Like `logWriterTSNat`, but for lazy @WriterT@.
102−logWriterTLNat :: MonadIO m => (w -> IO ()) -> (LWriter.WriterT w m :~> m)
103−logWriterTLNat logger = NT $ \x -> do
104− (a, w) <- LWriter.runWriterT x
105− liftIO $ logger w
106− return a
107−
108−-- | Like @mmorph@'s `hoist`.
109−hoistNat :: (MFunctor t, Monad m) => (m :~> n) -> (t m :~> t n)
110−hoistNat (NT n) = NT $ hoist n
111−
112−-- | Like @mmorph@'s `embed`.
113−embedNat :: (MMonad t, Monad n) => (m :~> t n) -> (t m :~> t n)
114−embedNat (NT n) = NT $ embed n
115−
116−-- | Like @mmorph@'s `squash`.
117−squashNat :: (Monad m, MMonad t) => t (t m) :~> t m
118−squashNat = NT squash
119−
120−-- | Like @mmorph@'s `generalize`.
121−generalizeNat :: Applicative m => Identity :~> m
122−generalizeNat = NT (pure . runIdentity)
servant/test/Servant/Utils/EnterSpec.hsdeleted−33
@@ -1,33 +0,0 @@
1−{-# LANGUAGE DataKinds #-}
2−{-# LANGUAGE TypeOperators #-}
3−{-# OPTIONS_GHC -fno-warn-deprecations #-}
4−module Servant.Utils.EnterSpec where
5−
6−import Test.Hspec (Spec)
7−
8−import Servant.API
9−import Servant.Utils.Enter
10−
11−-------------------------------------------------------------------------------
12−-- https://github.com/haskell-servant/servant/issues/734
13−-------------------------------------------------------------------------------
14−
15−-- This didn't fail if executed in GHCi; cannot have as a doctest.
16−
17−data App a
18−
19−f :: App :~> App
20−f = NT id
21−
22−server :: App Int :<|> (String -> App Bool)
23−server = undefined
24−
25−server' :: App Int :<|> (String -> App Bool)
26−server' = enter f server
27−
28−-------------------------------------------------------------------------------
29−-- Spec
30−-------------------------------------------------------------------------------
31−
32−spec :: Spec
33−spec = return ()