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