Skip to content

Commit da92fb9

Browse files
authored
Merge pull request #171 from LightAndLight/master
Add instances for functor product
2 parents c051c6d + 22c80e7 commit da92fb9

File tree

5 files changed

+27
-0
lines changed

5 files changed

+27
-0
lines changed

Control/Monad/Error/Class.hs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ import qualified Control.Monad.Trans.Writer.CPS as CPSWriter
7474
import Control.Monad.Trans.Class (lift)
7575
import Control.Exception (IOException, catch, ioError)
7676
import Control.Monad (Monad ((>>=), (>>)))
77+
import Data.Functor.Product (Product(..))
7778
import Data.Monoid (Monoid)
7879
import Prelude (Either (Left, Right), Maybe (Nothing), either, flip, (.), IO, pure, (<$>))
7980

@@ -206,6 +207,13 @@ instance
206207
throwError = lift . throwError
207208
catchError = Accum.liftCatch catchError
208209

210+
instance (MonadError e m, MonadError e n) => MonadError e (Product m n) where
211+
throwError e = Pair (throwError e) (throwError e)
212+
catchError (Pair ma na) f = Pair (catchError ma (productFst . f)) (catchError na (productSnd . f))
213+
where
214+
productFst (Pair a _) = a
215+
productSnd (Pair _ b) = b
216+
209217
-- | 'MonadError' analogue to the 'Control.Exception.try' function.
210218
--
211219
-- @since 2.3

Control/Monad/RWS/Class.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import Control.Monad.Trans.Identity (IdentityT)
4141
import qualified Control.Monad.Trans.RWS.CPS as CPS (RWST)
4242
import qualified Control.Monad.Trans.RWS.Lazy as Lazy (RWST)
4343
import qualified Control.Monad.Trans.RWS.Strict as Strict (RWST)
44+
import Data.Functor.Product (Product(..))
4445

4546
class (Monoid w, MonadReader r m, MonadWriter w m, MonadState s m)
4647
=> MonadRWS r w s m | m -> r, m -> w, m -> s
@@ -62,3 +63,5 @@ instance (Monoid w, Monad m) => MonadRWS r w s (Strict.RWST r w s m)
6263
instance MonadRWS r w s m => MonadRWS r w s (ExceptT e m)
6364
instance MonadRWS r w s m => MonadRWS r w s (IdentityT m)
6465
instance MonadRWS r w s m => MonadRWS r w s (MaybeT m)
66+
67+
instance (MonadRWS r w s m, MonadRWS r w s n) => MonadRWS r w s (Product m n)

Control/Monad/Reader/Class.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ import Control.Monad.Trans.Select (SelectT (SelectT), runSelectT)
6969
import qualified Control.Monad.Trans.RWS.CPS as CPSRWS
7070
import qualified Control.Monad.Trans.Writer.CPS as CPS
7171
import Control.Monad.Trans.Class (lift)
72+
import Data.Functor.Product (Product(..))
7273

7374
-- ----------------------------------------------------------------------------
7475
-- class MonadReader
@@ -202,3 +203,7 @@ instance
202203
r <- ask
203204
local f (runSelectT m (local (const r) . c))
204205
reader = lift . reader
206+
207+
instance (MonadReader r m, MonadReader r n) => MonadReader r (Product m n) where
208+
ask = Pair ask ask
209+
local f (Pair ma na) = Pair (local f ma) (local f na)

Control/Monad/State/Class.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import Control.Monad.Trans.Select (SelectT)
5252
import qualified Control.Monad.Trans.RWS.CPS as CPSRWS
5353
import qualified Control.Monad.Trans.Writer.CPS as CPS
5454
import Control.Monad.Trans.Class (lift)
55+
import Data.Functor.Product (Product(..))
5556

5657
-- ---------------------------------------------------------------------------
5758

@@ -192,3 +193,7 @@ instance MonadState s m => MonadState s (SelectT r m) where
192193
get = lift get
193194
put = lift . put
194195
state = lift . state
196+
197+
instance (MonadState s m, MonadState s n) => MonadState s (Product m n) where
198+
get = Pair get get
199+
put s = Pair (put s) (put s)

Control/Monad/Writer/Class.hs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import qualified Control.Monad.Trans.Accum as Accum
4848
import qualified Control.Monad.Trans.RWS.CPS as CPSRWS
4949
import qualified Control.Monad.Trans.Writer.CPS as CPS
5050
import Control.Monad.Trans.Class (lift)
51+
import Data.Functor.Product (Product(..))
5152

5253
-- ---------------------------------------------------------------------------
5354
-- MonadWriter class
@@ -205,3 +206,8 @@ instance
205206
tell = lift . tell
206207
listen = Accum.liftListen listen
207208
pass = Accum.liftPass pass
209+
210+
instance (MonadWriter w m, MonadWriter w n) => MonadWriter w (Product m n) where
211+
tell w = Pair (tell w) (tell w)
212+
listen (Pair ma na) = Pair (listen ma) (listen na)
213+
pass (Pair maf naf) = Pair (pass maf) (pass naf)

0 commit comments

Comments
 (0)