crdt-3.0: test/QCUtil.hs
module QCUtil
( genUnique
) where
import Control.Monad.State.Strict (StateT, get, lift, modify)
import Data.Set (Set)
import qualified Data.Set as Set
import Test.QuickCheck (Arbitrary, Gen, arbitrary, suchThat)
genUnique :: (Arbitrary a, Ord a) => StateT (Set a) Gen a
genUnique = do
used <- get
a <- lift $ arbitrary `suchThat` (`Set.notMember` used)
modify $ Set.insert a
pure a