{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.Registry.Hedgehog
(
Gen,
Chooser (..),
genFun,
genVal,
genWith,
setGen,
specializeGen,
tweakGen,
makeNonEmpty,
genListOf,
genListOfMinMax,
genNonEmptyOfMinMax,
genNonEmptyOf,
genMaybeOf,
genOneOf,
genPairOf,
genTripleOf,
genTuple4Of,
genMapOf,
genNonEmptyMapOf,
genHashMapOf,
setDistinctPairOf,
setDistinctTripleOf,
distinctPairOf,
distinctTripleOf,
eitherOf,
hashMapOf,
listOf,
listOfMinMax,
nonEmptyOfMinMax,
mapOf,
maybeOf,
nonEmptyMapOf,
nonEmptyOf,
pairOf,
setOf,
setOfMinMax,
tripleOf,
tuple4Of,
tuple5Of,
choiceChooser,
chooseOne,
sampleIO,
)
where
import Data.HashMap.Strict as HashMap (HashMap, fromList)
import qualified Data.List as L
import Data.List.NonEmpty as NonEmpty hiding (cycle, nonEmpty, (!!))
import Data.Map as Map (fromList)
import Data.Maybe as Maybe
import Data.Registry
import Data.Registry.Internal.Hedgehog
import Data.Set as Set (fromList)
import Hedgehog
import Hedgehog.Gen as Gen
import Hedgehog.Range
import Protolude as P
genFun :: forall a b. (ApplyVariadic Gen a b, Typeable a, Typeable b) => a -> Typed b
genFun :: forall a b.
(ApplyVariadic Gen a b, Typeable a, Typeable b) =>
a -> Typed b
genFun = forall (m :: * -> *) a b.
(ApplyVariadic m a b, Typeable a, Typeable b) =>
a -> Typed b
funTo @Gen
genVal :: forall a. (Typeable a) => Gen a -> Typed (Gen a)
genVal :: forall a. Typeable a => Gen a -> Typed (Gen a)
genVal = Gen a -> Typed (Gen a)
forall a. Typeable a => a -> Typed a
fun
genWith :: forall a ins out. (Typeable a) => Registry ins out -> Gen a
genWith :: forall a (ins :: [*]) (out :: [*]).
Typeable a =>
Registry ins out -> Gen a
genWith = forall a (ins :: [*]) (out :: [*]).
Typeable a =>
Registry ins out -> a
make @(Gen a)
tweakGen :: forall a ins out. (Typeable a) => (a -> a) -> Registry ins out -> Registry ins out
tweakGen :: forall a (ins :: [*]) (out :: [*]).
Typeable a =>
(a -> a) -> Registry ins out -> Registry ins out
tweakGen a -> a
f = forall a (ins :: [*]) (out :: [*]).
Typeable a =>
(a -> a) -> Registry ins out -> Registry ins out
tweak @(Gen a) (a -> a
f (a -> a) -> Gen a -> Gen a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>)
setGen :: forall a ins out. (Typeable a) => Gen a -> Registry ins out -> Registry ins out
setGen :: forall a (ins :: [*]) (out :: [*]).
Typeable a =>
Gen a -> Registry ins out -> Registry ins out
setGen = forall a (ins :: [*]) (out :: [*]).
Typeable a =>
(a -> a) -> Registry ins out -> Registry ins out
tweak @(Gen a) ((Gen a -> Gen a) -> Registry ins out -> Registry ins out)
-> (Gen a -> Gen a -> Gen a)
-> Gen a
-> Registry ins out
-> Registry ins out
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Gen a -> Gen a -> Gen a
forall a b. a -> b -> a
const
specializeGen :: forall a b ins out. (Typeable a, Typeable b) => Gen b -> Registry ins out -> Registry ins out
specializeGen :: forall a b (ins :: [*]) (out :: [*]).
(Typeable a, Typeable b) =>
Gen b -> Registry ins out -> Registry ins out
specializeGen = forall a b (ins :: [*]) (out :: [*]).
(Typeable a, Typeable b) =>
b -> Registry ins out -> Registry ins out
specialize @(Gen a) @(Gen b)
genListOf :: forall a. (Typeable a) => Typed (Gen a -> Gen [a])
genListOf :: forall a. Typeable a => Typed (Gen a -> Gen [a])
genListOf = (Gen a -> Gen [a]) -> Typed (Gen a -> Gen [a])
forall a. Typeable a => a -> Typed a
fun (forall a. Gen a -> Gen [a]
listOf @a)
genListOfMinMax :: forall a. (Typeable a) => Int -> Int -> Typed (Gen a -> Gen [a])
genListOfMinMax :: forall a. Typeable a => Int -> Int -> Typed (Gen a -> Gen [a])
genListOfMinMax Int
mn Int
mx = (Gen a -> Gen [a]) -> Typed (Gen a -> Gen [a])
forall a. Typeable a => a -> Typed a
fun (forall a. Int -> Int -> Gen a -> Gen [a]
listOfMinMax @a Int
mn Int
mx)
genNonEmptyOf :: forall a. (Typeable a) => Typed (Gen a -> Gen (NonEmpty a))
genNonEmptyOf :: forall a. Typeable a => Typed (Gen a -> Gen (NonEmpty a))
genNonEmptyOf = (Gen a -> Gen (NonEmpty a)) -> Typed (Gen a -> Gen (NonEmpty a))
forall a. Typeable a => a -> Typed a
fun (forall a. Gen a -> Gen (NonEmpty a)
nonEmptyOf @a)
genNonEmptyOfMinMax :: forall a. (Typeable a) => Int -> Int -> Typed (Gen a -> Gen (NonEmpty a))
genNonEmptyOfMinMax :: forall a.
Typeable a =>
Int -> Int -> Typed (Gen a -> Gen (NonEmpty a))
genNonEmptyOfMinMax Int
mn Int
mx = (Gen a -> Gen (NonEmpty a)) -> Typed (Gen a -> Gen (NonEmpty a))
forall a. Typeable a => a -> Typed a
fun (forall a. Int -> Int -> Gen a -> Gen (NonEmpty a)
nonEmptyOfMinMax @a Int
mn Int
mx)
genMaybeOf :: forall a. (Typeable a) => Typed (Gen a -> Gen (Maybe a))
genMaybeOf :: forall a. Typeable a => Typed (Gen a -> Gen (Maybe a))
genMaybeOf = (Gen a -> Gen (Maybe a)) -> Typed (Gen a -> Gen (Maybe a))
forall a. Typeable a => a -> Typed a
fun (forall a. Gen a -> Gen (Maybe a)
maybeOf @a)
genOneOf :: (Typeable a, Show a) => [a] -> Typed (Gen a)
genOneOf :: forall a. (Typeable a, Show a) => [a] -> Typed (Gen a)
genOneOf [a]
as = Gen a -> Typed (Gen a)
forall a. Typeable a => Gen a -> Typed (Gen a)
genVal ([a] -> Gen a
forall (m :: * -> *) a. MonadGen m => [a] -> m a
Gen.element [a]
as)
genPairOf :: forall a b. (Typeable a, Typeable b) => Typed (Gen a -> Gen b -> Gen (a, b))
genPairOf :: forall a b.
(Typeable a, Typeable b) =>
Typed (Gen a -> Gen b -> Gen (a, b))
genPairOf = (Gen a -> Gen b -> Gen (a, b))
-> Typed (Gen a -> Gen b -> Gen (a, b))
forall a. Typeable a => a -> Typed a
fun (forall a b. Gen a -> Gen b -> Gen (a, b)
pairOf @a @b)
genTripleOf :: forall a b c. (Typeable a, Typeable b, Typeable c) => Typed (Gen a -> Gen b -> Gen c -> Gen (a, b, c))
genTripleOf :: forall a b c.
(Typeable a, Typeable b, Typeable c) =>
Typed (Gen a -> Gen b -> Gen c -> Gen (a, b, c))
genTripleOf = (Gen a -> Gen b -> Gen c -> Gen (a, b, c))
-> Typed (Gen a -> Gen b -> Gen c -> Gen (a, b, c))
forall a. Typeable a => a -> Typed a
fun (forall a b c. Gen a -> Gen b -> Gen c -> Gen (a, b, c)
tripleOf @a @b @c)
genTuple4Of :: forall a b c d. (Typeable a, Typeable b, Typeable c, Typeable d) => Typed (Gen a -> Gen b -> Gen c -> Gen d -> Gen (a, b, c, d))
genTuple4Of :: forall a b c d.
(Typeable a, Typeable b, Typeable c, Typeable d) =>
Typed (Gen a -> Gen b -> Gen c -> Gen d -> Gen (a, b, c, d))
genTuple4Of = (Gen a -> Gen b -> Gen c -> Gen d -> Gen (a, b, c, d))
-> Typed (Gen a -> Gen b -> Gen c -> Gen d -> Gen (a, b, c, d))
forall a. Typeable a => a -> Typed a
fun (forall a b c d.
Gen a -> Gen b -> Gen c -> Gen d -> Gen (a, b, c, d)
tuple4Of @a @b @c @d)
genMapOf :: forall k v. (Ord k, Typeable k, Typeable v) => Typed (Gen k -> Gen v -> Gen (Map k v))
genMapOf :: forall k v.
(Ord k, Typeable k, Typeable v) =>
Typed (Gen k -> Gen v -> Gen (Map k v))
genMapOf = (Gen k -> Gen v -> Gen (Map k v))
-> Typed (Gen k -> Gen v -> Gen (Map k v))
forall a. Typeable a => a -> Typed a
fun (forall k v. Ord k => Gen k -> Gen v -> Gen (Map k v)
mapOf @k @v)
genNonEmptyMapOf :: forall k v. (Ord k, Typeable k, Typeable v) => Typed (Gen k -> Gen v -> Gen (Map k v))
genNonEmptyMapOf :: forall k v.
(Ord k, Typeable k, Typeable v) =>
Typed (Gen k -> Gen v -> Gen (Map k v))
genNonEmptyMapOf = (Gen k -> Gen v -> Gen (Map k v))
-> Typed (Gen k -> Gen v -> Gen (Map k v))
forall a. Typeable a => a -> Typed a
fun (forall k v. Ord k => Gen k -> Gen v -> Gen (Map k v)
nonEmptyMapOf @k @v)
genHashMapOf :: forall k v. (Ord k, Hashable k, Typeable k, Typeable v) => Typed (Gen k -> Gen v -> Gen (HashMap k v))
genHashMapOf :: forall k v.
(Ord k, Hashable k, Typeable k, Typeable v) =>
Typed (Gen k -> Gen v -> Gen (HashMap k v))
genHashMapOf = (Gen k -> Gen v -> Gen (HashMap k v))
-> Typed (Gen k -> Gen v -> Gen (HashMap k v))
forall a. Typeable a => a -> Typed a
fun (forall k v.
(Ord k, Hashable k) =>
Gen k -> Gen v -> Gen (HashMap k v)
hashMapOf @k @v)
setDistinctPairOf :: forall a. (Typeable a, Eq a) => Registry _ _ -> Registry _ _
setDistinctPairOf :: Registry ins out
-> Registry (GenT Identity a : ins) (GenT Identity (a, a) : out)
setDistinctPairOf Registry ins out
r = (GenT Identity a -> GenT Identity (a, a))
-> Typed (GenT Identity a -> GenT Identity (a, a))
forall a. Typeable a => a -> Typed a
fun (forall a. Eq a => Gen a -> Gen (a, a)
distinctPairOf @a) Typed (GenT Identity a -> GenT Identity (a, a))
-> Registry ins out
-> Registry
(Inputs (GenT Identity a -> GenT Identity (a, a)) :++ ins)
(Output (GenT Identity a -> GenT Identity (a, a)) : out)
forall a (ins :: [*]) (out :: [*]).
Typeable a =>
Typed a
-> Registry ins out -> Registry (Inputs a :++ ins) (Output a : out)
+: Registry ins out
r
setDistinctTripleOf :: forall a. (Typeable a, Eq a) => Registry _ _ -> Registry _ _
setDistinctTripleOf :: Registry ins out
-> Registry (GenT Identity a : ins) (GenT Identity (a, a, a) : out)
setDistinctTripleOf Registry ins out
r = (GenT Identity a -> GenT Identity (a, a, a))
-> Typed (GenT Identity a -> GenT Identity (a, a, a))
forall a. Typeable a => a -> Typed a
fun (forall a. Eq a => Gen a -> Gen (a, a, a)
distinctTripleOf @a) Typed (GenT Identity a -> GenT Identity (a, a, a))
-> Registry ins out
-> Registry
(Inputs (GenT Identity a -> GenT Identity (a, a, a)) :++ ins)
(Output (GenT Identity a -> GenT Identity (a, a, a)) : out)
forall a (ins :: [*]) (out :: [*]).
Typeable a =>
Typed a
-> Registry ins out -> Registry (Inputs a :++ ins) (Output a : out)
+: Registry ins out
r
makeNonEmpty :: forall a ins out. (Typeable a) => Registry ins out -> Registry ins out
makeNonEmpty :: forall a (ins :: [*]) (out :: [*]).
Typeable a =>
Registry ins out -> Registry ins out
makeNonEmpty Registry ins out
r =
let genA :: Gen a
genA = forall a (ins :: [*]) (out :: [*]).
Typeable a =>
Registry ins out -> Gen a
genWith @a Registry ins out
r
in
forall a (ins :: [*]) (out :: [*]).
Typeable a =>
(a -> a) -> Registry ins out -> Registry ins out
tweak @(Gen [a]) (\Gen [a]
genAs -> (:) (a -> [a] -> [a]) -> Gen a -> GenT Identity ([a] -> [a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
genA GenT Identity ([a] -> [a]) -> Gen [a] -> Gen [a]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen [a]
genAs) Registry ins out
r
pairOf :: forall a b. Gen a -> Gen b -> Gen (a, b)
pairOf :: forall a b. Gen a -> Gen b -> Gen (a, b)
pairOf Gen a
ga Gen b
gb = (,) (a -> b -> (a, b)) -> Gen a -> GenT Identity (b -> (a, b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
ga GenT Identity (b -> (a, b)) -> Gen b -> GenT Identity (a, b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen b
gb
tripleOf :: forall a b c. Gen a -> Gen b -> Gen c -> Gen (a, b, c)
tripleOf :: forall a b c. Gen a -> Gen b -> Gen c -> Gen (a, b, c)
tripleOf Gen a
ga Gen b
gb Gen c
gc = (,,) (a -> b -> c -> (a, b, c))
-> Gen a -> GenT Identity (b -> c -> (a, b, c))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
ga GenT Identity (b -> c -> (a, b, c))
-> Gen b -> GenT Identity (c -> (a, b, c))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen b
gb GenT Identity (c -> (a, b, c)) -> Gen c -> GenT Identity (a, b, c)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen c
gc
tuple4Of :: forall a b c d. Gen a -> Gen b -> Gen c -> Gen d -> Gen (a, b, c, d)
tuple4Of :: forall a b c d.
Gen a -> Gen b -> Gen c -> Gen d -> Gen (a, b, c, d)
tuple4Of Gen a
ga Gen b
gb Gen c
gc Gen d
gd = (,,,) (a -> b -> c -> d -> (a, b, c, d))
-> Gen a -> GenT Identity (b -> c -> d -> (a, b, c, d))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
ga GenT Identity (b -> c -> d -> (a, b, c, d))
-> Gen b -> GenT Identity (c -> d -> (a, b, c, d))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen b
gb GenT Identity (c -> d -> (a, b, c, d))
-> Gen c -> GenT Identity (d -> (a, b, c, d))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen c
gc GenT Identity (d -> (a, b, c, d))
-> Gen d -> GenT Identity (a, b, c, d)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen d
gd
tuple5Of :: forall a b c d e. Gen a -> Gen b -> Gen c -> Gen d -> Gen e -> Gen (a, b, c, d, e)
tuple5Of :: forall a b c d e.
Gen a -> Gen b -> Gen c -> Gen d -> Gen e -> Gen (a, b, c, d, e)
tuple5Of Gen a
ga Gen b
gb Gen c
gc Gen d
gd Gen e
ge = (,,,,) (a -> b -> c -> d -> e -> (a, b, c, d, e))
-> Gen a -> GenT Identity (b -> c -> d -> e -> (a, b, c, d, e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
ga GenT Identity (b -> c -> d -> e -> (a, b, c, d, e))
-> Gen b -> GenT Identity (c -> d -> e -> (a, b, c, d, e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen b
gb GenT Identity (c -> d -> e -> (a, b, c, d, e))
-> Gen c -> GenT Identity (d -> e -> (a, b, c, d, e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen c
gc GenT Identity (d -> e -> (a, b, c, d, e))
-> Gen d -> GenT Identity (e -> (a, b, c, d, e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen d
gd GenT Identity (e -> (a, b, c, d, e))
-> Gen e -> GenT Identity (a, b, c, d, e)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen e
ge
listOf :: forall a. Gen a -> Gen [a]
listOf :: forall a. Gen a -> Gen [a]
listOf = Range Int -> GenT Identity a -> GenT Identity [a]
forall (m :: * -> *) a. MonadGen m => Range Int -> m a -> m [a]
Gen.list (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
linear Int
0 Int
10)
listOfMinMax :: forall a. Int -> Int -> Gen a -> Gen [a]
listOfMinMax :: forall a. Int -> Int -> Gen a -> Gen [a]
listOfMinMax Int
min' Int
max' = Range Int -> GenT Identity a -> GenT Identity [a]
forall (m :: * -> *) a. MonadGen m => Range Int -> m a -> m [a]
Gen.list (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
linear Int
min' Int
max')
nonEmptyOf :: Gen a -> Gen (NonEmpty a)
nonEmptyOf :: forall a. Gen a -> Gen (NonEmpty a)
nonEmptyOf = Range Int -> GenT Identity a -> GenT Identity (NonEmpty a)
forall (m :: * -> *) a.
MonadGen m =>
Range Int -> m a -> m (NonEmpty a)
Gen.nonEmpty (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
linear Int
1 Int
10)
maybeOf :: forall a. Gen a -> Gen (Maybe a)
maybeOf :: forall a. Gen a -> Gen (Maybe a)
maybeOf Gen a
genA = [GenT Identity (Maybe a)] -> GenT Identity (Maybe a)
forall (m :: * -> *) a. MonadGen m => [m a] -> m a
choice [Maybe a -> GenT Identity (Maybe a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing, a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> Gen a -> GenT Identity (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
genA]
eitherOf :: forall a b. Gen a -> Gen b -> Gen (Either a b)
eitherOf :: forall a b. Gen a -> Gen b -> Gen (Either a b)
eitherOf Gen a
genA Gen b
genB = [GenT Identity (Either a b)] -> GenT Identity (Either a b)
forall (m :: * -> *) a. MonadGen m => [m a] -> m a
choice [a -> Either a b
forall a b. a -> Either a b
Left (a -> Either a b) -> Gen a -> GenT Identity (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
genA, b -> Either a b
forall a b. b -> Either a b
Right (b -> Either a b) -> Gen b -> GenT Identity (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen b
genB]
setOf :: forall a. (Ord a) => Gen a -> Gen (Set a)
setOf :: forall a. Ord a => Gen a -> Gen (Set a)
setOf = ([a] -> Set a) -> GenT Identity [a] -> GenT Identity (Set a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> Set a
forall a. Ord a => [a] -> Set a
Set.fromList (GenT Identity [a] -> GenT Identity (Set a))
-> (Gen a -> GenT Identity [a]) -> Gen a -> GenT Identity (Set a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Gen a -> GenT Identity [a]
forall a. Gen a -> Gen [a]
listOf
setOfMinMax :: forall a. (Ord a) => Int -> Int -> Gen a -> Gen (Set a)
setOfMinMax :: forall a. Ord a => Int -> Int -> Gen a -> Gen (Set a)
setOfMinMax Int
mi Int
mx = ([a] -> Set a) -> GenT Identity [a] -> GenT Identity (Set a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> Set a
forall a. Ord a => [a] -> Set a
Set.fromList (GenT Identity [a] -> GenT Identity (Set a))
-> (Gen a -> GenT Identity [a]) -> Gen a -> GenT Identity (Set a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([a] -> Bool) -> GenT Identity [a] -> GenT Identity [a]
forall (m :: * -> *) a.
(MonadGen m, GenBase m ~ Identity) =>
(a -> Bool) -> m a -> m a
Gen.filter (\[a]
as -> [a] -> [a]
forall a. Eq a => [a] -> [a]
L.nub [a]
as [a] -> [a] -> Bool
forall a. Eq a => a -> a -> Bool
== [a]
as) (GenT Identity [a] -> GenT Identity [a])
-> (Gen a -> GenT Identity [a]) -> Gen a -> GenT Identity [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> Int -> Gen a -> Gen [a]
listOfMinMax @a Int
mi Int
mx
mapOf :: forall k v. (Ord k) => Gen k -> Gen v -> Gen (Map k v)
mapOf :: forall k v. Ord k => Gen k -> Gen v -> Gen (Map k v)
mapOf Gen k
gk Gen v
gv = [(k, v)] -> Map k v
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(k, v)] -> Map k v)
-> GenT Identity [(k, v)] -> GenT Identity (Map k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (k, v) -> GenT Identity [(k, v)]
forall a. Gen a -> Gen [a]
listOf (Gen k -> Gen v -> Gen (k, v)
forall a b. Gen a -> Gen b -> Gen (a, b)
pairOf Gen k
gk Gen v
gv)
hashMapOf :: forall k v. (Ord k, Hashable k) => Gen k -> Gen v -> Gen (HashMap k v)
hashMapOf :: forall k v.
(Ord k, Hashable k) =>
Gen k -> Gen v -> Gen (HashMap k v)
hashMapOf Gen k
gk Gen v
gv = [(k, v)] -> HashMap k v
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HashMap.fromList ([(k, v)] -> HashMap k v)
-> GenT Identity [(k, v)] -> GenT Identity (HashMap k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (k, v) -> GenT Identity [(k, v)]
forall a. Gen a -> Gen [a]
listOf (Gen k -> Gen v -> Gen (k, v)
forall a b. Gen a -> Gen b -> Gen (a, b)
pairOf Gen k
gk Gen v
gv)
nonEmptyMapOf :: forall k v. (Ord k) => Gen k -> Gen v -> Gen (Map k v)
nonEmptyMapOf :: forall k v. Ord k => Gen k -> Gen v -> Gen (Map k v)
nonEmptyMapOf Gen k
gk Gen v
gv = do
(k, v)
h <- Gen k -> Gen v -> Gen (k, v)
forall a b. Gen a -> Gen b -> Gen (a, b)
pairOf Gen k
gk Gen v
gv
[(k, v)]
t <- Gen (k, v) -> Gen [(k, v)]
forall a. Gen a -> Gen [a]
listOf (Gen k -> Gen v -> Gen (k, v)
forall a b. Gen a -> Gen b -> Gen (a, b)
pairOf Gen k
gk Gen v
gv)
Map k v -> Gen (Map k v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([(k, v)] -> Map k v
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ((k, v)
h (k, v) -> [(k, v)] -> [(k, v)]
forall a. a -> [a] -> [a]
: [(k, v)]
t))
nonEmptyOfMinMax :: Int -> Int -> Gen a -> Gen (NonEmpty a)
nonEmptyOfMinMax :: forall a. Int -> Int -> Gen a -> Gen (NonEmpty a)
nonEmptyOfMinMax Int
mi Int
ma Gen a
g = [a] -> NonEmpty a
forall a. [a] -> NonEmpty a
NonEmpty.fromList ([a] -> NonEmpty a)
-> GenT Identity [a] -> GenT Identity (NonEmpty a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Int -> Gen a -> GenT Identity [a]
forall a. Int -> Int -> Gen a -> Gen [a]
listOfMinMax Int
mi Int
ma Gen a
g
distinctPairOf :: forall a. (Eq a) => Gen a -> Gen (a, a)
distinctPairOf :: forall a. Eq a => Gen a -> Gen (a, a)
distinctPairOf Gen a
genA = ((a, a) -> Bool) -> GenT Identity (a, a) -> GenT Identity (a, a)
forall (m :: * -> *) a. MonadGen m => (a -> Bool) -> m a -> m a
Gen.filterT ((a -> a -> Bool) -> (a, a) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(/=)) (GenT Identity (a, a) -> GenT Identity (a, a))
-> GenT Identity (a, a) -> GenT Identity (a, a)
forall a b. (a -> b) -> a -> b
$ (,) (a -> a -> (a, a)) -> Gen a -> GenT Identity (a -> (a, a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
genA GenT Identity (a -> (a, a)) -> Gen a -> GenT Identity (a, a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
genA
distinctTripleOf :: forall a. (Eq a) => Gen a -> Gen (a, a, a)
distinctTripleOf :: forall a. Eq a => Gen a -> Gen (a, a, a)
distinctTripleOf Gen a
genA = ((a, a, a) -> Bool)
-> GenT Identity (a, a, a) -> GenT Identity (a, a, a)
forall (m :: * -> *) a. MonadGen m => (a -> Bool) -> m a -> m a
Gen.filterT (\(a
a1, a
a2, a
a3) -> a
a1 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
a2 Bool -> Bool -> Bool
&& a
a2 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
a3 Bool -> Bool -> Bool
&& a
a1 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
a3) (GenT Identity (a, a, a) -> GenT Identity (a, a, a))
-> GenT Identity (a, a, a) -> GenT Identity (a, a, a)
forall a b. (a -> b) -> a -> b
$ (,,) (a -> a -> a -> (a, a, a))
-> Gen a -> GenT Identity (a -> a -> (a, a, a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
genA GenT Identity (a -> a -> (a, a, a))
-> Gen a -> GenT Identity (a -> (a, a, a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
genA GenT Identity (a -> (a, a, a)) -> Gen a -> GenT Identity (a, a, a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
genA