on master help sign in
Ambiguous default for MonadReader
15f3a29Index Int
ether.cabal−1
@@ -55,7 +55,6 @@ library
55 Control.Monad.Ether.Implicit.State.Strict
55 Control.Monad.Ether.Implicit.State.Strict
56 Control.Monad.Ether.Implicit.Except
56 Control.Monad.Ether.Implicit.Except
57 Control.Monad.Ether.Ambiguous
57 Control.Monad.Ether.Ambiguous
58− Control.Monad.Ether.Ambiguous.Reader
59 Control.Monad.Ether.Ambiguous.Writer
58 Control.Monad.Ether.Ambiguous.Writer
60 Control.Monad.Ether.Ambiguous.State
59 Control.Monad.Ether.Ambiguous.State
61 Control.Monad.Ether.Ambiguous.State.Lazy
60 Control.Monad.Ether.Ambiguous.State.Lazy
src/Control/Monad/Ether/Ambiguous.hs+1−1
@@ -6,7 +6,7 @@ module Control.Monad.Ether.Ambiguous (module X) where
6
6
7import Control.Monad as X
7import Control.Monad as X
8import Control.Monad.Fix as X
8import Control.Monad.Fix as X
9−import Control.Monad.Ether.Ambiguous.Reader as X
9+import Control.Monad.Ether.Reader as X
10import Control.Monad.Ether.Ambiguous.Writer as X
10import Control.Monad.Ether.Ambiguous.Writer as X
11import Control.Monad.Ether.Ambiguous.State as X
11import Control.Monad.Ether.Ambiguous.State as X
12import Control.Monad.Ether.Ambiguous.Except as X
12import Control.Monad.Ether.Ambiguous.Except as X
src/Control/Monad/Ether/Ambiguous/Reader.hsdeleted−54
@@ -1,54 +0,0 @@
1−{-# LANGUAGE AllowAmbiguousTypes #-}
2−{-# LANGUAGE ScopedTypeVariables #-}
3−{-# LANGUAGE MagicHash #-}
4−
5−-- | See "Control.Monad.Ether.Reader".
6−
7−module Control.Monad.Ether.Ambiguous.Reader
8− (
9− -- * MonadReader class
10− MonadReader
11− , local
12− , ask
13− , reader
14− , asks
15− -- * The Reader monad
16− , Reader
17− , runReader
18− -- * The ReaderT monad transformer
19− , ReaderT
20− , readerT
21− , runReaderT
22− ) where
23−
24−import GHC.Prim (Proxy#, proxy#)
25−import Control.Monad.Ether.Reader (MonadReader, ReaderT, Reader)
26−import qualified Control.Monad.Ether.Reader as Explicit
27−
28−-- | See 'Control.Monad.Ether.Reader.readerT'.
29−readerT :: forall tag r m a . (r -> m a) -> ReaderT tag r m a
30−readerT = Explicit.readerT proxy#
31−
32−-- | See 'Control.Monad.Ether.Reader.runReaderT'.
33−runReaderT :: forall tag r m a . ReaderT tag r m a -> r -> m a
34−runReaderT = Explicit.runReaderT proxy#
35−
36−-- | See 'Control.Monad.Ether.Reader.runReader'.
37−runReader :: forall tag r a . Reader tag r a -> r -> a
38−runReader = Explicit.runReader proxy#
39−
40−-- | See 'Control.Monad.Ether.Reader.local'.
41−local :: forall tag r m a . MonadReader tag r m => (r -> r) -> m a -> m a
42−local = Explicit.local (proxy# :: Proxy# tag)
43−
44−-- | See 'Control.Monad.Ether.Reader.ask'.
45−ask :: forall tag r m . MonadReader tag r m => m r
46−ask = Explicit.ask (proxy# :: Proxy# tag)
47−
48−-- | See 'Control.Monad.Ether.Reader.reader'.
49−reader :: forall tag r m a . MonadReader tag r m => (r -> a) -> m a
50−reader = Explicit.reader (proxy# :: Proxy# tag)
51−
52−-- | See 'Control.Monad.Ether.Reader.asks'.
53−asks :: forall tag r m a . MonadReader tag r m => (r -> a) -> m a
54−asks = Explicit.asks (proxy# :: Proxy# tag)
src/Control/Monad/Ether/Implicit/Reader.hs+1−1
@@ -21,7 +21,7 @@ module Control.Monad.Ether.Implicit.Reader
21 , runReaderT
21 , runReaderT
22 ) where
22 ) where
23
23
24−import qualified Control.Monad.Ether.Ambiguous.Reader as A
24+import qualified Control.Monad.Ether.Reader as A
25
25
26-- | See 'Control.Monad.Ether.Reader.ReaderT'.
26-- | See 'Control.Monad.Ether.Reader.ReaderT'.
27type ReaderT r = A.ReaderT r r
27type ReaderT r = A.ReaderT r r
src/Control/Monad/Ether/Reader.hs+43−2
@@ -1,10 +1,16 @@
1+{-# LANGUAGE AllowAmbiguousTypes #-}
2+{-# LANGUAGE ScopedTypeVariables #-}
3+{-# LANGUAGE MagicHash #-}
1
4
2-- | See "Control.Monad.Reader".
5-- | See "Control.Monad.Reader".
3
6
4module Control.Monad.Ether.Reader
7module Control.Monad.Ether.Reader
5 (
8 (
6 -- * MonadReader class
9 -- * MonadReader class
7− MonadReader(..)
10+ MonadReader
11+ , ask
12+ , local
13+ , reader
8 , asks
14 , asks
9 -- * The Reader monad
15 -- * The Reader monad
10 , Reader
16 , Reader
@@ -15,5 +21,40 @@ module Control.Monad.Ether.Reader
15 , runReaderT
21 , runReaderT
16 ) where
22 ) where
17
23
24+import GHC.Prim (Proxy#, proxy#)
18−import Control.Monad.Ether.Reader.Class
25+import Control.Monad.Ether.Reader.Class (MonadReader)
26+import qualified Control.Monad.Ether.Reader.Class as C
19import Control.Monad.Trans.Ether.Reader hiding (reader, ask, local)
27import Control.Monad.Trans.Ether.Reader hiding (reader, ask, local)
28+
29+-- | Retrieves the monad environment.
30+ask :: forall tag r m . MonadReader tag r m => m r
31+ask = C.ask (proxy# :: Proxy# tag)
32+
33+-- | Executes a computation in a modified environment.
34+local
35+ :: forall tag r m a
36+ . MonadReader tag r m
37+ => (r -> r)
38+ -- ^ The function to modify the environment.
39+ -> m a
40+ -- ^ @Reader@ to run in the modified environment.
41+ -> m a
42+local = C.local (proxy# :: Proxy# tag)
43+
44+-- | Retrieves a function of the current environment.
45+reader
46+ :: forall tag r m a
47+ . MonadReader tag r m
48+ => (r -> a)
49+ -- ^ The selector function to apply to the environment.
50+ -> m a
51+reader = C.reader (proxy# :: Proxy# tag)
52+
53+-- | Retrieves a function of the current environment.
54+asks
55+ :: forall tag r m a
56+ . MonadReader tag r m
57+ => (r -> a)
58+ -- ^ The selector function to apply to the environment.
59+ -> m a
60+asks = C.reader (proxy# :: Proxy# tag)
src/Control/Monad/Ether/Reader/Class.hs+7−15
@@ -4,14 +4,15 @@
4{-# LANGUAGE FunctionalDependencies #-}
4{-# LANGUAGE FunctionalDependencies #-}
5{-# LANGUAGE TypeFamilies #-}
5{-# LANGUAGE TypeFamilies #-}
6{-# LANGUAGE PolyKinds #-}
6{-# LANGUAGE PolyKinds #-}
7+{-# LANGUAGE TypeApplications #-}
8+{-# LANGUAGE ScopedTypeVariables #-}
7{-# LANGUAGE MagicHash #-}
9{-# LANGUAGE MagicHash #-}
8
10
9-- | See "Control.Monad.Reader.Class".
11-- | See "Control.Monad.Reader.Class".
10
12
11module Control.Monad.Ether.Reader.Class
13module Control.Monad.Ether.Reader.Class
12− ( MonadReader(..)
14+ ( MonadReader(..)
13− , asks
14− ) where
15+ ) where
15
16
16import GHC.Prim (Proxy#)
17import GHC.Prim (Proxy#)
17import qualified Control.Monad.Trans.Ether.Reader as R
18import qualified Control.Monad.Trans.Ether.Reader as R
@@ -43,19 +44,10 @@ class Monad m => MonadReader tag r m | m tag -> r where
43 -> m a
44 -> m a
44 reader t f = fmap f (ask t)
45 reader t f = fmap f (ask t)
45
46
46−-- | Retrieves a function of the current environment.
47−asks
48− :: MonadReader tag r m
49− => Proxy# tag
50− -> (r -> a)
51− -- ^ The selector function to apply to the environment.
52− -> m a
53−asks = reader
54−
55instance (Monad m, r ~ r') => MonadReader tag r (R.ReaderT tag r' m) where
47instance (Monad m, r ~ r') => MonadReader tag r (R.ReaderT tag r' m) where
56− ask = R.ask
48+ ask _ = R.ask @tag
57− local = R.local
49+ local _ = R.local @tag
58− reader = R.reader
50+ reader _ = R.reader @tag
59
51
60instance {-# OVERLAPPABLE #-}
52instance {-# OVERLAPPABLE #-}
61 ( Lift.LiftLocal t
53 ( Lift.LiftLocal t
src/Control/Monad/Trans/Ether/Reader.hs+15−15
@@ -6,7 +6,8 @@
6{-# LANGUAGE DataKinds #-}
6{-# LANGUAGE DataKinds #-}
7{-# LANGUAGE PolyKinds #-}
7{-# LANGUAGE PolyKinds #-}
8{-# LANGUAGE GeneralizedNewtypeDeriving #-}
8{-# LANGUAGE GeneralizedNewtypeDeriving #-}
9−{-# LANGUAGE MagicHash #-}
9+{-# LANGUAGE AllowAmbiguousTypes #-}
10+{-# LANGUAGE ScopedTypeVariables #-}
10
11
11-- | See "Control.Monad.Trans.Reader".
12-- | See "Control.Monad.Trans.Reader".
12
13
@@ -25,7 +26,6 @@ module Control.Monad.Trans.Ether.Reader
25 , local
26 , local
26 ) where
27 ) where
27
28
28−import GHC.Prim (Proxy#)
29import Data.Functor.Identity (Identity(..))
29import Data.Functor.Identity (Identity(..))
30import qualified Control.Monad.Trans.Reader as Trans
30import qualified Control.Monad.Trans.Reader as Trans
31import Control.Monad.Trans.Ether.Tagged
31import Control.Monad.Trans.Ether.Tagged
@@ -46,37 +46,37 @@ type Reader tag r = ReaderT tag r Identity
46type ReaderT tag r = TaggedTrans tag (Trans.ReaderT r)
46type ReaderT tag r = TaggedTrans tag (Trans.ReaderT r)
47
47
48-- | Constructor for computations in the reader monad transformer.
48-- | Constructor for computations in the reader monad transformer.
49−readerT :: Proxy# tag -> (r -> m a) -> ReaderT tag r m a
49+readerT :: forall tag r m a . (r -> m a) -> ReaderT tag r m a
50−readerT _ = pack . Trans.ReaderT
50+readerT = pack . Trans.ReaderT
51
51
52-- | Constructor for computations in the reader monad
52-- | Constructor for computations in the reader monad
53-- (the inverse of 'runReader').
53-- (the inverse of 'runReader').
54−reader :: Monad m => Proxy# tag -> (r -> a) -> ReaderT tag r m a
54+reader :: forall tag r m a . Monad m => (r -> a) -> ReaderT tag r m a
55−reader _ = pack . Trans.reader
55+reader = pack . Trans.reader
56
56
57-- | Runs a 'ReaderT' with the given environment
57-- | Runs a 'ReaderT' with the given environment
58-- and returns the final value.
58-- and returns the final value.
59−runReaderT :: Proxy# tag -> ReaderT tag r m a -> r -> m a
59+runReaderT :: forall tag r m a . ReaderT tag r m a -> r -> m a
60−runReaderT _ = Trans.runReaderT . unpack
60+runReaderT = Trans.runReaderT . unpack
61
61
62-- | Runs a 'ReaderT' with the given environment
62-- | Runs a 'ReaderT' with the given environment
63-- and returns the final value.
63-- and returns the final value.
64−runReader :: Proxy# tag -> Reader tag r a -> r -> a
64+runReader :: forall tag r a . Reader tag r a -> r -> a
65−runReader _ = Trans.runReader . unpack
65+runReader = Trans.runReader . unpack
66
66
67-- | Fetch the value of the environment.
67-- | Fetch the value of the environment.
68−ask :: Monad m => Proxy# tag -> ReaderT tag r m r
68+ask :: forall tag r m . Monad m => ReaderT tag r m r
69−ask _ = pack Trans.ask
69+ask = pack Trans.ask
70
70
71-- | Execute a computation in a modified environment
71-- | Execute a computation in a modified environment
72-- (a specialization of 'withReaderT').
72-- (a specialization of 'withReaderT').
73--
73--
74-- * @'runReaderT' tag ('local' tag f m) = 'runReaderT' tag m . f@
74-- * @'runReaderT' tag ('local' tag f m) = 'runReaderT' tag m . f@
75local
75local
76− :: Proxy# tag
76+ :: forall tag r m a
77− -> (r -> r)
77+ . (r -> r)
78 -- ^ The function to modify the environment.
78 -- ^ The function to modify the environment.
79 -> ReaderT tag r m a
79 -> ReaderT tag r m a
80 -- ^ Computation to run in the modified environment.
80 -- ^ Computation to run in the modified environment.
81 -> ReaderT tag r m a
81 -> ReaderT tag r m a
82−local _ f = pack . Trans.withReaderT f . unpack
82+local f = pack . Trans.withReaderT f . unpack