on master help sign in
Ambiguous default for MonadReader
commit15f3a29bc11f5dc6ab6b881e47113b13c6b2002a authorIndex Int <vlad.z.4096@gmail.com> dateSat 30 Apr 2016, 18:41 (10 years ago) parent4c7619a
7 files changed+67−89
ether.cabal−1 src/Control/Monad/Ether/Ambiguous.hs+1−1 src/Control/Monad/Ether/Ambiguous/Reader.hs−54 src/Control/Monad/Ether/Implicit/Reader.hs+1−1 src/Control/Monad/Ether/Reader.hs+43−2 src/Control/Monad/Ether/Reader/Class.hs+7−15 src/Control/Monad/Trans/Ether/Reader.hs+15−15
ether.cabal−1
@@ -55,7 +55,6 @@ library
5555 Control.Monad.Ether.Implicit.State.Strict
5656 Control.Monad.Ether.Implicit.Except
5757 Control.Monad.Ether.Ambiguous
58− Control.Monad.Ether.Ambiguous.Reader
5958 Control.Monad.Ether.Ambiguous.Writer
6059 Control.Monad.Ether.Ambiguous.State
6160 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
66
77import Control.Monad as X
88import Control.Monad.Fix as X
9−import Control.Monad.Ether.Ambiguous.Reader as X
9+import Control.Monad.Ether.Reader as X
1010import Control.Monad.Ether.Ambiguous.Writer as X
1111import Control.Monad.Ether.Ambiguous.State as X
1212import 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
2121 , runReaderT
2222 ) where
2323
24−import qualified Control.Monad.Ether.Ambiguous.Reader as A
24+import qualified Control.Monad.Ether.Reader as A
2525
2626-- | See 'Control.Monad.Ether.Reader.ReaderT'.
2727type 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 #-}
14
25-- | See "Control.Monad.Reader".
36
47module Control.Monad.Ether.Reader
58 (
69 -- * MonadReader class
7− MonadReader(..)
10+ MonadReader
11+ , ask
12+ , local
13+ , reader
814 , asks
915 -- * The Reader monad
1016 , Reader
@@ -15,5 +21,40 @@ module Control.Monad.Ether.Reader
1521 , runReaderT
1622 ) where
1723
18−import Control.Monad.Ether.Reader.Class
24+import GHC.Prim (Proxy#, proxy#)
25+import Control.Monad.Ether.Reader.Class (MonadReader)
26+import qualified Control.Monad.Ether.Reader.Class as C
1927import 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 @@
44{-# LANGUAGE FunctionalDependencies #-}
55{-# LANGUAGE TypeFamilies #-}
66{-# LANGUAGE PolyKinds #-}
7+{-# LANGUAGE TypeApplications #-}
8+{-# LANGUAGE ScopedTypeVariables #-}
79{-# LANGUAGE MagicHash #-}
810
911-- | See "Control.Monad.Reader.Class".
1012
1113module Control.Monad.Ether.Reader.Class
12− ( MonadReader(..)
13− , asks
14− ) where
14+ ( MonadReader(..)
15+ ) where
1516
1617import GHC.Prim (Proxy#)
1718import qualified Control.Monad.Trans.Ether.Reader as R
@@ -43,19 +44,10 @@ class Monad m => MonadReader tag r m | m tag -> r where
4344 -> m a
4445 reader t f = fmap f (ask t)
4546
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−
5547instance (Monad m, r ~ r') => MonadReader tag r (R.ReaderT tag r' m) where
56− ask = R.ask
57− local = R.local
58− reader = R.reader
48+ ask _ = R.ask @tag
49+ local _ = R.local @tag
50+ reader _ = R.reader @tag
5951
6052instance {-# OVERLAPPABLE #-}
6153 ( Lift.LiftLocal t
src/Control/Monad/Trans/Ether/Reader.hs+15−15
@@ -6,7 +6,8 @@
66{-# LANGUAGE DataKinds #-}
77{-# LANGUAGE PolyKinds #-}
88{-# LANGUAGE GeneralizedNewtypeDeriving #-}
9−{-# LANGUAGE MagicHash #-}
9+{-# LANGUAGE AllowAmbiguousTypes #-}
10+{-# LANGUAGE ScopedTypeVariables #-}
1011
1112-- | See "Control.Monad.Trans.Reader".
1213
@@ -25,7 +26,6 @@ module Control.Monad.Trans.Ether.Reader
2526 , local
2627 ) where
2728
28−import GHC.Prim (Proxy#)
2929import Data.Functor.Identity (Identity(..))
3030import qualified Control.Monad.Trans.Reader as Trans
3131import Control.Monad.Trans.Ether.Tagged
@@ -46,37 +46,37 @@ type Reader tag r = ReaderT tag r Identity
4646type ReaderT tag r = TaggedTrans tag (Trans.ReaderT r)
4747
4848-- | Constructor for computations in the reader monad transformer.
49−readerT :: Proxy# tag -> (r -> m a) -> ReaderT tag r m a
50−readerT _ = pack . Trans.ReaderT
49+readerT :: forall tag r m a . (r -> m a) -> ReaderT tag r m a
50+readerT = pack . Trans.ReaderT
5151
5252-- | Constructor for computations in the reader monad
5353-- (the inverse of 'runReader').
54−reader :: Monad m => Proxy# tag -> (r -> a) -> ReaderT tag r m a
55−reader _ = pack . Trans.reader
54+reader :: forall tag r m a . Monad m => (r -> a) -> ReaderT tag r m a
55+reader = pack . Trans.reader
5656
5757-- | Runs a 'ReaderT' with the given environment
5858-- and returns the final value.
59−runReaderT :: Proxy# tag -> ReaderT tag r m a -> r -> m a
60−runReaderT _ = Trans.runReaderT . unpack
59+runReaderT :: forall tag r m a . ReaderT tag r m a -> r -> m a
60+runReaderT = Trans.runReaderT . unpack
6161
6262-- | Runs a 'ReaderT' with the given environment
6363-- and returns the final value.
64−runReader :: Proxy# tag -> Reader tag r a -> r -> a
65−runReader _ = Trans.runReader . unpack
64+runReader :: forall tag r a . Reader tag r a -> r -> a
65+runReader = Trans.runReader . unpack
6666
6767-- | Fetch the value of the environment.
68−ask :: Monad m => Proxy# tag -> ReaderT tag r m r
69−ask _ = pack Trans.ask
68+ask :: forall tag r m . Monad m => ReaderT tag r m r
69+ask = pack Trans.ask
7070
7171-- | Execute a computation in a modified environment
7272-- (a specialization of 'withReaderT').
7373--
7474-- * @'runReaderT' tag ('local' tag f m) = 'runReaderT' tag m . f@
7575local
76− :: Proxy# tag
77− -> (r -> r)
76+ :: forall tag r m a
77+ . (r -> r)
7878 -- ^ The function to modify the environment.
7979 -> ReaderT tag r m a
8080 -- ^ Computation to run in the modified environment.
8181 -> ReaderT tag r m a
82−local _ f = pack . Trans.withReaderT f . unpack
82+local f = pack . Trans.withReaderT f . unpack