@@ -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