diff --git a/.gitignore b/.gitignore index 307f9c02..2836c9a6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ /bower_components/ /node_modules/ /output/ +/tmp/ diff --git a/docs/Control/Monad/Reader/Trans.md b/docs/Control/Monad/Reader/Trans.md index 324bb76a..4ec29ce3 100644 --- a/docs/Control/Monad/Reader/Trans.md +++ b/docs/Control/Monad/Reader/Trans.md @@ -35,6 +35,7 @@ instance monadReaderReaderT :: (Monad m) => MonadReader r (ReaderT r m) instance monadStateReaderT :: (MonadState s m) => MonadState s (ReaderT r m) instance monadWriterReaderT :: (Monad m, MonadWriter w m) => MonadWriter w (ReaderT r m) instance distributiveReaderT :: (Distributive g) => Distributive (ReaderT e g) +instance monadRecReaderT :: (MonadRec m) => MonadRec (ReaderT r m) ``` #### `runReaderT` diff --git a/src/Control/Monad/Reader/Trans.purs b/src/Control/Monad/Reader/Trans.purs index d5bc9aa2..04a87219 100644 --- a/src/Control/Monad/Reader/Trans.purs +++ b/src/Control/Monad/Reader/Trans.purs @@ -16,12 +16,15 @@ import Control.Monad.Eff.Class import Control.Monad.Cont.Class import Control.Monad.Error.Class import Control.Monad.Reader.Class +import Control.Monad.Rec.Class import Control.Monad.State.Class import Control.Monad.Writer.Class import Control.Monad.Trans import Control.MonadPlus import Control.Plus +import Data.Either + -- | The reader monad transformer. -- | -- | This monad transformer extends the base monad transformer with a _global context_ of @@ -96,3 +99,10 @@ instance monadWriterReaderT :: (Monad m, MonadWriter w m) => MonadWriter w (Read instance distributiveReaderT :: (Distributive g) => Distributive (ReaderT e g) where distribute a = ReaderT \e -> collect (flip runReaderT e) a collect f = distribute <<< map f + +instance monadRecReaderT :: (MonadRec m) => MonadRec (ReaderT r m) where + tailRecM k a = ReaderT \r -> tailRecM (k' r) a + where + k' r a = do + result <- runReaderT (k a) r + return $ either Left Right result