Skip to content

Commit f2fd736

Browse files
committed
Merge pull request #9 from bgwines/master
Defined `takeWhileM` and set up a testing framework.
2 parents 874c206 + b48e1aa commit f2fd736

File tree

3 files changed

+73
-2
lines changed

3 files changed

+73
-2
lines changed

Tests/test-monad-loops.hs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
{-# LANGUAGE ScopedTypeVariables #-}
2+
3+
module Main (main) where
4+
5+
import Test.Tasty
6+
import Test.Tasty.HUnit
7+
8+
import Control.Monad.Loops
9+
10+
testTakeWhileM :: Assertion
11+
testTakeWhileM = do
12+
actual <- takeWhileM (return . id) [True, True, False]
13+
let expected = takeWhile ( id) [True, True, False]
14+
actual @?= expected
15+
16+
testTakeWhileMEdgeCase1 :: Assertion
17+
testTakeWhileMEdgeCase1 = do
18+
actual <- takeWhileM (return . id) []
19+
let expected = takeWhile ( id) []
20+
actual @?= expected
21+
22+
testTakeWhileMEdgeCase2 :: Assertion
23+
testTakeWhileMEdgeCase2 = do
24+
actual <- takeWhileM (return . id) [False, False, False]
25+
let expected = takeWhile ( id) [False, False, False]
26+
actual @?= expected
27+
28+
testTakeWhileMEdgeCase3 :: Assertion
29+
testTakeWhileMEdgeCase3 = do
30+
let emptyList :: [Int] = []
31+
actual <- takeWhileM (const undefined) emptyList
32+
let expected = takeWhile (const undefined) emptyList
33+
actual @?= expected
34+
35+
tests :: TestTree
36+
tests = testGroup "unit tests"
37+
[ testCase
38+
"Testing `takeWhileM`"
39+
testTakeWhileM
40+
, testCase
41+
"Testing `takeWhileM (edge case 1)`"
42+
testTakeWhileMEdgeCase1
43+
, testCase
44+
"Testing `takeWhileM (edge case 2)`"
45+
testTakeWhileMEdgeCase2
46+
, testCase
47+
"Testing `takeWhileM (edge case 3)`"
48+
testTakeWhileMEdgeCase3
49+
]
50+
51+
main :: IO ()
52+
main = defaultMain tests

monad-loops.cabal

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ version: 0.4.2.1
33
stability: provisional
44
license: PublicDomain
55

6-
cabal-version: >= 1.6
6+
cabal-version: >= 1.8
77
build-type: Simple
88

99
author: James Cook <[email protected]>
@@ -36,6 +36,15 @@ Library
3636
exposed-modules: Control.Monad.Loops
3737
if flag(base4)
3838
cpp-options: -Dbase4
39-
build-depends: base >= 4 && <5
39+
build-depends: base >= 4 && < 5
4040
else
4141
build-depends: base >= 2 && < 4
42+
43+
Test-Suite test-monad-loops
44+
type: exitcode-stdio-1.0
45+
main-is: Tests/test-monad-loops.hs
46+
if flag(base4)
47+
cpp-options: -Dbase4
48+
build-depends: base >= 4 && < 5, tasty, tasty-hunit, monad-loops
49+
else
50+
build-depends: base >= 2 && < 4, tasty, tasty-hunit, monad-loops

src/Control/Monad/Loops.hs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,16 @@ allM p (x:xs) = do
367367
then allM p xs
368368
else return False
369369

370+
-- | Monadic 'takeWhile'.
371+
takeWhileM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
372+
takeWhileM _ [] = return []
373+
takeWhileM p (x:xs) = do
374+
q <- p x
375+
if q
376+
then (takeWhileM p xs) >>= (return . (:) x)
377+
else return []
378+
379+
-- | Monadic 'dropWhile'.
370380
dropWhileM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
371381
dropWhileM _ [] = return []
372382
dropWhileM p (x:xs) = do

0 commit comments

Comments
 (0)