Skip to content

Commit f73aa4e

Browse files
Add MonadST instances (#147)
Co-authored-by: Thomas Honeyman <[email protected]>
1 parent e201457 commit f73aa4e

File tree

11 files changed

+32
-0
lines changed

11 files changed

+32
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Notable changes to this project are documented in this file. The format is based
77
Breaking changes:
88

99
New features:
10+
- Add `MonadST` instances for all monad transformers (#147 by @rhendric)
1011
- Add `ComonadAsk`, `ComonadEnv`, and `ComonadTraced` instances for `StoreT`, `EnvT`, and `TracedT` (#145 by @skeate)
1112

1213
Bugfixes:

bower.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
"purescript-maybe": "^6.0.0",
3535
"purescript-newtype": "^5.0.0",
3636
"purescript-prelude": "^6.0.0",
37+
"purescript-st": "^6.2.0",
3738
"purescript-tailrec": "^6.0.0",
3839
"purescript-tuples": "^7.0.0",
3940
"purescript-unfoldable": "^6.0.0"

src/Control/Monad/Cont/Trans.purs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import Prelude
1111
import Control.Apply (lift2)
1212
import Control.Monad.Cont.Class (class MonadCont, callCC)
1313
import Control.Monad.Reader.Class (class MonadAsk, class MonadReader, ask, local)
14+
import Control.Monad.ST.Class (class MonadST, liftST)
1415
import Control.Monad.State.Class (class MonadState, state)
1516
import Control.Monad.Trans.Class (class MonadTrans, lift)
1617
import Data.Newtype (class Newtype)
@@ -75,3 +76,6 @@ instance semigroupContT :: (Apply m, Semigroup a) => Semigroup (ContT r m a) whe
7576

7677
instance monoidContT :: (Applicative m, Monoid a) => Monoid (ContT r m a) where
7778
mempty = pure mempty
79+
80+
instance MonadST s m => MonadST s (ContT r m) where
81+
liftST = lift <<< liftST

src/Control/Monad/Except/Trans.purs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Control.Monad.Cont.Class (class MonadCont, callCC)
1515
import Control.Monad.Error.Class (class MonadThrow, class MonadError, throwError, catchError)
1616
import Control.Monad.Reader.Class (class MonadAsk, class MonadReader, ask, local)
1717
import Control.Monad.Rec.Class (class MonadRec, tailRecM, Step(..))
18+
import Control.Monad.ST.Class (class MonadST, liftST)
1819
import Control.Monad.State.Class (class MonadState, state)
1920
import Control.Monad.Trans.Class (class MonadTrans, lift)
2021
import Control.Monad.Writer.Class (class MonadWriter, class MonadTell, pass, listen, tell)
@@ -141,3 +142,5 @@ instance semigroupExceptT :: (Monad m, Semigroup a) => Semigroup (ExceptT e m a)
141142
instance monoidExceptT :: (Monad m, Monoid a) => Monoid (ExceptT e m a) where
142143
mempty = pure mempty
143144

145+
instance MonadST s m => MonadST s (ExceptT e m) where
146+
liftST = lift <<< liftST

src/Control/Monad/Identity/Trans.purs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import Control.Monad.Cont.Class (class MonadCont)
99
import Control.Monad.Error.Class (class MonadError, class MonadThrow)
1010
import Control.Monad.Reader.Class (class MonadAsk, class MonadReader)
1111
import Control.Monad.Rec.Class (class MonadRec)
12+
import Control.Monad.ST.Class (class MonadST)
1213
import Control.Monad.State.Class (class MonadState)
1314
import Control.Monad.Trans.Class (class MonadTrans)
1415
import Control.Monad.Writer.Class (class MonadTell, class MonadWriter)
@@ -69,6 +70,8 @@ derive newtype instance monadWriterIdentityT :: MonadWriter w m => MonadWriter w
6970
derive newtype instance foldableIdentityT :: Foldable m => Foldable (IdentityT m)
7071
derive newtype instance traversableIdentityT :: Traversable m => Traversable (IdentityT m)
7172

73+
derive newtype instance MonadST s m => MonadST s (IdentityT m)
74+
7275
instance extendIdentityI :: Extend w => Extend (IdentityT w) where
7376
extend f (IdentityT m) = IdentityT (extend (f <<< IdentityT) m)
7477

src/Control/Monad/List/Trans.purs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import Prelude
4141
import Control.Alt (class Alt)
4242
import Control.Alternative (class Alternative)
4343
import Control.Monad.Rec.Class as MR
44+
import Control.Monad.ST.Class (class MonadST, liftST)
4445
import Control.Monad.Trans.Class (class MonadTrans, lift)
4546
import Control.MonadPlus (class MonadPlus)
4647
import Control.Plus (class Plus)
@@ -325,3 +326,6 @@ instance monadPlusListT :: Monad f => MonadPlus (ListT f)
325326

326327
instance monadEffectListT :: MonadEffect m => MonadEffect (ListT m) where
327328
liftEffect = lift <<< liftEffect
329+
330+
instance MonadST s m => MonadST s (ListT m) where
331+
liftST = lift <<< liftST

src/Control/Monad/Maybe/Trans.purs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Control.Monad.Cont.Class (class MonadCont, callCC)
1414
import Control.Monad.Error.Class (class MonadThrow, class MonadError, catchError, throwError)
1515
import Control.Monad.Reader.Class (class MonadAsk, class MonadReader, ask, local)
1616
import Control.Monad.Rec.Class (class MonadRec, tailRecM, Step(..))
17+
import Control.Monad.ST.Class (class MonadST, liftST)
1718
import Control.Monad.State.Class (class MonadState, state)
1819
import Control.Monad.Trans.Class (class MonadTrans, lift)
1920
import Control.Monad.Writer.Class (class MonadWriter, class MonadTell, pass, listen, tell)
@@ -126,3 +127,5 @@ instance semigroupMaybeT :: (Monad m, Semigroup a) => Semigroup (MaybeT m a) whe
126127
instance monoidMaybeT :: (Monad m, Monoid a) => Monoid (MaybeT m a) where
127128
mempty = pure mempty
128129

130+
instance MonadST s m => MonadST s (MaybeT m) where
131+
liftST = lift <<< liftST

src/Control/Monad/RWS/Trans.purs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Control.Lazy (class Lazy)
1515
import Control.Monad.Error.Class (class MonadThrow, class MonadError, throwError, catchError)
1616
import Control.Monad.Reader.Class (class MonadAsk, class MonadReader)
1717
import Control.Monad.Rec.Class (class MonadRec, tailRecM, Step(..))
18+
import Control.Monad.ST.Class (class MonadST, liftST)
1819
import Control.Monad.State.Class (class MonadState)
1920
import Control.Monad.Trans.Class (class MonadTrans, lift)
2021
import Control.Monad.Writer.Class (class MonadWriter, class MonadTell)
@@ -138,3 +139,5 @@ instance semigroupRWST :: (Bind m, Monoid w, Semigroup a) => Semigroup (RWST r w
138139
instance monoidRWST :: (Monad m, Monoid w, Monoid a) => Monoid (RWST r w s m a) where
139140
mempty = pure mempty
140141

142+
instance (Monoid w, MonadST s m) => MonadST s (RWST r w s' m) where
143+
liftST = lift <<< liftST

src/Control/Monad/Reader/Trans.purs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Control.Monad.Cont.Class (class MonadCont, callCC)
1515
import Control.Monad.Error.Class (class MonadThrow, class MonadError, catchError, throwError)
1616
import Control.Monad.Reader.Class (class MonadAsk, class MonadReader, ask, asks, local)
1717
import Control.Monad.Rec.Class (class MonadRec, tailRecM)
18+
import Control.Monad.ST.Class (class MonadST, liftST)
1819
import Control.Monad.State.Class (class MonadState, state)
1920
import Control.Monad.Trans.Class (class MonadTrans, lift)
2021
import Control.Monad.Writer.Class (class MonadWriter, class MonadTell, pass, listen, tell)
@@ -119,3 +120,6 @@ instance monadRecReaderT :: MonadRec m => MonadRec (ReaderT r m) where
119120
tailRecM k a = ReaderT \r -> tailRecM (k' r) a
120121
where
121122
k' r a' = case k a' of ReaderT f -> pure =<< f r
123+
124+
instance MonadST s m => MonadST s (ReaderT r m) where
125+
liftST = lift <<< liftST

src/Control/Monad/State/Trans.purs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import Control.Monad.Cont.Class (class MonadCont, callCC)
1616
import Control.Monad.Error.Class (class MonadThrow, class MonadError, catchError, throwError)
1717
import Control.Monad.Reader.Class (class MonadAsk, class MonadReader, ask, local)
1818
import Control.Monad.Rec.Class (class MonadRec, tailRecM, Step(..))
19+
import Control.Monad.ST.Class (class MonadST, liftST)
1920
import Control.Monad.State.Class (class MonadState, get, gets, modify, modify_, put, state)
2021
import Control.Monad.Trans.Class (class MonadTrans, lift)
2122
import Control.Monad.Writer.Class (class MonadWriter, class MonadTell, pass, listen, tell)
@@ -142,3 +143,5 @@ instance semigroupStateT :: (Monad m, Semigroup a) => Semigroup (StateT s m a) w
142143
instance monoidStateT :: (Monad m, Monoid a) => Monoid (StateT s m a) where
143144
mempty = pure mempty
144145

146+
instance MonadST s m => MonadST s (StateT s' m) where
147+
liftST = lift <<< liftST

src/Control/Monad/Writer/Trans.purs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Control.Monad.Cont.Class (class MonadCont, callCC)
1515
import Control.Monad.Error.Class (class MonadThrow, class MonadError, catchError, throwError)
1616
import Control.Monad.Reader.Class (class MonadAsk, class MonadReader, ask, local)
1717
import Control.Monad.Rec.Class (class MonadRec, tailRecM, Step(..))
18+
import Control.Monad.ST.Class (class MonadST, liftST)
1819
import Control.Monad.State.Class (class MonadState, state)
1920
import Control.Monad.Trans.Class (class MonadTrans, lift)
2021
import Control.Monad.Writer.Class (class MonadTell, tell, class MonadWriter, censor, listen, listens, pass)
@@ -130,3 +131,5 @@ instance semigroupWriterT :: (Apply m, Semigroup w, Semigroup a) => Semigroup (W
130131
instance monoidWriterT :: (Applicative m, Monoid w, Monoid a) => Monoid (WriterT w m a) where
131132
mempty = pure mempty
132133

134+
instance (Monoid w, MonadST s m) => MonadST s (WriterT w m) where
135+
liftST = lift <<< liftST

0 commit comments

Comments
 (0)