Skip to content

Commit 65da234

Browse files
committed
Merge pull request #18 from pseudonom/master
Added filterM
2 parents 9a4953b + b17994e commit 65da234

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,19 @@ unless :: forall m. (Monad m) => Boolean -> m Unit -> m Unit
297297
```
298298

299299

300+
#### `filterM`
301+
302+
``` purescript
303+
filterM :: forall a m. (Monad m) => (a -> m Boolean) -> [a] -> m [a]
304+
```
305+
306+
Filter where the predicate returns a monadic Boolean. For example:
307+
308+
```purescript
309+
powerSet :: forall a. [a] -> [[a]]
310+
powerSet = filterM (const [true, false])
311+
```
312+
300313

301314
## Module Control.MonadPlus
302315

src/Control/Monad.purs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,18 @@ when false _ = return unit
1818
unless :: forall m. (Monad m) => Boolean -> m Unit -> m Unit
1919
unless false m = m
2020
unless true _ = return unit
21+
22+
-- | Filter where the predicate returns a monadic Boolean. For example:
23+
-- |
24+
-- | ```purescript
25+
-- | powerSet :: forall a. [a] -> [[a]]
26+
-- | powerSet = filterM (const [true, false])
27+
-- | ```
28+
filterM :: forall a m. (Monad m) => (a -> m Boolean) -> [a] -> m [a]
29+
filterM _ [] = return []
30+
filterM p (x:xs) = do
31+
b <- p x
32+
xs' <- filterM p xs
33+
return $ if b
34+
then x : xs'
35+
else xs'

0 commit comments

Comments
 (0)