Skip to content

Commit 48034f0

Browse files
Add IdentityT (#121)
* Add IdentityT * Add Foldable and Traversable instances for IdentityT * Add Eq, Eq1, Ord, and Ord1 instances for IdentityT * Reduce IdentityT Alt instance constraint from Monad to Functor * Clean up IdentityT's MonadError instance's implementation * Fix MonadRec instance for IdentityT * Newtype derive instances for IdentityT rather than writing them by hand * Remove unnecessary type class constraints for IdentityT instances * Remove additional type class constraints in IdentityT instances * Remove extra parentheses
1 parent aa1fba3 commit 48034f0

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

src/Control/Monad/Identity/Trans.purs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
module Control.Monad.Identity.Trans where
2+
3+
import Prelude
4+
5+
import Control.Alt (class Alt)
6+
import Control.Alternative (class Alternative)
7+
import Control.Monad.Cont.Class (class MonadCont)
8+
import Control.Monad.Error.Class (class MonadError, class MonadThrow)
9+
import Control.Monad.Reader.Class (class MonadAsk, class MonadReader)
10+
import Control.Monad.Rec.Class (class MonadRec)
11+
import Control.Monad.State.Class (class MonadState)
12+
import Control.Monad.Trans.Class (class MonadTrans)
13+
import Control.Monad.Writer.Class (class MonadTell, class MonadWriter)
14+
import Control.MonadPlus (class MonadPlus)
15+
import Control.MonadZero (class MonadZero)
16+
import Control.Plus (class Plus)
17+
import Data.Eq (class Eq1)
18+
import Data.Foldable (class Foldable)
19+
import Data.Traversable (class Traversable)
20+
import Data.Newtype (class Newtype)
21+
import Data.Ord (class Ord1)
22+
import Effect.Class (class MonadEffect)
23+
24+
-- | The `IdentityT` monad transformer.
25+
-- |
26+
-- | This monad acts like a placeholder for functions that take a monad
27+
-- | transformer as an argument, similar to `identity` for functions and
28+
-- | `Identity` for monads.
29+
newtype IdentityT m a = IdentityT (m a)
30+
31+
-- | Run a computation in the `IdentityT` monad.
32+
runIdentityT :: forall m a. IdentityT m a -> m a
33+
runIdentityT (IdentityT ma) = ma
34+
35+
-- | Change the result type of a `IdentityT` monad action.
36+
mapIdentityT :: forall m1 m2 a b. (m1 a -> m2 b) -> IdentityT m1 a -> IdentityT m2 b
37+
mapIdentityT f (IdentityT m) = IdentityT (f m)
38+
39+
derive instance eqIdentityT :: (Eq1 m, Eq a) => Eq (IdentityT m a)
40+
derive instance ordIdentityT :: (Ord1 m, Ord a) => Ord (IdentityT m a)
41+
derive instance eq1IdentityT :: Eq1 m => Eq1 (IdentityT m)
42+
derive instance ord1IdentityT :: Ord1 m => Ord1 (IdentityT m)
43+
derive instance newtypeIdentityT :: Newtype (IdentityT m a) _
44+
45+
derive newtype instance functorIdentityT :: Functor m => Functor (IdentityT m)
46+
derive newtype instance applyIdentityT :: Apply m => Apply (IdentityT m)
47+
derive newtype instance applicativeIdentityT :: Applicative m => Applicative (IdentityT m)
48+
derive newtype instance altIdentityT :: Alt m => Alt (IdentityT m)
49+
derive newtype instance plusIdentityT :: Plus m => Plus (IdentityT m)
50+
derive newtype instance alternativeIdentityT :: Alternative m => Alternative (IdentityT m)
51+
derive newtype instance bindIdentityT :: Bind m => Bind (IdentityT m)
52+
derive newtype instance monadIdentityT :: Monad m => Monad (IdentityT m)
53+
derive newtype instance monadRecIdentityT :: MonadRec m => MonadRec (IdentityT m)
54+
derive newtype instance monadZeroIdentityT :: MonadZero m => MonadZero (IdentityT m)
55+
derive newtype instance monadPlusIdentityT :: MonadPlus m => MonadPlus (IdentityT m)
56+
57+
instance monadTransIdentityT :: MonadTrans IdentityT where
58+
lift = IdentityT
59+
60+
derive newtype instance monadEffectIdentityT :: MonadEffect m => MonadEffect (IdentityT m)
61+
derive newtype instance monadContIdentityT :: MonadCont m => MonadCont (IdentityT m)
62+
derive newtype instance monadThrowIdentityT :: MonadThrow e m => MonadThrow e (IdentityT m)
63+
derive newtype instance monadErrorIdentityT :: MonadError e m => MonadError e (IdentityT m)
64+
derive newtype instance monadAskIdentityT :: MonadAsk r m => MonadAsk r (IdentityT m)
65+
derive newtype instance monadReaderIdentityT :: MonadReader r m => MonadReader r (IdentityT m)
66+
derive newtype instance monadStateIdentityT :: MonadState s m => MonadState s (IdentityT m)
67+
derive newtype instance monadTellIdentityT :: MonadTell w m => MonadTell w (IdentityT m)
68+
derive newtype instance monadWriterIdentityT :: MonadWriter w m => MonadWriter w (IdentityT m)
69+
derive newtype instance foldableIdentityT :: Foldable m => Foldable (IdentityT m)
70+
derive newtype instance traversableIdentityT :: Traversable m => Traversable (IdentityT m)

0 commit comments

Comments
 (0)