Skip to content

Commit 5c328ad

Browse files
committed
Merge pull request #8 from purescript-contrib/alternative
Add Alt, Plus, MonadPlus, update Alternative
2 parents ff5836d + c531881 commit 5c328ad

19 files changed

+94
-38
lines changed

bower.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
"purescript-tuples": "*",
2222
"purescript-either": "*",
2323
"purescript-monoid": "*",
24-
"purescript-arrays": "*",
25-
"purescript-control": "*"
24+
"purescript-arrays": "~0.2.0",
25+
"purescript-control": "~0.2.0"
2626
},
2727
"devDependencies": {
2828
"purescript-strings": "*"

docs/Module.md

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,12 @@
6868

6969
### Type Class Instances
7070

71+
instance errorEitherAlt :: (Error e) => Alt (Either e)
72+
7173
instance errorEitherAlternative :: (Error e) => Alternative (Either e)
7274

75+
instance errorEitherPlus :: (Error e) => Plus (Either e)
76+
7377
instance errorString :: Error String
7478

7579

@@ -107,6 +111,8 @@
107111

108112
### Type Class Instances
109113

114+
instance altErrorT :: (Monad m, Error e) => Alt (ErrorT e m)
115+
110116
instance alternativeErrorT :: (Monad m, Error e) => Alternative (ErrorT e m)
111117

112118
instance applicativeErrorT :: (Functor m, Monad m) => Applicative (ErrorT e m)
@@ -119,8 +125,12 @@
119125

120126
instance monadErrorT :: (Monad m, Error e) => Monad (ErrorT e m)
121127

128+
instance monadPlusErrorT :: (Monad m, Error e) => MonadPlus (ErrorT e m)
129+
122130
instance monadTransErrorT :: (Error e) => MonadTrans (ErrorT e)
123131

132+
instance plusErrorT :: (Monad m, Error e) => Plus (ErrorT e m)
133+
124134

125135
### Values
126136

@@ -410,6 +420,8 @@
410420

411421
### Type Class Instances
412422

423+
instance altReaderT :: (Alt m) => Alt (ReaderT r m)
424+
413425
instance alternativeReaderT :: (Alternative m) => Alternative (ReaderT r m)
414426

415427
instance applicativeReaderT :: (Applicative m) => Applicative (ReaderT r m)
@@ -420,10 +432,14 @@
420432

421433
instance functorReaderT :: (Functor m) => Functor (ReaderT r m)
422434

435+
instance monadPlusReaderT :: (MonadPlus m) => MonadPlus (ReaderT r m)
436+
423437
instance monadReaderT :: (Monad m) => Monad (ReaderT r m)
424438

425439
instance monadTransReaderT :: MonadTrans (ReaderT r)
426440

441+
instance plusReaderT :: (Plus m) => Plus (ReaderT r m)
442+
427443

428444
### Values
429445

@@ -506,7 +522,9 @@
506522

507523
### Type Class Instances
508524

509-
instance alternativeStateT :: (Alternative m) => Alternative (StateT s m)
525+
instance altStateT :: (Monad m, Alt m) => Alt (StateT s m)
526+
527+
instance alternativeStateT :: (Monad m, Alternative m) => Alternative (StateT s m)
510528

511529
instance applicativeStateT :: (Monad m) => Applicative (StateT s m)
512530

@@ -516,10 +534,14 @@
516534

517535
instance functorStateT :: (Monad m) => Functor (StateT s m)
518536

537+
instance monadPlusStateT :: (MonadPlus m) => MonadPlus (StateT s m)
538+
519539
instance monadStateT :: (Monad m) => Monad (StateT s m)
520540

521541
instance monadTransStateT :: MonadTrans (StateT s)
522542

543+
instance plusStateT :: (Monad m, Plus m) => Plus (StateT s m)
544+
523545

524546
### Values
525547

@@ -642,20 +664,26 @@
642664

643665
### Type Class Instances
644666

667+
instance altWriterT :: (Monoid w, Alt m) => Alt (WriterT w m)
668+
645669
instance alternativeWriterT :: (Monoid w, Alternative m) => Alternative (WriterT w m)
646670

647-
instance applicativeWriterT :: (Monoid w, Functor m, Applicative m) => Applicative (WriterT w m)
671+
instance applicativeWriterT :: (Monoid w, Applicative m) => Applicative (WriterT w m)
648672

649-
instance applyWriterT :: (Monoid w, Functor m, Applicative m) => Apply (WriterT w m)
673+
instance applyWriterT :: (Monoid w, Apply m) => Apply (WriterT w m)
650674

651675
instance bindWriterT :: (Monoid w, Monad m) => Bind (WriterT w m)
652676

653677
instance functorWriterT :: (Functor m) => Functor (WriterT w m)
654678

679+
instance monadPlusWriterT :: (Monoid w, MonadPlus m) => MonadPlus (WriterT w m)
680+
655681
instance monadTransWriterT :: (Monoid w) => MonadTrans (WriterT w)
656682

657683
instance monadWriterT :: (Monoid w, Monad m) => Monad (WriterT w m)
658684

685+
instance plusWriterT :: (Monoid w, Plus m) => Plus (WriterT w m)
686+
659687

660688
### Values
661689

src/Control/Monad/Cont/Class.purs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module Control.Monad.Cont.Class where
22

3-
import Prelude
43
import Control.Monad.Error
54
import qualified Control.Monad.Cont.Trans as Cont
65
import Control.Monad.Error

src/Control/Monad/Cont/Trans.purs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module Control.Monad.Cont.Trans where
22

3-
import Prelude
43
import Control.Monad.Trans
54

65
newtype ContT r m a = ContT ((a -> m r) -> m r)

src/Control/Monad/Error.purs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
module Control.Monad.Error where
22

3-
import Prelude
3+
import Control.Alt
4+
import Control.Alternative
5+
import Control.Plus
46
import Data.Either
57

68
class Error a where
79
noMsg :: a
810
strMsg :: String -> a
9-
11+
1012
instance errorString :: Error String where
1113
noMsg = ""
1214
strMsg = id
1315

14-
instance errorEitherAlternative :: (Error e) => Alternative (Either e) where
15-
empty = Left noMsg
16+
instance errorEitherAlt :: (Error e) => Alt (Either e) where
1617
(<|>) (Left _) n = n
1718
(<|>) m _ = m
19+
20+
instance errorEitherPlus :: (Error e) => Plus (Either e) where
21+
empty = Left noMsg
22+
23+
instance errorEitherAlternative :: (Error e) => Alternative (Either e)

src/Control/Monad/Error/Class.purs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module Control.Monad.Error.Class where
22

3-
import Prelude
43
import Control.Monad.Trans
54
import Control.Monad.Error
65
import Control.Monad.Error.Trans
@@ -14,7 +13,7 @@ import Data.Monoid
1413
class MonadError e m where
1514
throwError :: forall a. e -> m a
1615
catchError :: forall a. m a -> (e -> m a) -> m a
17-
16+
1817
instance monadErrorError :: (Error e) => MonadError e (Either e) where
1918
throwError = Left
2019
catchError (Left e) h = h e

src/Control/Monad/Error/Trans.purs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
module Control.Monad.Error.Trans where
22

3-
import Prelude
3+
import Control.Alt
4+
import Control.Alternative
5+
import Control.Plus
46
import Control.Monad.Error
57
import Control.Monad.Trans
8+
import Control.MonadPlus
69
import Data.Either
710
import Data.Monoid
811
import Data.Tuple
@@ -32,12 +35,16 @@ instance applyErrorT :: (Functor m, Monad m) => Apply (ErrorT e m) where
3235
instance applicativeErrorT :: (Functor m, Monad m) => Applicative (ErrorT e m) where
3336
pure a = ErrorT $ pure $ Right a
3437

35-
instance alternativeErrorT :: (Monad m, Error e) => Alternative (ErrorT e m) where
36-
empty = ErrorT (return (Left $ strMsg "No alternative"))
38+
instance altErrorT :: (Monad m, Error e) => Alt (ErrorT e m) where
3739
(<|>) x y = ErrorT $ runErrorT x >>= \e -> case e of
3840
Left _ -> runErrorT y
3941
r -> return r
4042

43+
instance plusErrorT :: (Monad m, Error e) => Plus (ErrorT e m) where
44+
empty = ErrorT (return (Left $ strMsg "No alternative"))
45+
46+
instance alternativeErrorT :: (Monad m, Error e) => Alternative (ErrorT e m)
47+
4148
instance bindErrorT :: (Monad m, Error e) => Bind (ErrorT e m) where
4249
(>>=) m f = ErrorT $ do
4350
a <- runErrorT m
@@ -47,6 +54,8 @@ instance bindErrorT :: (Monad m, Error e) => Bind (ErrorT e m) where
4754

4855
instance monadErrorT :: (Monad m, Error e) => Monad (ErrorT e m)
4956

57+
instance monadPlusErrorT :: (Monad m, Error e) => MonadPlus (ErrorT e m)
58+
5059
instance monadTransErrorT :: (Error e) => MonadTrans (ErrorT e) where
5160
lift m = ErrorT $ do
5261
a <- m

src/Control/Monad/Identity.purs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
module Control.Monad.Identity where
22

3-
import Prelude
4-
53
newtype Identity a = Identity a
64

75
runIdentity :: forall a. Identity a -> a

src/Control/Monad/Maybe/Trans.purs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module Control.Monad.Maybe.Trans where
22

3-
import Prelude
43
import Control.Monad
54
import Control.Monad.Trans
65
import Data.Either

src/Control/Monad/Reader.purs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module Control.Monad.Reader where
22

3-
import Prelude
43
import Control.Monad.Identity
54
import Control.Monad.Reader.Trans
65

src/Control/Monad/Reader/Class.purs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module Control.Monad.Reader.Class where
22

3-
import Prelude
43
import Control.Monad.Trans
54
import Control.Monad.Reader.Trans
65
import Control.Monad.Error

src/Control/Monad/Reader/Trans.purs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
module Control.Monad.Reader.Trans where
22

3-
import Prelude
3+
import Control.Alt
4+
import Control.Alternative
5+
import Control.Plus
46
import Control.Monad.Trans
7+
import Control.MonadPlus
58

69
newtype ReaderT r m a = ReaderT (r -> m a)
710

@@ -26,17 +29,23 @@ instance applyReaderT :: (Applicative m) => Apply (ReaderT r m) where
2629
instance applicativeReaderT :: (Applicative m) => Applicative (ReaderT r m) where
2730
pure = liftReaderT <<< pure
2831

29-
instance alternativeReaderT :: (Alternative m) => Alternative (ReaderT r m) where
30-
empty = liftReaderT empty
32+
instance altReaderT :: (Alt m) => Alt (ReaderT r m) where
3133
(<|>) m n = ReaderT \r -> runReaderT m r <|> runReaderT n r
3234

35+
instance plusReaderT :: (Plus m) => Plus (ReaderT r m) where
36+
empty = liftReaderT empty
37+
38+
instance alternativeReaderT :: (Alternative m) => Alternative (ReaderT r m)
39+
3340
instance bindReaderT :: (Monad m) => Bind (ReaderT r m) where
3441
(>>=) m k = ReaderT \r -> do
3542
a <- runReaderT m r
3643
runReaderT (k a) r
3744

3845
instance monadReaderT :: (Monad m) => Monad (ReaderT r m)
3946

47+
instance monadPlusReaderT :: (MonadPlus m) => MonadPlus (ReaderT r m)
48+
4049
instance monadTransReaderT :: MonadTrans (ReaderT r) where
4150
lift = liftReaderT
4251

src/Control/Monad/State.purs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module Control.Monad.State where
22

3-
import Prelude
43
import Control.Monad.Identity
54
import Control.Monad.State.Trans
65
import Data.Tuple

src/Control/Monad/State/Class.purs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module Control.Monad.State.Class where
22

3-
import Prelude
43
import Control.Monad.Trans
54
import Control.Monad.State.Trans
65
import Control.Monad.Error

src/Control/Monad/State/Trans.purs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
module Control.Monad.State.Trans where
22

3-
import Prelude
3+
import Control.Alt
4+
import Control.Alternative
5+
import Control.Plus
46
import Control.Monad.Trans
7+
import Control.MonadPlus
58
import Data.Tuple
69

710
newtype StateT s m a = StateT (s -> m (Tuple a s))
@@ -30,17 +33,23 @@ instance applyStateT :: (Monad m) => Apply (StateT s m) where
3033
instance applicativeStateT :: (Monad m) => Applicative (StateT s m) where
3134
pure a = StateT $ \s -> return $ Tuple a s
3235

33-
instance alternativeStateT :: (Alternative m) => Alternative (StateT s m) where
34-
empty = StateT $ \_ -> empty
36+
instance altStateT :: (Monad m, Alt m) => Alt (StateT s m) where
3537
(<|>) x y = StateT $ \s -> runStateT x s <|> runStateT y s
3638

39+
instance plusStateT :: (Monad m, Plus m) => Plus (StateT s m) where
40+
empty = StateT $ \_ -> empty
41+
42+
instance alternativeStateT :: (Monad m, Alternative m) => Alternative (StateT s m)
43+
3744
instance bindStateT :: (Monad m) => Bind (StateT s m) where
3845
(>>=) (StateT x) f = StateT \s -> do
3946
Tuple v s' <- x s
4047
runStateT (f v) s'
4148

4249
instance monadStateT :: (Monad m) => Monad (StateT s m)
4350

51+
instance monadPlusStateT :: (MonadPlus m) => MonadPlus (StateT s m)
52+
4453
instance monadTransStateT :: MonadTrans (StateT s) where
4554
lift m = StateT \s -> do
4655
x <- m

src/Control/Monad/Trans.purs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
module Control.Monad.Trans where
22

3-
import Prelude
4-
53
class MonadTrans t where
64
lift :: forall m a. (Monad m) => m a -> t m a

src/Control/Monad/Writer.purs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module Control.Monad.Writer where
22

3-
import Prelude
43
import Control.Monad.Identity
54
import Control.Monad.Writer.Trans
65
import Data.Monoid

src/Control/Monad/Writer/Class.purs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module Control.Monad.Writer.Class where
22

3-
import Prelude
43
import Control.Monad.Trans
54
import Control.Monad.Writer.Trans
65
import Control.Monad.Error

0 commit comments

Comments
 (0)