on master help sign in
Wrap MonadEtherReader to get MonadReader
650c7deIndex Int
ether.cabal+1
@@ -16,6 +16,7 @@ library
16
16
17 exposed-modules: Control.Ether.Core
17 exposed-modules: Control.Ether.Core
18 Control.Ether.TH
18 Control.Ether.TH
19+ Control.Ether.Wrapped
19 Control.Monad.Trans.Ether.Reader
20 Control.Monad.Trans.Ether.Reader
20 Control.Monad.Ether.Reader
21 Control.Monad.Ether.Reader
21
22
src/Control/Ether/Wrapped.hsnew file+27
@@ -0,0 +1,27 @@
1+{-# LANGUAGE MultiParamTypeClasses #-}
2+{-# LANGUAGE FlexibleInstances #-}
3+{-# LANGUAGE FlexibleContexts #-}
4+{-# LANGUAGE UndecidableInstances #-}
5+{-# LANGUAGE ScopedTypeVariables #-}
6+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
7+module Control.Ether.Wrapped where
8+
9+import Data.Proxy (Proxy(Proxy))
10+import Control.Applicative (Alternative)
11+import Control.Monad (MonadPlus)
12+import Control.Monad.Fix (MonadFix)
13+import Control.Monad.IO.Class (MonadIO)
14+import Control.Monad.Ether.Reader
15+
16+import qualified Control.Monad.Reader as Class
17+
18+newtype WrappedEther tag m a = WrapEther { unwrapEther :: m a }
19+ deriving ( Functor, Applicative, Alternative, Monad, MonadPlus
20+ , MonadFix, MonadIO )
21+
22+instance MonadEtherReader tag r m => Class.MonadReader r (WrappedEther tag m) where
23+ ask = WrapEther $ etherAsk (Proxy :: Proxy tag)
24+ local f = WrapEther . etherLocal (Proxy :: Proxy tag) f . unwrapEther
25+
26+ethered :: proxy tag -> WrappedEther tag m a -> m a
27+ethered _proxy = unwrapEther
src/Control/Monad/Ether/Reader.hs+1
@@ -8,6 +8,7 @@
8{-# LANGUAGE TypeOperators #-}
8{-# LANGUAGE TypeOperators #-}
9{-# LANGUAGE FunctionalDependencies #-}
9{-# LANGUAGE FunctionalDependencies #-}
10{-# LANGUAGE ScopedTypeVariables #-}
10{-# LANGUAGE ScopedTypeVariables #-}
11+{-# LANGUAGE RankNTypes #-}
11{-# LANGUAGE GeneralizedNewtypeDeriving #-}
12{-# LANGUAGE GeneralizedNewtypeDeriving #-}
12module Control.Monad.Ether.Reader
13module Control.Monad.Ether.Reader
13 ( EtherReaderT
14 ( EtherReaderT
test/Regression.hs+10
@@ -6,8 +6,12 @@
6{-# LANGUAGE ScopedTypeVariables #-}
6{-# LANGUAGE ScopedTypeVariables #-}
7module Main where
7module Main where
8
8
9+import Data.Proxy
10+
9import Control.Ether.TH
11import Control.Ether.TH
12+import Control.Ether.Wrapped
10import Control.Monad.Ether.Reader
13import Control.Monad.Ether.Reader
14+import Control.Monad.Reader
11
15
12import Test.Tasty
16import Test.Tasty
13import Test.Tasty.QuickCheck
17import Test.Tasty.QuickCheck
@@ -16,6 +20,9 @@ import Test.QuickCheck.Function
16ethereal (defaultEtherealReaderConfig "Reader1")
20ethereal (defaultEtherealReaderConfig "Reader1")
17ethereal (defaultEtherealReaderConfig "Reader2")
21ethereal (defaultEtherealReaderConfig "Reader2")
18
22
23+r1 :: Proxy TagReader1
24+r1 = Proxy
25+
19main :: IO ()
26main :: IO ()
20main = defaultMain suite
27main = defaultMain suite
21
28
@@ -65,3 +72,6 @@ inferCore = local' (succ :: Int -> Int) $ do
65 n :: Int <- ask'
72 n :: Int <- ask'
66 b <- local' not ask'
73 b <- local' not ask'
67 return (if b then "" else show n)
74 return (if b then "" else show n)
75+
76+wrapCore :: MonadEtherReader TagReader1 Int m => m Int
77+wrapCore = ethered r1 ask