| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Generic.Random.Internal.Generic
Contents
Description
Core implementation.
Warning
This is an internal module: it is not subject to any versioning policy, breaking changes can happen at any time.
If something here seems useful, please report it or create a pull request to export it from an external module.
Synopsis
- genericArbitrary :: GArbitrary UnsizedOpts a => Weights a -> Gen a
- genericArbitraryU :: (GArbitrary UnsizedOpts a, GUniformWeight a) => Gen a
- genericArbitrarySingle :: (GArbitrary UnsizedOpts a, Weights_ (Rep a) ~ L c0) => Gen a
- genericArbitraryRec :: GArbitrary SizedOptsDef a => Weights a -> Gen a
- genericArbitraryG :: GArbitrary (SetGens genList UnsizedOpts) a => genList -> Weights a -> Gen a
- genericArbitraryUG :: (GArbitrary (SetGens genList UnsizedOpts) a, GUniformWeight a) => genList -> Gen a
- genericArbitrarySingleG :: (GArbitrary (SetGens genList UnsizedOpts) a, Weights_ (Rep a) ~ L c0) => genList -> Gen a
- genericArbitraryRecG :: GArbitrary (SetGens genList SizedOpts) a => genList -> Weights a -> Gen a
- genericArbitraryWith :: GArbitrary opts a => opts -> Weights a -> Gen a
- type family Weights_ (f :: Type -> Type) :: Type where ...
- data a :| b = N a Int b
- data L (c :: Symbol) = L
- data Weights a = Weights (Weights_ (Rep a)) Int
- newtype W (c :: Symbol) = W Int
- weights :: (Weights_ (Rep a), Int, ()) -> Weights a
- uniform :: UniformWeight_ (Rep a) => Weights a
- type family First a :: Symbol where ...
- type family First' w where ...
- type family Prec' w where ...
- class WeightBuilder' w where
- class WeightBuilder a where
- class UniformWeight a where
- uniformWeight :: (a, Int)
- class UniformWeight (Weights_ f) => UniformWeight_ f
- class UniformWeight_ (Rep a) => GUniformWeight a
- newtype Options (c :: Coherence) (s :: Sizing) (genList :: Type) = Options {
- _generators :: genList
- type family SetOptions (x :: k) (o :: Type) :: Type
- type (<+) o x = SetOptions x o
- type UnsizedOpts = Options 'INCOHERENT 'Unsized ()
- type SizedOpts = Options 'INCOHERENT 'Sized ()
- type SizedOptsDef = Options 'INCOHERENT 'Sized (Gen1 [] :+ ())
- type CohUnsizedOpts = Options 'COHERENT 'Unsized ()
- type CohSizedOpts = Options 'COHERENT 'Sized ()
- setOpts :: forall x o. Coercible o (SetOptions x o) => o -> SetOptions x o
- unsizedOpts :: UnsizedOpts
- sizedOpts :: SizedOpts
- sizedOptsDef :: SizedOptsDef
- cohUnsizedOpts :: CohUnsizedOpts
- cohSizedOpts :: CohSizedOpts
- data Sizing
- type family SizingOf opts :: Sizing
- type family SetSized (o :: Type) :: Type
- type family SetUnsized (o :: Type) :: Type
- setSized :: Options c s g -> Options c 'Sized g
- setUnsized :: Options c s g -> Options c 'Unsized g
- data Coherence
- type family CoherenceOf (o :: Type) :: Coherence
- newtype Incoherent g = Incoherent g
- data a :+ b = a :+ b
- type family GeneratorsOf opts :: Type
- class HasGenerators opts where
- generators :: opts -> GeneratorsOf opts
- setGenerators :: genList -> Options c s g0 -> Options c s genList
- type family SetGens (g :: Type) opts
- newtype FieldGen (s :: Symbol) a = FieldGen {
- unFieldGen :: Gen a
- fieldGen :: proxy s -> Gen a -> FieldGen s a
- newtype ConstrGen (c :: Symbol) (i :: Nat) a = ConstrGen {
- unConstrGen :: Gen a
- constrGen :: proxy '(c, i) -> Gen a -> ConstrGen c i a
- newtype Gen1 f = Gen1 {}
- newtype Gen1_ f = Gen1_ {}
- vectorOf' :: Int -> Gen a -> Gen [a]
- listOf' :: Gen a -> Gen [a]
- listOf1' :: Gen a -> Gen [a]
- geom :: Int -> Gen Int
- class GA opts f where
- class (Generic a, GA opts (Rep a)) => GArbitrary opts a
- gaSum' :: GASum opts f => opts -> Weights_ f -> Int -> Gen (f p)
- class GASum opts f where
- class GAProduct (s :: Sizing) (c :: Maybe Symbol) opts f where
- class GAProduct' (c :: Maybe Symbol) (i :: Nat) opts f where
- gaProduct' :: proxy '(c, i) -> opts -> Gen (f p)
- type family Arity f :: Nat where ...
- class FindGen (i :: AInstr) (s :: AStore) (g :: Type) (gs :: Type) (a :: Type) where
- findGen :: (Proxy i, Proxy s, FullGenListOf s) -> g -> gs -> Gen a
- data AInstr
- data AStore = S Type Coherence ASel
- type ASel = (Maybe Symbol, Nat, Maybe Symbol)
- iShift :: Proxy 'Shift
- type family FullGenListOf (s :: AStore) :: Type where ...
- type family ACoherenceOf (s :: AStore) :: Coherence where ...
- type family ASelOf (s :: AStore) :: ASel where ...
- type DummySel = '('Nothing, 0, 'Nothing)
- type family Name (d :: Meta) :: Maybe Symbol
- type family Matches (s :: ASel) (g :: Type) (a :: Type) :: Bool where ...
- newtype Weighted a = Weighted (Maybe (Int -> Gen a, Int))
- liftGen :: Gen a -> Weighted a
Random generators
Arguments
| :: GArbitrary UnsizedOpts a | |
| => Weights a | List of weights for every constructor |
| -> Gen a |
Pick a constructor with a given distribution, and fill its fields
with recursive calls to arbitrary.
Example
genericArbitrary (2 % 3 % 5 % ()) :: Gen a
Picks the first constructor with probability 2/10,
the second with probability 3/10, the third with probability 5/10.
genericArbitraryU :: (GArbitrary UnsizedOpts a, GUniformWeight a) => Gen a Source #
Pick every constructor with equal probability.
Equivalent to .genericArbitrary uniform
genericArbitraryU :: Gen a
genericArbitrarySingle :: (GArbitrary UnsizedOpts a, Weights_ (Rep a) ~ L c0) => Gen a Source #
arbitrary for types with one constructor.
Equivalent to genericArbitraryU, with a stricter type.
genericArbitrarySingle :: Gen a
Arguments
| :: GArbitrary SizedOptsDef a | |
| => Weights a | List of weights for every constructor |
| -> Gen a |
genericArbitraryG :: GArbitrary (SetGens genList UnsizedOpts) a => genList -> Weights a -> Gen a Source #
genericArbitrary with explicit generators.
Example
genericArbitraryG customGens (17 % 19 % ())
where, the generators for String and Int fields are overridden as
follows, for example:
customGens :: Gen String:+Gen Int customGens = (filter (/= 'NUL')<$>arbitrary):+(getNonNegative<$>arbitrary)
Note on multiple matches
Multiple generators may match a given field: the first will be chosen.
genericArbitraryUG :: (GArbitrary (SetGens genList UnsizedOpts) a, GUniformWeight a) => genList -> Gen a Source #
genericArbitraryU with explicit generators.
See also genericArbitraryG.
genericArbitrarySingleG :: (GArbitrary (SetGens genList UnsizedOpts) a, Weights_ (Rep a) ~ L c0) => genList -> Gen a Source #
genericArbitrarySingle with explicit generators.
See also genericArbitraryG.
Arguments
| :: GArbitrary (SetGens genList SizedOpts) a | |
| => genList | |
| -> Weights a | List of weights for every constructor |
| -> Gen a |
genericArbitraryRec with explicit generators.
See also genericArbitraryG.
genericArbitraryWith :: GArbitrary opts a => opts -> Weights a -> Gen a Source #
General generic generator with custom options.
Internal
Instances
| (UniformWeight a, UniformWeight b) => UniformWeight (a :| b) Source # | |
Defined in Generic.Random.Internal.Generic Methods uniformWeight :: (a :| b, Int) Source # | |
| WeightBuilder a => WeightBuilder (a :| b) Source # | |
| type Prec (a :| b) r Source # | |
Defined in Generic.Random.Internal.Generic | |
Constructors
| L |
Instances
| UniformWeight (L c) Source # | |
Defined in Generic.Random.Internal.Generic Methods uniformWeight :: (L c, Int) Source # | |
| WeightBuilder (L c) Source # | |
| type Prec (L c) r Source # | |
Defined in Generic.Random.Internal.Generic | |
Trees of weights assigned to constructors of type a,
rescaled to obtain a probability distribution.
Two ways of constructing them.
(x1%x2%...%xn%()) ::Weightsauniform::Weightsa
Using (, there must be exactly as many weights as
there are constructors.%)
uniform is equivalent to (1
(automatically fills out the right number of 1s).% ... % 1 % ())
weights :: (Weights_ (Rep a), Int, ()) -> Weights a Source #
A smart constructor to specify a custom distribution.
It can be omitted for the % operator is overloaded to
insert it.
class WeightBuilder' w where Source #
Methods
(%) :: c ~ First' w => W c -> Prec' w -> w infixr 1 Source #
A binary constructor for building up trees of weights.
Instances
| WeightBuilder (Weights_ (Rep a)) => WeightBuilder' (Weights a) Source # | |
| WeightBuilder a => WeightBuilder' (a, Int, r) Source # | |
class WeightBuilder a where Source #
Instances
| WeightBuilder () Source # | |
| WeightBuilder (L c) Source # | |
| WeightBuilder a => WeightBuilder (a :| b) Source # | |
class UniformWeight a where Source #
Methods
uniformWeight :: (a, Int) Source #
Instances
| UniformWeight () Source # | |
Defined in Generic.Random.Internal.Generic Methods uniformWeight :: ((), Int) Source # | |
| UniformWeight (L c) Source # | |
Defined in Generic.Random.Internal.Generic Methods uniformWeight :: (L c, Int) Source # | |
| (UniformWeight a, UniformWeight b) => UniformWeight (a :| b) Source # | |
Defined in Generic.Random.Internal.Generic Methods uniformWeight :: (a :| b, Int) Source # | |
class UniformWeight (Weights_ f) => UniformWeight_ f Source #
Instances
| UniformWeight (Weights_ f) => UniformWeight_ f Source # | |
Defined in Generic.Random.Internal.Generic | |
class UniformWeight_ (Rep a) => GUniformWeight a Source #
Derived uniform distribution of constructors for a.
Instances
| UniformWeight_ (Rep a) => GUniformWeight a Source # | |
Defined in Generic.Random.Internal.Generic | |
newtype Options (c :: Coherence) (s :: Sizing) (genList :: Type) Source #
Type-level options for GArbitrary.
Note: it is recommended to avoid referring to the Options type
explicitly in code, as the set of options may change in the future.
Instead, use the provided synonyms (UnsizedOpts, SizedOpts, SizedOptsDef)
and the setter SetOptions (abbreviated as ().<+)
Constructors
| Options | |
Fields
| |
Instances
| HasGenerators (Options c s g) Source # | |
Defined in Generic.Random.Internal.Generic Methods generators :: Options c s g -> GeneratorsOf (Options c s g) Source # | |
| type SetOptions (g :: Type) (Options c s _g) Source # | |
Defined in Generic.Random.Internal.Generic | |
| type SetOptions (c :: Coherence) (Options _c s g) Source # | |
Defined in Generic.Random.Internal.Generic | |
| type SetOptions (s :: Sizing) (Options c _s g) Source # | |
Defined in Generic.Random.Internal.Generic | |
| type SetGens g (Options c s _g) Source # | |
Defined in Generic.Random.Internal.Generic | |
| type GeneratorsOf (Options _c _s g) Source # | |
Defined in Generic.Random.Internal.Generic | |
| type CoherenceOf (Options c _s _g) Source # | |
Defined in Generic.Random.Internal.Generic | |
| type SetUnsized (Options c s g) Source # | |
Defined in Generic.Random.Internal.Generic | |
| type SetSized (Options c s g) Source # | |
Defined in Generic.Random.Internal.Generic | |
| type SizingOf (Options _c s _g) Source # | |
Defined in Generic.Random.Internal.Generic | |
type family SetOptions (x :: k) (o :: Type) :: Type Source #
Instances
| type SetOptions (g :: Type) (Options c s _g) Source # | |
Defined in Generic.Random.Internal.Generic | |
| type SetOptions (c :: Coherence) (Options _c s g) Source # | |
Defined in Generic.Random.Internal.Generic | |
| type SetOptions (s :: Sizing) (Options c _s g) Source # | |
Defined in Generic.Random.Internal.Generic | |
type (<+) o x = SetOptions x o infixl 1 Source #
Infix flipped synonym for Options.
Since: 1.4.0.0
type UnsizedOpts = Options 'INCOHERENT 'Unsized () Source #
type SizedOptsDef = Options 'INCOHERENT 'Sized (Gen1 [] :+ ()) Source #
type CohUnsizedOpts = Options 'COHERENT 'Unsized () Source #
Like UnsizedOpts, but using coherent instances by default.
Since: 1.4.0.0
type CohSizedOpts = Options 'COHERENT 'Sized () Source #
Like SizedOpts, but using coherent instances by default.
Since: 1.4.0.0
setOpts :: forall x o. Coercible o (SetOptions x o) => o -> SetOptions x o Source #
Coerce an Options value between types with the same representation.
Since: 1.4.0.0
unsizedOpts :: UnsizedOpts Source #
Default options for unsized generators.
sizedOptsDef :: SizedOptsDef Source #
Default options overriding the list generator using listOf'.
cohUnsizedOpts :: CohUnsizedOpts Source #
Like unsizedOpts, but using coherent instances by default.
cohSizedOpts :: CohSizedOpts Source #
Like sizedOpts but using coherent instances by default.
Whether to decrease the size parameter before generating fields.
The Sized option makes the size parameter decrease in the following way:
- Constructors with one field decrease the size parameter by 1 to generate
that field.
- Constructors with more than one field split the size parameter among all
fields; the size parameter is rounded down to then be divided equally.
Constructors
| Sized | Decrease the size parameter when running generators for fields |
| Unsized | Don't touch the size parameter |
Instances
| type SetOptions (s :: Sizing) (Options c _s g) Source # | |
Defined in Generic.Random.Internal.Generic | |
type family SetUnsized (o :: Type) :: Type Source #
Instances
| type SetUnsized (Options c s g) Source # | |
Defined in Generic.Random.Internal.Generic | |
For custom generators to work with parameterized types, incoherent instances must be used internally. In practice, the resulting behavior is what users want 100% of the time, so you should forget this option even exists.
Details
The default configuration of generic-random does a decent job if we trust GHC implements precisely the instance resolution algorithm as described in the GHC manual:
While that assumption holds in practice, it is overly context-dependent (to know the context leading to a particular choice, we must replay the whole resolution algorithm). In particular, this algorithm may find one solution, but it is not guaranteed to be unique: the behavior of the program is dependent on implementation details.
An notable property to consider of an implicit type system (such as type classes) is coherence: the behavior of the program is stable under specialization.
This sounds nice on paper, but actually leads to surprising behavior for generic implementations with parameterized types, such as generic-random.
To address that, the coherence property can be relaxd by users, by explicitly allowing some custom generators to be chosen incoherently. With appropriate precautions, it is possible to ensure a weaker property which nevertheless helps keep type inference predictable: when a solution is found, it is unique. (This is assuredly weaker, i.e., is not stable under specialization.)
Since: 1.4.0.0
Constructors
| INCOHERENT | Match custom generators incoherently. |
| COHERENT | Match custom generators coherently by default
(can be manually bypassed with |
Instances
| type SetOptions (c :: Coherence) (Options _c s g) Source # | |
Defined in Generic.Random.Internal.Generic | |
type family CoherenceOf (o :: Type) :: Coherence Source #
Instances
| type CoherenceOf (Options c _s _g) Source # | |
Defined in Generic.Random.Internal.Generic | |
newtype Incoherent g Source #
Match this generator incoherently when the COHERENT option is set.
Constructors
| Incoherent g |
Instances
| FindGen ('Match 'INCOHERENT) s g gs a => FindGen 'Shift s (Incoherent g) gs a Source # | |
Defined in Generic.Random.Internal.Generic Methods findGen :: (Proxy 'Shift, Proxy s, FullGenListOf s) -> Incoherent g -> gs -> Gen a Source # | |
Heterogeneous list of generators.
Constructors
| a :+ b infixr 1 |
Instances
| FindGen 'Shift s b g a => FindGen 'Shift s () (b :+ g) a Source # | Examine the next candidate |
Defined in Generic.Random.Internal.Generic | |
| FindGen 'Shift s g (h :+ gs) a => FindGen 'Shift s (g :+ h) gs a Source # | This can happen if the generators form a tree rather than a list, for whatever reason. |
Defined in Generic.Random.Internal.Generic | |
| (TypeLevelGenList a, TypeLevelGenList b) => TypeLevelGenList (a :+ b :: Type) Source # | |
Defined in Generic.Random.DerivingVia Associated Types type TypeLevelGenList' (a :+ b) Source # | |
| type TypeLevelGenList' (a :+ b :: Type) Source # | |
Defined in Generic.Random.DerivingVia | |
type family GeneratorsOf opts :: Type Source #
Instances
| type GeneratorsOf (Options _c _s g) Source # | |
Defined in Generic.Random.Internal.Generic | |
class HasGenerators opts where Source #
Methods
generators :: opts -> GeneratorsOf opts Source #
Instances
| HasGenerators (Options c s g) Source # | |
Defined in Generic.Random.Internal.Generic Methods generators :: Options c s g -> GeneratorsOf (Options c s g) Source # | |
setGenerators :: genList -> Options c s g0 -> Options c s genList Source #
Define the set of custom generators.
Note: for recursive types which can recursively appear inside lists or other containers, you may want to include a custom generator to decrease the size when generating such containers.
See also the Note about lists in Generic.Random.Tutorial.
newtype FieldGen (s :: Symbol) a Source #
Custom generator for record fields named s.
If there is a field named s with a different type,
this will result in a type error.
Constructors
| FieldGen | |
Fields
| |
fieldGen :: proxy s -> Gen a -> FieldGen s a Source #
FieldGen constructor with the field name given via a proxy.
newtype ConstrGen (c :: Symbol) (i :: Nat) a Source #
Custom generator for the i-th field of the constructor named c.
Fields are 0-indexed.
Constructors
| ConstrGen | |
Fields
| |
Instances
| a ~ a' => FindGen ('MatchCoh 'True) s (ConstrGen c i a) gs a' Source # | Matching custom generator for |
| a ~ a' => FindGen ('Match 'INCOHERENT) ('S _fg _coh '('Just c, i, s)) (ConstrGen c i a) gs a' Source # | Matching custom generator for |
Defined in Generic.Random.Internal.Generic | |
constrGen :: proxy '(c, i) -> Gen a -> ConstrGen c i a Source #
ConstrGen constructor with the constructor name given via a proxy.
Custom generators for "containers" of kind Type -> Type, parameterized
by the generator for "contained elements".
A custom generator will be used for any field whose type has the
form Gen1 ff x, requiring a generator of x. The generator for x will be
constructed using the list of custom generators if possible, otherwise
an instance Arbitrary x will be required.
Instances
| (f x ~ a', FindGen 'Shift ('S fg coh (DummySel :: (Maybe Symbol, Nat, Maybe Symbol))) () fg x) => FindGen ('MatchCoh 'True) ('S fg coh _sel) (Gen1 f) gs a' Source # | |
| FindGen 'Shift ('S fg coh (DummySel :: (Maybe Symbol, Nat, Maybe Symbol))) () fg a => FindGen ('Match 'INCOHERENT) ('S fg coh _sel) (Gen1 f) gs (f a) Source # | Matching custom generator for container |
Defined in Generic.Random.Internal.Generic | |
Custom generators for unary type constructors that are not "containers",
i.e., which don't require a generator of a to generate an f a.
A custom generator will be used for any field whose type has the
form Gen1_ ff x.
Instances
| f x ~ a' => FindGen ('MatchCoh 'True) s (Gen1_ f) gs a' Source # | |
| FindGen ('Match 'INCOHERENT) s (Gen1_ f) gs (f a) Source # | Matching custom generator for non-container |
Defined in Generic.Random.Internal.Generic Methods findGen :: (Proxy ('Match 'INCOHERENT), Proxy s, FullGenListOf s) -> Gen1_ f -> gs -> Gen (f a) Source # | |
vectorOf' :: Int -> Gen a -> Gen [a] Source #
An alternative to vectorOf that divides the size parameter by the
length of the list.
listOf' :: Gen a -> Gen [a] Source #
An alternative to listOf that divides the size parameter
by the length of the list.
The length follows a geometric distribution of parameter
1/(sqrt size + 1).
listOf1' :: Gen a -> Gen [a] Source #
An alternative to listOf1 (nonempty lists) that divides
the size parameter by the length of the list.
The length (minus one) follows a geometric distribution of parameter
1/(sqrt size + 1).
class GA opts f where Source #
Generic Arbitrary
class (Generic a, GA opts (Rep a)) => GArbitrary opts a Source #
Generic Arbitrary
Instances
| (Generic a, GA opts (Rep a)) => GArbitrary opts a Source # | |
Defined in Generic.Random.Internal.Generic | |
class GAProduct (s :: Sizing) (c :: Maybe Symbol) opts f where Source #
Instances
| GAProduct' c 0 opts f => GAProduct 'Unsized c opts (f :: k -> Type) Source # | |
| (GAProduct' c 0 opts f, KnownNat (Arity f)) => GAProduct 'Sized c opts (f :: k -> Type) Source # | |
| GAProduct 'Sized c opts (U1 :: k -> Type) Source # | |
| GAProduct' c 0 opts (S1 d f) => GAProduct 'Sized c opts (S1 d f :: k -> Type) Source # | |
class GAProduct' (c :: Maybe Symbol) (i :: Nat) opts f where Source #
Methods
gaProduct' :: proxy '(c, i) -> opts -> Gen (f p) Source #
Instances
| GAProduct' c i opts (U1 :: k -> Type) Source # | |
Defined in Generic.Random.Internal.Generic Methods gaProduct' :: forall proxy (p :: k0). proxy '(c, i) -> opts -> Gen (U1 p) Source # | |
| (GAProduct' c i opts f, GAProduct' c (i + Arity f) opts g) => GAProduct' c i opts (f :*: g :: k -> Type) Source # | |
Defined in Generic.Random.Internal.Generic Methods gaProduct' :: forall proxy (p :: k0). proxy '(c, i) -> opts -> Gen ((f :*: g) p) Source # | |
| (HasGenerators opts, FindGen 'Shift ('S gs coh '(c, i, Name d)) () gs a, gs ~ GeneratorsOf opts, coh ~ CoherenceOf opts) => GAProduct' c i opts (S1 d (K1 _k a :: k -> Type) :: k -> Type) Source # | |
Defined in Generic.Random.Internal.Generic | |
class FindGen (i :: AInstr) (s :: AStore) (g :: Type) (gs :: Type) (a :: Type) where Source #
Given a list of custom generators g :+ gs, find one that applies,
or use Arbitrary a by default.
g and gs follow this little state machine:
g, gs | result
---------------------+-----------------------------
(), () | END
(), g :+ gs | g, gs
(), g | g, () when g is not (_ :+ _)
g :+ h, gs | g, h :+ gs
Gen a, gs | END if g matches, else ((), gs)
FieldGen a, gs | idem
ConstrGen a, gs | idem
Gen1 a, gs | idem
Gen1_ a, gs | idemInstances
| FindGen ('Match (ACoherenceOf s)) s g gs a => FindGen 'Shift s g gs a Source # | If none of the above matches, then |
Defined in Generic.Random.Internal.Generic | |
| FindGen 'Shift s g () a => FindGen 'Shift s () g a Source # | Examine the last candidate ( |
Defined in Generic.Random.Internal.Generic | |
| Arbitrary a => FindGen 'Shift s () () a Source # | All candidates have been exhausted |
Defined in Generic.Random.Internal.Generic | |
| FindGen 'Shift s b g a => FindGen 'Shift s () (b :+ g) a Source # | Examine the next candidate |
Defined in Generic.Random.Internal.Generic | |
| FindGen ('Match 'INCOHERENT) s g gs a => FindGen 'Shift s (Incoherent g) gs a Source # | |
Defined in Generic.Random.Internal.Generic Methods findGen :: (Proxy 'Shift, Proxy s, FullGenListOf s) -> Incoherent g -> gs -> Gen a Source # | |
| FindGen 'Shift s g (h :+ gs) a => FindGen 'Shift s (g :+ h) gs a Source # | This can happen if the generators form a tree rather than a list, for whatever reason. |
Defined in Generic.Random.Internal.Generic | |
| FindGen 'Shift s () gs a => FindGen ('Match 'INCOHERENT) s _g gs a Source # | None of the INCOHERENT instances match, discard the candidate |
Defined in Generic.Random.Internal.Generic Methods findGen :: (Proxy ('Match 'INCOHERENT), Proxy s, FullGenListOf s) -> _g -> gs -> Gen a Source # | |
| FindGen ('MatchCoh (Matches (ASelOf s) g a)) s g gs a => FindGen ('Match 'COHERENT) s g gs a Source # | |
Defined in Generic.Random.Internal.Generic | |
| FindGen 'Shift s () gs a => FindGen ('MatchCoh 'False) s _g gs a Source # | |
Defined in Generic.Random.Internal.Generic | |
| FindGen ('Match 'INCOHERENT) s (Gen a) gs a Source # | Matching custom generator for |
Defined in Generic.Random.Internal.Generic Methods findGen :: (Proxy ('Match 'INCOHERENT), Proxy s, FullGenListOf s) -> Gen a -> gs -> Gen a Source # | |
| a ~ a' => FindGen ('MatchCoh 'True) s (Gen a) gs a' Source # | |
| a ~ a' => FindGen ('MatchCoh 'True) s (FieldGen sn a) gs a' Source # | Matching custom generator for field |
| f x ~ a' => FindGen ('MatchCoh 'True) s (Gen1_ f) gs a' Source # | |
| FindGen ('Match 'INCOHERENT) s (Gen1_ f) gs (f a) Source # | Matching custom generator for non-container |
Defined in Generic.Random.Internal.Generic Methods findGen :: (Proxy ('Match 'INCOHERENT), Proxy s, FullGenListOf s) -> Gen1_ f -> gs -> Gen (f a) Source # | |
| a ~ a' => FindGen ('MatchCoh 'True) s (ConstrGen c i a) gs a' Source # | Matching custom generator for |
| (f x ~ a', FindGen 'Shift ('S fg coh (DummySel :: (Maybe Symbol, Nat, Maybe Symbol))) () fg x) => FindGen ('MatchCoh 'True) ('S fg coh _sel) (Gen1 f) gs a' Source # | |
| FindGen 'Shift ('S fg coh (DummySel :: (Maybe Symbol, Nat, Maybe Symbol))) () fg a => FindGen ('Match 'INCOHERENT) ('S fg coh _sel) (Gen1 f) gs (f a) Source # | Matching custom generator for container |
Defined in Generic.Random.Internal.Generic | |
| a ~ a' => FindGen ('Match 'INCOHERENT) ('S _fg _coh '(con, i, 'Just s)) (FieldGen s a) gs a' Source # | Matching custom generator for field |
Defined in Generic.Random.Internal.Generic | |
| a ~ a' => FindGen ('Match 'INCOHERENT) ('S _fg _coh '('Just c, i, s)) (ConstrGen c i a) gs a' Source # | Matching custom generator for |
Defined in Generic.Random.Internal.Generic | |
type family FullGenListOf (s :: AStore) :: Type where ... Source #
Equations
| FullGenListOf ('S fg _coh _sel) = fg |
type family ACoherenceOf (s :: AStore) :: Coherence where ... Source #
Equations
| ACoherenceOf ('S _fg coh _sel) = coh |
type family Matches (s :: ASel) (g :: Type) (a :: Type) :: Bool where ... Source #
Equations
| Matches _sel (Gen b) a = b == a | |
| Matches _sel (Gen1_ f) (f a) = 'True | |
| Matches _sel (Gen1_ f) a = 'False | |
| Matches _sel (Gen1 f) (f a) = 'True | |
| Matches _sel (Gen1 f) a = 'False | |
| Matches '(_c, i, s) (FieldGen s1 b) a = (s == 'Just s1) && (b == a) | |
| Matches '(c, i, _s) (ConstrGen c1 j b) a = (c == 'Just c1) && ((i == j) && (b == a)) |