constrained-generators-0.2.0.0: Framework for generating constrained random data using a subset of first order logic
Safe HaskellSafe-Inferred
LanguageHaskell2010

Constrained.TheKnot

Description

All the things that are mutually recursive.

Synopsis

Documentation

ifElse ∷ (IsPred p, IsPred q) ⇒ Term Bool → p → q → Pred Source #

If the `Specification Bool` doesn't constrain the boolean you will get a TrueSpec out.

mapSpec ∷ ∀ t a b. AppRequires t '[a] b ⇒ t '[a] b → Specification a → Specification b Source #

Functor like property for Specification, but instead of a Haskell function (a -> b), it takes a function symbol (t '[a] b) from a to b. Note, in this context, a function symbol is some constructor of a witnesstype. Eg. ProdFstW, InjRightW, SingletonW, etc. NOT the lifted versions like fst_ singleton_, which construct Terms. We had to wait until here to define this because it depends on Semigroup property of Specification, and Asserting equality

pairViewTerm (Prod a b) → Maybe (Term a, Term b) Source #

cartesian ∷ ∀ a b. (HasSpec a, HasSpec b) ⇒ Specification a → Specification b → Specification (Prod a b) Source #

data PairSpec a b Source #

Constructors

Cartesian (Specification a) (Specification b) 

Instances

Instances details
(Arbitrary (Specification a), Arbitrary (Specification b)) ⇒ Arbitrary (PairSpec a b) Source # 
Instance details

Defined in Constrained.Test

Methods

arbitraryGen (PairSpec a b) Source #

shrinkPairSpec a b → [PairSpec a b] Source #

(HasSpec a, HasSpec b) ⇒ Show (PairSpec a b) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

showsPrecIntPairSpec a b → ShowS #

showPairSpec a b → String #

showList ∷ [PairSpec a b] → ShowS #

data ProdW ∷ [Type] → TypeType where Source #

Constructors

ProdW ∷ (HasSpec a, HasSpec b) ⇒ ProdW '[a, b] (Prod a b) 
ProdFstW ∷ (HasSpec a, HasSpec b) ⇒ ProdW '[Prod a b] a 
ProdSndW ∷ (HasSpec a, HasSpec b) ⇒ ProdW '[Prod a b] b 

Instances

Instances details
Syntax ProdW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

isInfix ∷ ∀ (dom ∷ [Type]) rng. ProdW dom rng → Bool Source #

prettySymbol ∷ ∀ deps (dom ∷ [Type]) rng ann. ProdW dom rng → List (TermD deps) dom → IntMaybe (Doc ann) Source #

Logic ProdW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

propagateTypeSpec ∷ ∀ (as ∷ [Type]) b a. (AppRequires ProdW as b, HasSpec a) ⇒ ProdW as b → ListCtx Value as (HOLE a) → TypeSpec b → [b] → Specification a Source #

propagateMemberSpec ∷ ∀ (as ∷ [Type]) b a. (AppRequires ProdW as b, HasSpec a) ⇒ ProdW as b → ListCtx Value as (HOLE a) → NonEmpty b → Specification a Source #

propagate ∷ ∀ (as ∷ [Type]) b a. (AppRequires ProdW as b, HasSpec a) ⇒ ProdW as b → ListCtx Value as (HOLE a) → Specification b → Specification a Source #

rewriteRules ∷ ∀ (dom ∷ [Type]) rng. (TypeList dom, Typeable dom, HasSpec rng, All HasSpec dom) ⇒ ProdW dom rng → List Term dom → Evidence (AppRequires ProdW dom rng) → Maybe (Term rng) Source #

mapTypeSpec ∷ (HasSpec a, HasSpec b) ⇒ ProdW '[a] b → TypeSpec a → Specification b Source #

saturate ∷ ∀ (dom ∷ [Type]). ProdW dom BoolList Term dom → [Pred] Source #

Semantics ProdW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

semantics ∷ ∀ (d ∷ [Type]) r. ProdW d r → FunTy d r Source #

Show (ProdW as b) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

showsPrecIntProdW as b → ShowS #

showProdW as b → String #

showList ∷ [ProdW as b] → ShowS #

Eq (ProdW as b) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

(==)ProdW as b → ProdW as b → Bool #

(/=)ProdW as b → ProdW as b → Bool #

prodFst_ ∷ (HasSpec a, HasSpec b) ⇒ Term (Prod a b) → Term a Source #

prodSnd_ ∷ (HasSpec a, HasSpec b) ⇒ Term (Prod a b) → Term b Source #

sameFstEq a1 ⇒ a1 → [Prod a1 a2] → [a2] Source #

sameSndEq a1 ⇒ a1 → [Prod a2 a1] → [a2] Source #

prod_ ∷ (HasSpec a, HasSpec b) ⇒ Term a → Term b → Term (Prod a b) Source #

pattern Product ∷ ∀ c. () ⇒ ∀ a b. (c ~ Prod a b, AppRequires ProdW '[a, b] (Prod a b)) ⇒ Term a → Term b → Term c Source #

data ElemW ∷ [Type] → TypeType where Source #

Constructors

ElemWHasSpec a ⇒ ElemW '[a, [a]] Bool 

Instances

Instances details
Syntax ElemW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

isInfix ∷ ∀ (dom ∷ [Type]) rng. ElemW dom rng → Bool Source #

prettySymbol ∷ ∀ deps (dom ∷ [Type]) rng ann. ElemW dom rng → List (TermD deps) dom → IntMaybe (Doc ann) Source #

Logic ElemW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

propagateTypeSpec ∷ ∀ (as ∷ [Type]) b a. (AppRequires ElemW as b, HasSpec a) ⇒ ElemW as b → ListCtx Value as (HOLE a) → TypeSpec b → [b] → Specification a Source #

propagateMemberSpec ∷ ∀ (as ∷ [Type]) b a. (AppRequires ElemW as b, HasSpec a) ⇒ ElemW as b → ListCtx Value as (HOLE a) → NonEmpty b → Specification a Source #

propagate ∷ ∀ (as ∷ [Type]) b a. (AppRequires ElemW as b, HasSpec a) ⇒ ElemW as b → ListCtx Value as (HOLE a) → Specification b → Specification a Source #

rewriteRules ∷ ∀ (dom ∷ [Type]) rng. (TypeList dom, Typeable dom, HasSpec rng, All HasSpec dom) ⇒ ElemW dom rng → List Term dom → Evidence (AppRequires ElemW dom rng) → Maybe (Term rng) Source #

mapTypeSpec ∷ (HasSpec a, HasSpec b) ⇒ ElemW '[a] b → TypeSpec a → Specification b Source #

saturate ∷ ∀ (dom ∷ [Type]). ElemW dom BoolList Term dom → [Pred] Source #

Semantics ElemW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

semantics ∷ ∀ (d ∷ [Type]) r. ElemW d r → FunTy d r Source #

Show (ElemW dom rng) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

showsPrecIntElemW dom rng → ShowS #

showElemW dom rng → String #

showList ∷ [ElemW dom rng] → ShowS #

Eq (ElemW dom rng) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

(==)ElemW dom rng → ElemW dom rng → Bool #

(/=)ElemW dom rng → ElemW dom rng → Bool #

elem_ ∷ (Sized [a], HasSpec a) ⇒ Term a → Term [a] → Term Bool infix 4 Source #

elemFnHasSpec a ⇒ Fun '[a, [a]] Bool Source #

pattern Elem ∷ ∀ b. () ⇒ ∀ a. (b ~ Bool, Eq a, HasSpec a) ⇒ Term a → Term [a] → Term b Source #

data ListSpec a Source #

Instances

Instances details
(Arbitrary a, Arbitrary (FoldSpec a), Arbitrary (TypeSpec a), HasSpec a) ⇒ Arbitrary (ListSpec a) Source # 
Instance details

Defined in Constrained.Test

HasSpec a ⇒ Show (ListSpec a) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

showsPrecIntListSpec a → ShowS #

showListSpec a → String #

showList ∷ [ListSpec a] → ShowS #

HasSpec a ⇒ Pretty (WithPrec (ListSpec a)) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

prettyWithPrec (ListSpec a) → Doc ann Source #

prettyList ∷ [WithPrec (ListSpec a)] → Doc ann Source #

HasSpec a ⇒ Pretty (ListSpec a) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

prettyListSpec a → Doc ann Source #

prettyList ∷ [ListSpec a] → Doc ann Source #

sizeOf_ ∷ (HasSpec a, Sized a) ⇒ Term a → Term Integer Source #

genFromSizeSpecMonadGenError m ⇒ Specification IntegerGenT m Integer Source #

Because Sizes should always be >= 0, We provide this alternate generator that can be used to replace (genFromSpecT @Integer), to ensure this important property

data ListW (args ∷ [Type]) (res ∷ Type) where Source #

Constructors

FoldMapW ∷ ∀ a b. (Foldy b, HasSpec a) ⇒ Fun '[a] b → ListW '[[a]] b 
SingletonListWHasSpec a ⇒ ListW '[a] [a] 
AppendW ∷ (HasSpec a, Typeable a, Show a) ⇒ ListW '[[a], [a]] [a] 

Instances

Instances details
Syntax ListW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

isInfix ∷ ∀ (dom ∷ [Type]) rng. ListW dom rng → Bool Source #

prettySymbol ∷ ∀ deps (dom ∷ [Type]) rng ann. ListW dom rng → List (TermD deps) dom → IntMaybe (Doc ann) Source #

Logic ListW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

propagateTypeSpec ∷ ∀ (as ∷ [Type]) b a. (AppRequires ListW as b, HasSpec a) ⇒ ListW as b → ListCtx Value as (HOLE a) → TypeSpec b → [b] → Specification a Source #

propagateMemberSpec ∷ ∀ (as ∷ [Type]) b a. (AppRequires ListW as b, HasSpec a) ⇒ ListW as b → ListCtx Value as (HOLE a) → NonEmpty b → Specification a Source #

propagate ∷ ∀ (as ∷ [Type]) b a. (AppRequires ListW as b, HasSpec a) ⇒ ListW as b → ListCtx Value as (HOLE a) → Specification b → Specification a Source #

rewriteRules ∷ ∀ (dom ∷ [Type]) rng. (TypeList dom, Typeable dom, HasSpec rng, All HasSpec dom) ⇒ ListW dom rng → List Term dom → Evidence (AppRequires ListW dom rng) → Maybe (Term rng) Source #

mapTypeSpec ∷ (HasSpec a, HasSpec b) ⇒ ListW '[a] b → TypeSpec a → Specification b Source #

saturate ∷ ∀ (dom ∷ [Type]). ListW dom BoolList Term dom → [Pred] Source #

Semantics ListW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

semantics ∷ ∀ (d ∷ [Type]) r. ListW d r → FunTy d r Source #

Show (ListW d r) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

showsPrecIntListW d r → ShowS #

showListW d r → String #

showList ∷ [ListW d r] → ShowS #

Eq (ListW d r) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

(==)ListW d r → ListW d r → Bool #

(/=)ListW d r → ListW d r → Bool #

listSemListW dom rng → FunTy dom rng Source #

foldMap_ ∷ ∀ a b. (Foldy b, HasSpec a) ⇒ (Term a → Term b) → Term [a] → Term b Source #

sum_Foldy a ⇒ Term [a] → Term a Source #

singletonList_ ∷ (Sized [a], HasSpec a) ⇒ Term a → Term [a] Source #

append_ ∷ (Sized [a], HasSpec a) ⇒ Term [a] → Term [a] → Term [a] Source #

appendFn ∷ ∀ a. (Sized [a], HasSpec a) ⇒ Fun '[[a], [a]] [a] Source #

singletonListFn ∷ ∀ a. HasSpec a ⇒ Fun '[a] [a] Source #

foldMapFn ∷ ∀ a b. (HasSpec a, Foldy b) ⇒ Fun '[a] b → Fun '[[a]] b Source #

prefixedByEq a ⇒ [a] → [[a]] → [[a]] Source #

suffixedByEq a ⇒ [a] → [[a]] → [[a]] Source #

alreadyHaveEq a ⇒ [a] → ListSpec a → ListSpec a Source #

toPredsFoldSpecHasSpec a ⇒ Term [a] → FoldSpec a → Pred Source #

Used in the HasSpec [a] instance

data FoldSpec a where Source #

Constructors

NoFoldFoldSpec a 
FoldSpec ∷ ∀ b a. (HasSpec a, HasSpec b, Foldy b) ⇒ Fun '[a] b → Specification b → FoldSpec a 

Instances

Instances details
Arbitrary (FoldSpec (Map k v)) Source # 
Instance details

Defined in Constrained.Test

Methods

arbitraryGen (FoldSpec (Map k v)) Source #

shrinkFoldSpec (Map k v) → [FoldSpec (Map k v)] Source #

Arbitrary (FoldSpec (Set a)) Source # 
Instance details

Defined in Constrained.Test

Methods

arbitraryGen (FoldSpec (Set a)) Source #

shrinkFoldSpec (Set a) → [FoldSpec (Set a)] Source #

(HasSpec a, HasSpec b, Arbitrary (FoldSpec a), Arbitrary (FoldSpec b)) ⇒ Arbitrary (FoldSpec (a, b)) Source # 
Instance details

Defined in Constrained.Spec.SumProd

Methods

arbitraryGen (FoldSpec (a, b)) Source #

shrinkFoldSpec (a, b) → [FoldSpec (a, b)] Source #

(Arbitrary (Specification a), Foldy a) ⇒ Arbitrary (FoldSpec a) Source # 
Instance details

Defined in Constrained.Test

HasSpec a ⇒ Show (FoldSpec a) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

showsPrecIntFoldSpec a → ShowS #

showFoldSpec a → String #

showList ∷ [FoldSpec a] → ShowS #

HasSpec a ⇒ Pretty (WithPrec (FoldSpec a)) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

prettyWithPrec (FoldSpec a) → Doc ann Source #

prettyList ∷ [WithPrec (FoldSpec a)] → Doc ann Source #

HasSpec a ⇒ Pretty (FoldSpec a) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

prettyFoldSpec a → Doc ann Source #

prettyList ∷ [FoldSpec a] → Doc ann Source #

preMapFoldSpecHasSpec a ⇒ Fun '[a] b → FoldSpec b → FoldSpec a Source #

composeFn ∷ (HasSpec b, HasSpec c) ⇒ Fun '[b] c → Fun '[a] b → Fun '[a] c Source #

idFnHasSpec a ⇒ Fun '[a] a Source #

conformsToFoldSpec ∷ ∀ a. [a] → FoldSpec a → Bool Source #

class (HasSpec a, NumLike a, Logic IntW) ⇒ Foldy a where Source #

Minimal complete definition

genList, genSizedList, noNegativeValues

Instances

Instances details
Foldy Int16 Source # 
Instance details

Defined in Constrained.TheKnot

Foldy Int32 Source # 
Instance details

Defined in Constrained.TheKnot

Foldy Int64 Source # 
Instance details

Defined in Constrained.TheKnot

Foldy Int8 Source # 
Instance details

Defined in Constrained.TheKnot

Foldy Word16 Source # 
Instance details

Defined in Constrained.TheKnot

Foldy Word32 Source # 
Instance details

Defined in Constrained.TheKnot

Foldy Word64 Source # 
Instance details

Defined in Constrained.TheKnot

Foldy Word8 Source # 
Instance details

Defined in Constrained.TheKnot

Foldy Integer Source # 
Instance details

Defined in Constrained.TheKnot

Foldy Natural Source # 
Instance details

Defined in Constrained.TheKnot

Foldy Int Source # 
Instance details

Defined in Constrained.TheKnot

class Sized t where Source #

Minimal complete definition

Nothing

Instances

Instances details
Ord a ⇒ Sized (Set a) Source # 
Instance details

Defined in Constrained.Spec.Set

Sized [a] Source # 
Instance details

Defined in Constrained.TheKnot

Ord a ⇒ Sized (Map a b) Source # 
Instance details

Defined in Constrained.Spec.Map

addsFoldy a ⇒ [a] → a Source #

data FunW (dom ∷ [Type]) (rng ∷ Type) where Source #

Constructors

IdW ∷ ∀ a. FunW '[a] a 
ComposeW ∷ ∀ b t1 t2 a r. (AppRequires t1 '[b] r, AppRequires t2 '[a] b, HasSpec b) ⇒ t1 '[b] r → t2 '[a] b → FunW '[a] r 
FlipW ∷ ∀ t a b r. AppRequires t '[a, b] r ⇒ t '[a, b] r → FunW '[b, a] r 

Instances

Instances details
Syntax FunW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

isInfix ∷ ∀ (dom ∷ [Type]) rng. FunW dom rng → Bool Source #

prettySymbol ∷ ∀ deps (dom ∷ [Type]) rng ann. FunW dom rng → List (TermD deps) dom → IntMaybe (Doc ann) Source #

Logic FunW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

propagateTypeSpec ∷ ∀ (as ∷ [Type]) b a. (AppRequires FunW as b, HasSpec a) ⇒ FunW as b → ListCtx Value as (HOLE a) → TypeSpec b → [b] → Specification a Source #

propagateMemberSpec ∷ ∀ (as ∷ [Type]) b a. (AppRequires FunW as b, HasSpec a) ⇒ FunW as b → ListCtx Value as (HOLE a) → NonEmpty b → Specification a Source #

propagate ∷ ∀ (as ∷ [Type]) b a. (AppRequires FunW as b, HasSpec a) ⇒ FunW as b → ListCtx Value as (HOLE a) → Specification b → Specification a Source #

rewriteRules ∷ ∀ (dom ∷ [Type]) rng. (TypeList dom, Typeable dom, HasSpec rng, All HasSpec dom) ⇒ FunW dom rng → List Term dom → Evidence (AppRequires FunW dom rng) → Maybe (Term rng) Source #

mapTypeSpec ∷ (HasSpec a, HasSpec b) ⇒ FunW '[a] b → TypeSpec a → Specification b Source #

saturate ∷ ∀ (dom ∷ [Type]). FunW dom BoolList Term dom → [Pred] Source #

Semantics FunW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

semantics ∷ ∀ (d ∷ [Type]) r. FunW d r → FunTy d r Source #

Show (FunW dom rng) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

showsPrecIntFunW dom rng → ShowS #

showFunW dom rng → String #

showList ∷ [FunW dom rng] → ShowS #

Eq (FunW dom rng) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

(==)FunW dom rng → FunW dom rng → Bool #

(/=)FunW dom rng → FunW dom rng → Bool #

funSemFunW dom rng → FunTy dom rng Source #

compareWit ∷ ∀ t1 bs1 r1 t2 bs2 r2. (AppRequires t1 bs1 r1, AppRequires t2 bs2 r2) ⇒ t1 bs1 r1 → t2 bs2 r2 → Bool Source #

id_ ∷ ∀ a. HasSpec a ⇒ Term a → Term a Source #

flip_ ∷ ∀ (t ∷ [Type] → TypeType) a b r. (HasSpec b, HasSpec a, AppRequires t '[a, b] r) ⇒ t '[a, b] r → Term b → Term a → Term r Source #

compose_ ∷ ∀ b t1 t2 a r. (AppRequires t1 '[b] r, AppRequires t2 '[a] b) ⇒ t1 '[b] r → t2 '[a] b → Term a → Term r Source #

genInverse ∷ (MonadGenError m, HasSpec a, HasSpec b) ⇒ Fun '[a] b → Specification a → b → GenT m a Source #

genFromFold ∷ ∀ m a b. (MonadGenError m, Foldy b, HasSpec a) ⇒ [a] → Specification IntegerSpecification a → Fun '[a] b → Specification b → GenT m [a] Source #

addFunNumLike n ⇒ Fun '[n, n] n Source #

data SizeW (dom ∷ [Type]) rng ∷ Type where Source #

Constructors

SizeOfW ∷ (Sized n, HasSpec n) ⇒ SizeW '[n] Integer 

Instances

Instances details
Syntax SizeW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

isInfix ∷ ∀ (dom ∷ [Type]) rng. SizeW dom rng → Bool Source #

prettySymbol ∷ ∀ deps (dom ∷ [Type]) rng ann. SizeW dom rng → List (TermD deps) dom → IntMaybe (Doc ann) Source #

Logic SizeW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

propagateTypeSpec ∷ ∀ (as ∷ [Type]) b a. (AppRequires SizeW as b, HasSpec a) ⇒ SizeW as b → ListCtx Value as (HOLE a) → TypeSpec b → [b] → Specification a Source #

propagateMemberSpec ∷ ∀ (as ∷ [Type]) b a. (AppRequires SizeW as b, HasSpec a) ⇒ SizeW as b → ListCtx Value as (HOLE a) → NonEmpty b → Specification a Source #

propagate ∷ ∀ (as ∷ [Type]) b a. (AppRequires SizeW as b, HasSpec a) ⇒ SizeW as b → ListCtx Value as (HOLE a) → Specification b → Specification a Source #

rewriteRules ∷ ∀ (dom ∷ [Type]) rng. (TypeList dom, Typeable dom, HasSpec rng, All HasSpec dom) ⇒ SizeW dom rng → List Term dom → Evidence (AppRequires SizeW dom rng) → Maybe (Term rng) Source #

mapTypeSpec ∷ (HasSpec a, HasSpec b) ⇒ SizeW '[a] b → TypeSpec a → Specification b Source #

saturate ∷ ∀ (dom ∷ [Type]). SizeW dom BoolList Term dom → [Pred] Source #

Semantics SizeW Source # 
Instance details

Defined in Constrained.TheKnot

Methods

semantics ∷ ∀ (d ∷ [Type]) r. SizeW d r → FunTy d r Source #

Show (SizeW d r) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

showsPrecIntSizeW d r → ShowS #

showSizeW d r → String #

showList ∷ [SizeW d r] → ShowS #

Eq (SizeW ds r) Source # 
Instance details

Defined in Constrained.TheKnot

Methods

(==)SizeW ds r → SizeW ds r → Bool #

(/=)SizeW ds r → SizeW ds r → Bool #

sizeOfFn ∷ ∀ a. (HasSpec a, Sized a) ⇒ Fun '[a] Integer Source #

between ∷ (HasSpec a, TypeSpec a ~ NumSpec a) ⇒ a → a → Specification a Source #

maxSpecSpecification IntegerSpecification Integer Source #

The widest interval whose largest element is admitted by the original spec

Orphan instances

Numeric a ⇒ Complete a Source # 
Instance details

Methods

simplifyASpecification a → Specification a Source #

genFromSpecA ∷ ∀ (m ∷ TypeType). (HasCallStack, HasSpec a, MonadGenError m) ⇒ Specification a → GenT m a Source #

theAddAIntW '[a, a] a Source #

(Sized [a], HasSpec a) ⇒ HasGenHint [a] Source # 
Instance details

Associated Types

type Hint [a] Source #

Methods

giveHintHint [a] → Specification [a] Source #

(Sized [a], HasSpec a) ⇒ HasSpec [a] Source # 
Instance details

Associated Types

type TypeSpec [a] Source #

type Prerequisites [a] Source #

Forallable [a] a Source # 
Instance details

(HasSpec a, HasSpec b) ⇒ HasSpec (Prod a b) Source # 
Instance details

Associated Types

type TypeSpec (Prod a b) Source #

type Prerequisites (Prod a b) Source #