filter p xs = [ x | x <- xs, p x]
>>> filter odd [1, 2, 3] [1,3]
>>> filter (\l -> length l > 3) ["Hello", ", ", "World", "!"] ["Hello","World"]
>>> filter (/= 3) [1, 2, 3, 4, 3, 2, 1] [1,2,4,2,1]
>>> takeWhile (const False) undefined *** Exception: Prelude.undefined
>>> takeWhile (const False) (undefined : undefined) []
>>> take 1 (takeWhile (const True) (1 : undefined)) [1]
>>> takeWhile (< 3) [1,2,3,4,1,2,3,4] [1,2]
>>> takeWhile (< 9) [1,2,3] [1,2,3]
>>> takeWhile (< 0) [1,2,3] []
>>> take 1 (dropWhileEnd (< 0) (1 : undefined)) [1]
>>> take 1 (reverse $ dropWhile (< 0) $ reverse (1 : undefined)) *** Exception: Prelude.undefinedbut on the other hand
>>> last (dropWhileEnd (< 0) [undefined, 1]) *** Exception: Prelude.undefined
>>> last (reverse $ dropWhile (< 0) $ reverse [undefined, 1]) 1
>>> dropWhileEnd isSpace "foo\n" "foo"
>>> dropWhileEnd isSpace "foo bar" "foo bar" >>> dropWhileEnd (> 10) [1..20] [1,2,3,4,5,6,7,8,9,10]
>>> safeTail $ Data.List.dropWhileEnd (<3) [undefined, 5, 4, 3, 2, 1] *** Exception: Prelude.undefined ...
>>> safeTail $ dropWhileEndLE (<3) [undefined, 5, 4, 3, 2, 1] [5,4,3]
>>> take 3 $ Data.List.dropWhileEnd (<3) [5, 4, 3, 2, 1, undefined] [5,4,3]
>>> take 3 $ dropWhileEndLE (<3) [5, 4, 3, 2, 1, undefined] *** Exception: Prelude.undefined ...
>>> takeWhile (< 3) [1,2,3,4,1,2,3,4] [1,2] >>> takeWhile (< 9) [1,2,3] [1,2,3] >>> takeWhile (< 0) [1,2,3] []
dropWhileEnd isSpace "ab cde " == "ab cde" dropWhileEnd' isSpace "ab cde " == "ab cde" last (dropWhileEnd even [undefined,3]) == undefined last (dropWhileEnd' even [undefined,3]) == 3 head (dropWhileEnd even (3:undefined)) == 3 head (dropWhileEnd' even (3:undefined)) == undefined
takeWhileEnd even [2,3,4,6] == [4,6]
filter p xs = [ x | x <- xs, p x]
>>> filter odd [1, 2, 3] [1,3]
forAllPredicates $ \p xs -> takeUntil p xs == fst (breakAfter p xs)
forAllPredicates $ \p xs -> Rev.dropWhile p xs == reverse (List.dropWhile p (reverse xs))
\x xs pad -> defined $ Match.take (pad::[()]) $ Rev.dropWhile ((x::Char)/=) $ cycle $ x:xs
forAllPredicates $ \p xs -> Rev.takeWhile p xs == reverse (List.takeWhile p (reverse xs))
forAllPredicates $ \p xs -> Rev.dropWhile p xs == reverse (List.dropWhile p (reverse xs))
\x xs pad -> defined $ length $ Rev.dropWhile ((x::Char)/=) $ Match.replicate (pad::[()]) undefined ++ x:xs
forAllPredicates $ \p xs -> Rev.takeWhile p xs == reverse (List.takeWhile p (reverse xs))
\x xs pad -> defined $ Rev.takeWhile ((x::Char)/=) $ Match.replicate (pad::[()]) undefined ++ x:xs
>>> takeWhile (< 3) [1,2,3,4,1,2,3,4] [1,2] >>> takeWhile (< 9) [1,2,3] [1,2,3] >>> takeWhile (< 0) [1,2,3] []Laziness:
>>> takeWhile (const False) undefined *** Exception: Prelude.undefined >>> takeWhile (const False) (undefined : undefined) [] >>> take 1 (takeWhile (const True) (1 : undefined)) [1]
takeWhile (< 3) [1,2,3,4,1,2,3,4] == [1,2] takeWhile (< 9) [1,2,3] == [1,2,3] takeWhile (< 0) [1,2,3] == []