module Test.MuCheck.Utils.Common where
import System.FilePath (splitExtension)
import System.Random
import Data.List
import Control.Applicative
choose :: [a] -> Int -> [[a]]
choose xs n = filter (\x -> length x == n) $ subsequences xs
coupling fn ops = [(fn o1 o2) | o1 <- ops, o2 <- ops, o1 /= o2]
genFileNames :: String -> [String]
genFileNames s = map newname [1..]
where (name, ext) = splitExtension s
newname i= name ++ "_" ++ show i ++ ext
replace :: Eq a => (a,a) -> [a] -> [a]
replace (o,n) lst = map replaceit lst
where replaceit v
| v == o = n
| otherwise = v
safeHead :: [a] -> Maybe a
safeHead [] = Nothing
safeHead (x:xs) = Just x
sample :: (RandomGen g, Num n, Eq n) => g -> n -> [t] -> [t]
sample g 0 xs = []
sample g n xs = val : sample g' (n 1) (remElt idx xs)
where val = xs !! idx
(idx,g') = randomR (0, length xs 1) g
sampleF :: (RandomGen g, Num n) => g -> Rational -> [t] -> [t]
sampleF g f xs = sample g l xs
where l = round $ f * fromIntegral (length xs)
remElt :: Int -> [a] -> [a]
remElt idx xs = front ++ ack
where (front,b:ack) = splitAt idx xs