{-# language FlexibleContexts #-}
{-# language CPP #-}
module Test.SmallCheck.Series.Instances.Internal where
import Test.SmallCheck.Series
import Data.Functor.Identity
#if !MIN_VERSION_base(4,8,0)
import Data.Word (Word)
#endif
sets :: (Ord a, Serial m a, Serial Identity a) => Series m [a]
sets = do
depth <- getDepth
let xs = list depth series
i <- localDepth (const (2^min depth (length xs) - 1)) series
let pattern = binaryExpansion i
ys = snd . unzip . filter fst . zip pattern $ xs
return ys
binaryExpansion :: Word -> [Bool]
binaryExpansion 0 = [ ]
binaryExpansion i = ((i `mod` 2) == 1): binaryExpansion (i `div` 2)