utility-ht-0.0.12: src/Test/Data/List/Reverse/StrictElement.hs
module Test.Data.List.Reverse.StrictElement where
import qualified Data.List.Reverse.StrictElement as Rev
import qualified Data.List as List
import Data.Tuple.HT (mapPair, swap, )
import Test.QuickCheck (Testable, quickCheck, )
import Prelude hiding (takeWhile, dropWhile, span, )
takeWhile :: (Ord a) => (a -> Bool) -> [a] -> Bool
takeWhile p xs =
Rev.takeWhile p xs == reverse (List.takeWhile p (reverse xs))
dropWhile :: (Ord a) => (a -> Bool) -> [a] -> Bool
dropWhile p xs =
Rev.dropWhile p xs == reverse (List.dropWhile p (reverse xs))
span :: (Ord a) => (a -> Bool) -> [a] -> Bool
span p xs =
Rev.span p xs == swap (mapPair (reverse, reverse) (List.span p (reverse xs)))
spanTakeDrop :: (Ord a) => (a -> Bool) -> [a] -> Bool
spanTakeDrop p xs =
Rev.span p xs == (Rev.dropWhile p xs, Rev.takeWhile p xs)
dropWhileInf :: (Ord a) => a -> [a] -> Bool
dropWhileInf x xs =
let ys = List.take 1000 $ Rev.dropWhile (x/=) $ cycle $ x:xs
in ys==ys
spanInf :: (Ord a) => a -> [a] -> Bool
spanInf x xs =
let ys = List.take 1000 $ fst $ Rev.span (x/=) $ cycle $ x:xs
in ys==ys
simple ::
(Testable test) =>
(Float -> [Float] -> test) -> IO ()
simple = quickCheck
tests :: [(String, IO ())]
tests =
("takeWhile", simple (\a -> takeWhile (a>=))) :
("dropWhile", simple (\a -> dropWhile (a>=))) :
("span", simple (\a -> span (a>=))) :
("spanTakeDrop", simple (\a -> spanTakeDrop (a>=))) :
("dropWhileInf", simple dropWhileInf) :
("spanInf", simple spanInf) :
[]