1module Test.Data.List.Reverse.StrictElement where
2
3import qualified Data.List.Reverse.StrictElement as Rev
4import qualified Data.List as List
5import Data.Tuple.HT (mapPair, swap, )
6
7import Test.QuickCheck (Testable, quickCheck, )
8
9import Prelude hiding (takeWhile, dropWhile, span, )
10
11
12takeWhile :: (Ord a) => (a -> Bool) -> [a] -> Bool
13takeWhile p xs =
14   Rev.takeWhile p xs == reverse (List.takeWhile p (reverse xs))
15
16dropWhile :: (Ord a) => (a -> Bool) -> [a] -> Bool
17dropWhile p xs =
18   Rev.dropWhile p xs == reverse (List.dropWhile p (reverse xs))
19
20span :: (Ord a) => (a -> Bool) -> [a] -> Bool
21span p xs =
22   Rev.span p xs == swap (mapPair (reverse, reverse) (List.span p (reverse xs)))
23
24spanTakeDrop :: (Ord a) => (a -> Bool) -> [a] -> Bool
25spanTakeDrop p xs =
26   Rev.span p xs == (Rev.dropWhile p xs, Rev.takeWhile p xs)
27
28dropWhileInf :: (Ord a) => a -> [a] -> Bool
29dropWhileInf x xs =
30   let ys = List.take 1000 $ Rev.dropWhile (x/=) $ cycle $ x:xs
31   in  ys==ys
32
33spanInf :: (Ord a) => a -> [a] -> Bool
34spanInf x xs =
35   let ys = List.take 1000 $ fst $ Rev.span (x/=) $ cycle $ x:xs
36   in  ys==ys
37
38
39simple ::
40   (Testable test) =>
41   (Float -> [Float] -> test) -> IO ()
42simple = quickCheck
43
44
45tests :: [(String, IO ())]
46tests =
47   ("takeWhile",     simple (\a -> takeWhile (a>=))) :
48   ("dropWhile",     simple (\a -> dropWhile (a>=))) :
49   ("span",          simple (\a -> span (a>=))) :
50   ("spanTakeDrop",  simple (\a -> spanTakeDrop (a>=))) :
51   ("dropWhileInf",  simple dropWhileInf) :
52   ("spanInf",       simple spanInf) :
53   []
54