{-# OPTIONS_HADDOCK not-home #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeInType #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Generic.Random.Internal.Generic where
import Control.Applicative (Alternative(..), liftA2)
import Data.Coerce (Coercible, coerce)
import Data.Kind (Type)
import Data.Proxy (Proxy(..))
import Data.Type.Bool (type (&&))
import Data.Type.Equality (type (==))
import GHC.Generics hiding (S, prec)
import GHC.TypeLits (KnownNat, Nat, Symbol, type (+), natVal)
import Test.QuickCheck (Arbitrary(..), Gen, choose, scale, sized, vectorOf)
genericArbitrary
:: (GArbitrary UnsizedOpts a)
=> Weights a
-> Gen a
genericArbitrary :: Weights a -> Gen a
genericArbitrary = UnsizedOpts -> Weights a -> Gen a
forall opts a. GArbitrary opts a => opts -> Weights a -> Gen a
genericArbitraryWith UnsizedOpts
unsizedOpts
genericArbitraryU
:: (GArbitrary UnsizedOpts a, GUniformWeight a)
=> Gen a
genericArbitraryU :: Gen a
genericArbitraryU = Weights a -> Gen a
forall a. GArbitrary UnsizedOpts a => Weights a -> Gen a
genericArbitrary Weights a
forall a. UniformWeight_ (Rep a) => Weights a
uniform
genericArbitrarySingle
:: (GArbitrary UnsizedOpts a, Weights_ (Rep a) ~ L c0)
=> Gen a
genericArbitrarySingle :: Gen a
genericArbitrarySingle = Gen a
forall a. (GArbitrary UnsizedOpts a, GUniformWeight a) => Gen a
genericArbitraryU
genericArbitraryRec
:: (GArbitrary SizedOptsDef a)
=> Weights a
-> Gen a
genericArbitraryRec :: Weights a -> Gen a
genericArbitraryRec = SizedOptsDef -> Weights a -> Gen a
forall opts a. GArbitrary opts a => opts -> Weights a -> Gen a
genericArbitraryWith SizedOptsDef
sizedOptsDef
genericArbitraryG
:: (GArbitrary (SetGens genList UnsizedOpts) a)
=> genList
-> Weights a
-> Gen a
genericArbitraryG :: genList -> Weights a -> Gen a
genericArbitraryG genList
gs = Options 'INCOHERENT 'Unsized genList -> Weights a -> Gen a
forall opts a. GArbitrary opts a => opts -> Weights a -> Gen a
genericArbitraryWith Options 'INCOHERENT 'Unsized genList
opts
where
opts :: Options 'INCOHERENT 'Unsized genList
opts = genList -> UnsizedOpts -> Options 'INCOHERENT 'Unsized genList
forall genList (c :: Coherence) (s :: Sizing) g0.
genList -> Options c s g0 -> Options c s genList
setGenerators genList
gs UnsizedOpts
unsizedOpts
genericArbitraryUG
:: (GArbitrary (SetGens genList UnsizedOpts) a, GUniformWeight a)
=> genList
-> Gen a
genericArbitraryUG :: genList -> Gen a
genericArbitraryUG genList
gs = genList -> Weights a -> Gen a
forall genList a.
GArbitrary (SetGens genList UnsizedOpts) a =>
genList -> Weights a -> Gen a
genericArbitraryG genList
gs Weights a
forall a. UniformWeight_ (Rep a) => Weights a
uniform
genericArbitrarySingleG
:: (GArbitrary (SetGens genList UnsizedOpts) a, Weights_ (Rep a) ~ L c0)
=> genList
-> Gen a
genericArbitrarySingleG :: genList -> Gen a
genericArbitrarySingleG = genList -> Gen a
forall genList a.
(GArbitrary (SetGens genList UnsizedOpts) a, GUniformWeight a) =>
genList -> Gen a
genericArbitraryUG
genericArbitraryRecG
:: (GArbitrary (SetGens genList SizedOpts) a)
=> genList
-> Weights a
-> Gen a
genericArbitraryRecG :: genList -> Weights a -> Gen a
genericArbitraryRecG genList
gs = Options 'INCOHERENT 'Sized genList -> Weights a -> Gen a
forall opts a. GArbitrary opts a => opts -> Weights a -> Gen a
genericArbitraryWith Options 'INCOHERENT 'Sized genList
opts
where
opts :: Options 'INCOHERENT 'Sized genList
opts = genList
-> Options 'INCOHERENT 'Sized ()
-> Options 'INCOHERENT 'Sized genList
forall genList (c :: Coherence) (s :: Sizing) g0.
genList -> Options c s g0 -> Options c s genList
setGenerators genList
gs Options 'INCOHERENT 'Sized ()
sizedOpts
genericArbitraryWith
:: (GArbitrary opts a)
=> opts -> Weights a -> Gen a
genericArbitraryWith :: opts -> Weights a -> Gen a
genericArbitraryWith opts
opts (Weights Weights_ (Rep a)
w Int
n) =
(Rep a Any -> a) -> Gen (Rep a Any) -> Gen a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Rep a Any -> a
forall a x. Generic a => Rep a x -> a
to (opts -> Weights_ (Rep a) -> Int -> Gen (Rep a Any)
forall opts (f :: * -> *) p.
GA opts f =>
opts -> Weights_ f -> Int -> Gen (f p)
ga opts
opts Weights_ (Rep a)
w Int
n)
type family Weights_ (f :: Type -> Type) :: Type where
Weights_ (f :+: g) = Weights_ f :| Weights_ g
Weights_ (M1 D _c f) = Weights_ f
Weights_ (M1 C ('MetaCons c _i _j) _f) = L c
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 deriving Integer -> W c
W c -> W c
W c -> W c -> W c
(W c -> W c -> W c)
-> (W c -> W c -> W c)
-> (W c -> W c -> W c)
-> (W c -> W c)
-> (W c -> W c)
-> (W c -> W c)
-> (Integer -> W c)
-> Num (W c)
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
forall (c :: Symbol). Integer -> W c
forall (c :: Symbol). W c -> W c
forall (c :: Symbol). W c -> W c -> W c
fromInteger :: Integer -> W c
$cfromInteger :: forall (c :: Symbol). Integer -> W c
signum :: W c -> W c
$csignum :: forall (c :: Symbol). W c -> W c
abs :: W c -> W c
$cabs :: forall (c :: Symbol). W c -> W c
negate :: W c -> W c
$cnegate :: forall (c :: Symbol). W c -> W c
* :: W c -> W c -> W c
$c* :: forall (c :: Symbol). W c -> W c -> W c
- :: W c -> W c -> W c
$c- :: forall (c :: Symbol). W c -> W c -> W c
+ :: W c -> W c -> W c
$c+ :: forall (c :: Symbol). W c -> W c -> W c
Num
weights :: (Weights_ (Rep a), Int, ()) -> Weights a
weights :: (Weights_ (Rep a), Int, ()) -> Weights a
weights (Weights_ (Rep a)
w, Int
n, ()) = Weights_ (Rep a) -> Int -> Weights a
forall a. Weights_ (Rep a) -> Int -> Weights a
Weights Weights_ (Rep a)
w Int
n
uniform :: UniformWeight_ (Rep a) => Weights a
uniform :: Weights a
uniform =
let (Weights_ (Rep a)
w, Int
n) = (Weights_ (Rep a), Int)
forall a. UniformWeight a => (a, Int)
uniformWeight
in Weights_ (Rep a) -> Int -> Weights a
forall a. Weights_ (Rep a) -> Int -> Weights a
Weights Weights_ (Rep a)
w Int
n
type family First a :: Symbol where
First (a :| _b) = First a
First (L c) = c
type family First' w where
First' (Weights a) = First (Weights_ (Rep a))
First' (a, Int, r) = First a
type family Prec' w where
Prec' (Weights a) = Prec (Weights_ (Rep a)) ()
Prec' (a, Int, r) = Prec a r
class WeightBuilder' w where
(%) :: (c ~ First' w) => W c -> Prec' w -> w
instance WeightBuilder (Weights_ (Rep a)) => WeightBuilder' (Weights a) where
W c
w % :: W c -> Prec' (Weights a) -> Weights a
% Prec' (Weights a)
prec = (Weights_ (Rep a), Int, ()) -> Weights a
forall a. (Weights_ (Rep a), Int, ()) -> Weights a
weights (W c
w W c -> Prec (Weights_ (Rep a)) () -> (Weights_ (Rep a), Int, ())
forall a (c :: Symbol) r.
(WeightBuilder a, c ~ First a) =>
W c -> Prec a r -> (a, Int, r)
%. Prec (Weights_ (Rep a)) ()
Prec' (Weights a)
prec)
instance WeightBuilder a => WeightBuilder' (a, Int, r) where
% :: W c -> Prec' (a, Int, r) -> (a, Int, r)
(%) = W c -> Prec' (a, Int, r) -> (a, Int, r)
forall a (c :: Symbol) r.
(WeightBuilder a, c ~ First a) =>
W c -> Prec a r -> (a, Int, r)
(%.)
class WeightBuilder a where
type Prec a r
(%.) :: (c ~ First a) => W c -> Prec a r -> (a, Int, r)
infixr 1 %
instance WeightBuilder a => WeightBuilder (a :| b) where
type Prec (a :| b) r = Prec a (b, Int, r)
W c
m %. :: W c -> Prec (a :| b) r -> (a :| b, Int, r)
%. Prec (a :| b) r
prec =
let (a
a, Int
n, (b
b, Int
p, r
r)) = W c
m W c -> Prec' (a, Int, (b, Int, r)) -> (a, Int, (b, Int, r))
forall w (c :: Symbol).
(WeightBuilder' w, c ~ First' w) =>
W c -> Prec' w -> w
% Prec (a :| b) r
Prec' (a, Int, (b, Int, r))
prec
in (a -> Int -> b -> a :| b
forall a b. a -> Int -> b -> a :| b
N a
a Int
n b
b, Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
p, r
r)
instance WeightBuilder (L c) where
type Prec (L c) r = r
W Int
m %. :: W c -> Prec (L c) r -> (L c, Int, r)
%. Prec (L c) r
prec = (L c
forall (c :: Symbol). L c
L, Int
m, r
Prec (L c) r
prec)
instance WeightBuilder () where
type Prec () r = r
W Int
m %. :: W c -> Prec () r -> ((), Int, r)
%. Prec () r
prec = ((), Int
m, r
Prec () r
prec)
class UniformWeight a where
uniformWeight :: (a, Int)
instance (UniformWeight a, UniformWeight b) => UniformWeight (a :| b) where
uniformWeight :: (a :| b, Int)
uniformWeight =
let
(a
a, Int
m) = (a, Int)
forall a. UniformWeight a => (a, Int)
uniformWeight
(b
b, Int
n) = (b, Int)
forall a. UniformWeight a => (a, Int)
uniformWeight
in
(a -> Int -> b -> a :| b
forall a b. a -> Int -> b -> a :| b
N a
a Int
m b
b, Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n)
instance UniformWeight (L c) where
uniformWeight :: (L c, Int)
uniformWeight = (L c
forall (c :: Symbol). L c
L, Int
1)
instance UniformWeight () where
uniformWeight :: ((), Int)
uniformWeight = ((), Int
1)
class UniformWeight (Weights_ f) => UniformWeight_ f
instance UniformWeight (Weights_ f) => UniformWeight_ f
class UniformWeight_ (Rep a) => GUniformWeight a
instance UniformWeight_ (Rep a) => GUniformWeight a
newtype Options (c :: Coherence) (s :: Sizing) (genList :: Type) = Options
{ Options c s genList -> genList
_generators :: genList
}
type family SetOptions (x :: k) (o :: Type) :: Type
type instance SetOptions (s :: Sizing) (Options c _s g) = Options c s g
type instance SetOptions (c :: Coherence) (Options _c s g) = Options c s g
type instance SetOptions (g :: Type) (Options c s _g) = Options c s g
type (<+) o x = SetOptions x o
infixl 1 <+
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
setOpts :: o -> SetOptions x o
setOpts = o -> SetOptions x o
coerce
unsizedOpts :: UnsizedOpts
unsizedOpts :: UnsizedOpts
unsizedOpts = () -> UnsizedOpts
forall (c :: Coherence) (s :: Sizing) genList.
genList -> Options c s genList
Options ()
sizedOpts :: SizedOpts
sizedOpts :: Options 'INCOHERENT 'Sized ()
sizedOpts = () -> Options 'INCOHERENT 'Sized ()
forall (c :: Coherence) (s :: Sizing) genList.
genList -> Options c s genList
Options ()
sizedOptsDef :: SizedOptsDef
sizedOptsDef :: SizedOptsDef
sizedOptsDef = (Gen1 [] :+ ()) -> SizedOptsDef
forall (c :: Coherence) (s :: Sizing) genList.
genList -> Options c s genList
Options ((forall a. Gen a -> Gen [a]) -> Gen1 []
forall (f :: * -> *). (forall a. Gen a -> Gen (f a)) -> Gen1 f
Gen1 forall a. Gen a -> Gen [a]
listOf' Gen1 [] -> () -> Gen1 [] :+ ()
forall a b. a -> b -> a :+ b
:+ ())
cohUnsizedOpts :: CohUnsizedOpts
cohUnsizedOpts :: CohUnsizedOpts
cohUnsizedOpts = () -> CohUnsizedOpts
forall (c :: Coherence) (s :: Sizing) genList.
genList -> Options c s genList
Options ()
cohSizedOpts :: CohSizedOpts
cohSizedOpts :: CohSizedOpts
cohSizedOpts = () -> CohSizedOpts
forall (c :: Coherence) (s :: Sizing) genList.
genList -> Options c s genList
Options ()
data Sizing
= Sized
| Unsized
type family SizingOf opts :: Sizing
type instance SizingOf (Options _c s _g) = s
type family SetSized (o :: Type) :: Type
type instance SetSized (Options c s g) = Options c 'Sized g
type family SetUnsized (o :: Type) :: Type
type instance SetUnsized (Options c s g) = Options c 'Unsized g
setSized :: Options c s g -> Options c 'Sized g
setSized :: Options c s g -> Options c 'Sized g
setSized = Options c s g -> Options c 'Sized g
coerce
setUnsized :: Options c s g -> Options c 'Unsized g
setUnsized :: Options c s g -> Options c 'Unsized g
setUnsized = Options c s g -> Options c 'Unsized g
coerce
data Coherence
= INCOHERENT
| COHERENT
type family CoherenceOf (o :: Type) :: Coherence
type instance CoherenceOf (Options c _s _g) = c
newtype Incoherent g = Incoherent g
data a :+ b = a :+ b
infixr 1 :+
type family GeneratorsOf opts :: Type
type instance GeneratorsOf (Options _c _s g) = g
class HasGenerators opts where
generators :: opts -> GeneratorsOf opts
instance HasGenerators (Options c s g) where
generators :: Options c s g -> GeneratorsOf (Options c s g)
generators = Options c s g -> GeneratorsOf (Options c s g)
forall (c :: Coherence) (s :: Sizing) genList.
Options c s genList -> genList
_generators
setGenerators :: genList -> Options c s g0 -> Options c s genList
setGenerators :: genList -> Options c s g0 -> Options c s genList
setGenerators genList
gens (Options g0
_) = genList -> Options c s genList
forall (c :: Coherence) (s :: Sizing) genList.
genList -> Options c s genList
Options genList
gens
type family SetGens (g :: Type) opts
type instance SetGens g (Options c s _g) = Options c s g
newtype FieldGen (s :: Symbol) a = FieldGen { FieldGen s a -> Gen a
unFieldGen :: Gen a }
fieldGen :: proxy s -> Gen a -> FieldGen s a
fieldGen :: proxy s -> Gen a -> FieldGen s a
fieldGen proxy s
_ = Gen a -> FieldGen s a
forall (s :: Symbol) a. Gen a -> FieldGen s a
FieldGen
newtype ConstrGen (c :: Symbol) (i :: Nat) a = ConstrGen { ConstrGen c i a -> Gen a
unConstrGen :: Gen a }
constrGen :: proxy '(c, i) -> Gen a -> ConstrGen c i a
constrGen :: proxy '(c, i) -> Gen a -> ConstrGen c i a
constrGen proxy '(c, i)
_ = Gen a -> ConstrGen c i a
forall (c :: Symbol) (i :: Nat) a. Gen a -> ConstrGen c i a
ConstrGen
newtype Gen1 f = Gen1 { Gen1 f -> forall a. Gen a -> Gen (f a)
unGen1 :: forall a. Gen a -> Gen (f a) }
newtype Gen1_ f = Gen1_ { Gen1_ f -> forall (a :: k). Gen (f a)
unGen1_ :: forall a. Gen (f a) }
vectorOf' :: Int -> Gen a -> Gen [a]
vectorOf' :: Int -> Gen a -> Gen [a]
vectorOf' Int
0 = \Gen a
_ -> [a] -> Gen [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
vectorOf' Int
i = (Int -> Int) -> Gen [a] -> Gen [a]
forall a. (Int -> Int) -> Gen a -> Gen a
scale (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
i) (Gen [a] -> Gen [a]) -> (Gen a -> Gen [a]) -> Gen a -> Gen [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Gen a -> Gen [a]
forall a. Int -> Gen a -> Gen [a]
vectorOf Int
i
listOf' :: Gen a -> Gen [a]
listOf' :: Gen a -> Gen [a]
listOf' Gen a
g = (Int -> Gen [a]) -> Gen [a]
forall a. (Int -> Gen a) -> Gen a
sized ((Int -> Gen [a]) -> Gen [a]) -> (Int -> Gen [a]) -> Gen [a]
forall a b. (a -> b) -> a -> b
$ \Int
n -> do
Int
i <- Int -> Gen Int
geom Int
n
Int -> Gen a -> Gen [a]
forall a. Int -> Gen a -> Gen [a]
vectorOf' Int
i Gen a
g
listOf1' :: Gen a -> Gen [a]
listOf1' :: Gen a -> Gen [a]
listOf1' Gen a
g = (a -> [a] -> [a]) -> Gen a -> Gen [a] -> Gen [a]
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (:) Gen a
g (Gen a -> Gen [a]
forall a. Gen a -> Gen [a]
listOf' Gen a
g)
geom :: Int -> Gen Int
geom :: Int -> Gen Int
geom Int
0 = Int -> Gen Int
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
0
geom Int
n = Int -> Gen Int
go Int
0 where
n' :: Double
n' = Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n
p :: Double
p = Double
1 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ (Double -> Double
forall a. Floating a => a -> a
sqrt Double
n' Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
1) :: Double
go :: Int -> Gen Int
go Int
r = do
Double
x <- (Double, Double) -> Gen Double
forall a. Random a => (a, a) -> Gen a
choose (Double
0, Double
1)
if Double
x Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Double
p then
Int -> Gen Int
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
r
else
Int -> Gen Int
go (Int -> Gen Int) -> Int -> Gen Int
forall a b. (a -> b) -> a -> b
$! (Int
r Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
class GA opts f where
ga :: opts -> Weights_ f -> Int -> Gen (f p)
class (Generic a, GA opts (Rep a)) => GArbitrary opts a
instance (Generic a, GA opts (Rep a)) => GArbitrary opts a
instance GA opts f => GA opts (M1 D c f) where
ga :: opts -> Weights_ (M1 D c f) -> Int -> Gen (M1 D c f p)
ga opts
z Weights_ (M1 D c f)
w Int
n = (f p -> M1 D c f p) -> Gen (f p) -> Gen (M1 D c f p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap f p -> M1 D c f p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (opts -> Weights_ f -> Int -> Gen (f p)
forall opts (f :: * -> *) p.
GA opts f =>
opts -> Weights_ f -> Int -> Gen (f p)
ga opts
z Weights_ f
Weights_ (M1 D c f)
w Int
n)
{-# INLINE ga #-}
instance (GASum opts f, GASum opts g) => GA opts (f :+: g) where
ga :: opts -> Weights_ (f :+: g) -> Int -> Gen ((:+:) f g p)
ga = opts -> Weights_ (f :+: g) -> Int -> Gen ((:+:) f g p)
forall opts (f :: * -> *) p.
GASum opts f =>
opts -> Weights_ f -> Int -> Gen (f p)
gaSum'
{-# INLINE ga #-}
instance GAProduct (SizingOf opts) (Name c) opts f => GA opts (M1 C c f) where
ga :: opts -> Weights_ (M1 C c f) -> Int -> Gen (M1 C c f p)
ga opts
z Weights_ (M1 C c f)
_ Int
_ = (f p -> M1 C c f p) -> Gen (f p) -> Gen (M1 C c f p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap f p -> M1 C c f p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (Proxy '(SizingOf opts, Name c) -> opts -> Gen (f p)
forall k (s :: Sizing) (c :: Maybe Symbol) opts (f :: k -> *)
(proxys :: (Sizing, Maybe Symbol) -> *) (p :: k).
GAProduct s c opts f =>
proxys '(s, c) -> opts -> Gen (f p)
gaProduct (Proxy '(SizingOf opts, Name c)
forall k (t :: k). Proxy t
Proxy :: Proxy '(SizingOf opts, Name c)) opts
z)
{-# INLINE ga #-}
gaSum' :: GASum opts f => opts -> Weights_ f -> Int -> Gen (f p)
gaSum' :: opts -> Weights_ f -> Int -> Gen (f p)
gaSum' opts
z Weights_ f
w Int
n = do
Int
i <- (Int, Int) -> Gen Int
forall a. Random a => (a, a) -> Gen a
choose (Int
0, Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)
opts -> Int -> Weights_ f -> Gen (f p)
forall opts (f :: * -> *) p.
GASum opts f =>
opts -> Int -> Weights_ f -> Gen (f p)
gaSum opts
z Int
i Weights_ f
w
{-# INLINE gaSum' #-}
class GASum opts f where
gaSum :: opts -> Int -> Weights_ f -> Gen (f p)
instance (GASum opts f, GASum opts g) => GASum opts (f :+: g) where
gaSum :: opts -> Int -> Weights_ (f :+: g) -> Gen ((:+:) f g p)
gaSum opts
z Int
i (N a n b)
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n = (f p -> (:+:) f g p) -> Gen (f p) -> Gen ((:+:) f g p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap f p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1 (opts -> Int -> Weights_ f -> Gen (f p)
forall opts (f :: * -> *) p.
GASum opts f =>
opts -> Int -> Weights_ f -> Gen (f p)
gaSum opts
z Int
i Weights_ f
a)
| Bool
otherwise = (g p -> (:+:) f g p) -> Gen (g p) -> Gen ((:+:) f g p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap g p -> (:+:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1 (opts -> Int -> Weights_ g -> Gen (g p)
forall opts (f :: * -> *) p.
GASum opts f =>
opts -> Int -> Weights_ f -> Gen (f p)
gaSum opts
z (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n) Weights_ g
b)
{-# INLINE gaSum #-}
instance GAProduct (SizingOf opts) (Name c) opts f => GASum opts (M1 C c f) where
gaSum :: opts -> Int -> Weights_ (M1 C c f) -> Gen (M1 C c f p)
gaSum opts
z Int
_ Weights_ (M1 C c f)
_ = (f p -> M1 C c f p) -> Gen (f p) -> Gen (M1 C c f p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap f p -> M1 C c f p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (Proxy '(SizingOf opts, Name c) -> opts -> Gen (f p)
forall k (s :: Sizing) (c :: Maybe Symbol) opts (f :: k -> *)
(proxys :: (Sizing, Maybe Symbol) -> *) (p :: k).
GAProduct s c opts f =>
proxys '(s, c) -> opts -> Gen (f p)
gaProduct (Proxy '(SizingOf opts, Name c)
forall k (t :: k). Proxy t
Proxy :: Proxy '(SizingOf opts, Name c)) opts
z)
{-# INLINE gaSum #-}
class GAProduct (s :: Sizing) (c :: Maybe Symbol) opts f where
gaProduct :: proxys '(s, c) -> opts -> Gen (f p)
instance GAProduct' c 0 opts f => GAProduct 'Unsized c opts f where
gaProduct :: proxys '( 'Unsized, c) -> opts -> Gen (f p)
gaProduct proxys '( 'Unsized, c)
_ = Proxy '(c, 0) -> opts -> Gen (f p)
forall k (c :: Maybe Symbol) (i :: Nat) opts (f :: k -> *)
(proxy :: (Maybe Symbol, Nat) -> *) (p :: k).
GAProduct' c i opts f =>
proxy '(c, i) -> opts -> Gen (f p)
gaProduct' (Proxy '(c, 0)
forall k (t :: k). Proxy t
Proxy :: Proxy '(c, 0))
{-# INLINE gaProduct #-}
instance {-# OVERLAPPING #-} GAProduct' c 0 opts (S1 d f)
=> GAProduct 'Sized c opts (S1 d f) where
gaProduct :: proxys '( 'Sized, c) -> opts -> Gen (S1 d f p)
gaProduct proxys '( 'Sized, c)
_ = (Int -> Int) -> Gen (S1 d f p) -> Gen (S1 d f p)
forall a. (Int -> Int) -> Gen a -> Gen a
scale (\Int
n -> Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)) (Gen (S1 d f p) -> Gen (S1 d f p))
-> (opts -> Gen (S1 d f p)) -> opts -> Gen (S1 d f p)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Proxy '(c, 0) -> opts -> Gen (S1 d f p)
forall k (c :: Maybe Symbol) (i :: Nat) opts (f :: k -> *)
(proxy :: (Maybe Symbol, Nat) -> *) (p :: k).
GAProduct' c i opts f =>
proxy '(c, i) -> opts -> Gen (f p)
gaProduct' (Proxy '(c, 0)
forall k (t :: k). Proxy t
Proxy :: Proxy '(c, 0))
instance (GAProduct' c 0 opts f, KnownNat (Arity f)) => GAProduct 'Sized c opts f where
gaProduct :: proxys '( 'Sized, c) -> opts -> Gen (f p)
gaProduct proxys '( 'Sized, c)
_ = (Int -> Int) -> Gen (f p) -> Gen (f p)
forall a. (Int -> Int) -> Gen a -> Gen a
scale (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
arity) (Gen (f p) -> Gen (f p))
-> (opts -> Gen (f p)) -> opts -> Gen (f p)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Proxy '(c, 0) -> opts -> Gen (f p)
forall k (c :: Maybe Symbol) (i :: Nat) opts (f :: k -> *)
(proxy :: (Maybe Symbol, Nat) -> *) (p :: k).
GAProduct' c i opts f =>
proxy '(c, i) -> opts -> Gen (f p)
gaProduct' (Proxy '(c, 0)
forall k (t :: k). Proxy t
Proxy :: Proxy '(c, 0))
where
arity :: Int
arity = Integer -> Int
forall a. Num a => Integer -> a
fromInteger (Proxy (Arity f) -> Integer
forall (n :: Nat) (proxy :: Nat -> *).
KnownNat n =>
proxy n -> Integer
natVal (Proxy (Arity f)
forall k (t :: k). Proxy t
Proxy :: Proxy (Arity f)))
{-# INLINE gaProduct #-}
instance {-# OVERLAPPING #-} GAProduct 'Sized c opts U1 where
gaProduct :: proxys '( 'Sized, c) -> opts -> Gen (U1 p)
gaProduct proxys '( 'Sized, c)
_ opts
_ = U1 p -> Gen (U1 p)
forall (f :: * -> *) a. Applicative f => a -> f a
pure U1 p
forall k (p :: k). U1 p
U1
{-# INLINE gaProduct #-}
class GAProduct' (c :: Maybe Symbol) (i :: Nat) opts f where
gaProduct' :: proxy '(c, i) -> opts -> Gen (f p)
instance GAProduct' c i opts U1 where
gaProduct' :: proxy '(c, i) -> opts -> Gen (U1 p)
gaProduct' proxy '(c, i)
_ opts
_ = U1 p -> Gen (U1 p)
forall (f :: * -> *) a. Applicative f => a -> f a
pure U1 p
forall k (p :: k). U1 p
U1
{-# INLINE gaProduct' #-}
instance
( 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)) where
gaProduct' :: proxy '(c, i) -> opts -> Gen (S1 d (K1 _k a) p)
gaProduct' proxy '(c, i)
_ opts
opts = (a -> S1 d (K1 _k a) p) -> Gen a -> Gen (S1 d (K1 _k a) p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (K1 _k a p -> S1 d (K1 _k a) p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (K1 _k a p -> S1 d (K1 _k a) p)
-> (a -> K1 _k a p) -> a -> S1 d (K1 _k a) p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> K1 _k a p
forall k i c (p :: k). c -> K1 i c p
K1) ((Proxy 'Shift, Proxy ('S gs coh '(c, i, Name d)),
FullGenListOf ('S gs coh '(c, i, Name d)))
-> () -> gs -> Gen a
forall (i :: AInstr) (s :: AStore) g gs a.
FindGen i s g gs a =>
(Proxy i, Proxy s, FullGenListOf s) -> g -> gs -> Gen a
findGen (Proxy 'Shift
is, Proxy ('S gs coh '(c, i, Name d))
s, FullGenListOf ('S gs coh '(c, i, Name d))
GeneratorsOf opts
gs) () gs
GeneratorsOf opts
gs)
where
is :: Proxy 'Shift
is = Proxy 'Shift
forall k (t :: k). Proxy t
Proxy :: Proxy 'Shift
s :: Proxy ('S gs coh '(c, i, Name d))
s = Proxy ('S gs coh '(c, i, Name d))
forall k (t :: k). Proxy t
Proxy :: Proxy ('S gs coh '(c, i, Name d))
gs :: GeneratorsOf opts
gs = opts -> GeneratorsOf opts
forall opts. HasGenerators opts => opts -> GeneratorsOf opts
generators opts
opts
{-# INLINE gaProduct' #-}
instance (GAProduct' c i opts f, GAProduct' c (i + Arity f) opts g) => GAProduct' c i opts (f :*: g) where
gaProduct' :: proxy '(c, i) -> opts -> Gen ((:*:) f g p)
gaProduct' proxy '(c, i)
px = ((Gen (f p) -> Gen (g p) -> Gen ((:*:) f g p))
-> (opts -> Gen (f p))
-> (opts -> Gen (g p))
-> opts
-> Gen ((:*:) f g p)
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 ((Gen (f p) -> Gen (g p) -> Gen ((:*:) f g p))
-> (opts -> Gen (f p))
-> (opts -> Gen (g p))
-> opts
-> Gen ((:*:) f g p))
-> ((f p -> g p -> (:*:) f g p)
-> Gen (f p) -> Gen (g p) -> Gen ((:*:) f g p))
-> (f p -> g p -> (:*:) f g p)
-> (opts -> Gen (f p))
-> (opts -> Gen (g p))
-> opts
-> Gen ((:*:) f g p)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (f p -> g p -> (:*:) f g p)
-> Gen (f p) -> Gen (g p) -> Gen ((:*:) f g p)
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2) f p -> g p -> (:*:) f g p
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
(:*:)
(proxy '(c, i) -> opts -> Gen (f p)
forall k (c :: Maybe Symbol) (i :: Nat) opts (f :: k -> *)
(proxy :: (Maybe Symbol, Nat) -> *) (p :: k).
GAProduct' c i opts f =>
proxy '(c, i) -> opts -> Gen (f p)
gaProduct' proxy '(c, i)
px)
(Proxy '(c, i + Arity f) -> opts -> Gen (g p)
forall k (c :: Maybe Symbol) (i :: Nat) opts (f :: k -> *)
(proxy :: (Maybe Symbol, Nat) -> *) (p :: k).
GAProduct' c i opts f =>
proxy '(c, i) -> opts -> Gen (f p)
gaProduct' (Proxy '(c, i + Arity f)
forall k (t :: k). Proxy t
Proxy :: Proxy '(c, i + Arity f)))
{-# INLINE gaProduct' #-}
type family Arity f :: Nat where
Arity (f :*: g) = Arity f + Arity g
Arity (M1 _i _c _f) = 1
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 = Shift | Match Coherence | MatchCoh Bool
data AStore = S Type Coherence ASel
type ASel = (Maybe Symbol, Nat, Maybe Symbol)
iShift :: Proxy 'Shift
iShift :: Proxy 'Shift
iShift = Proxy 'Shift
forall k (t :: k). Proxy t
Proxy
type family FullGenListOf (s :: AStore) :: Type where
FullGenListOf ('S fg _coh _sel) = fg
type family ACoherenceOf (s :: AStore) :: Coherence where
ACoherenceOf ('S _fg coh _sel) = coh
type family ASelOf (s :: AStore) :: ASel where
ASelOf ('S _fg _coh sel) = sel
instance Arbitrary a => FindGen 'Shift s () () a where
findGen :: (Proxy 'Shift, Proxy s, FullGenListOf s) -> () -> () -> Gen a
findGen (Proxy 'Shift, Proxy s, FullGenListOf s)
_ ()
_ ()
_ = Gen a
forall a. Arbitrary a => Gen a
arbitrary
{-# INLINEABLE findGen #-}
instance FindGen 'Shift s b g a => FindGen 'Shift s () (b :+ g) a where
findGen :: (Proxy 'Shift, Proxy s, FullGenListOf s) -> () -> (b :+ g) -> Gen a
findGen (Proxy 'Shift, Proxy s, FullGenListOf s)
p () (b
b :+ g
gens) = (Proxy 'Shift, Proxy s, FullGenListOf s) -> b -> g -> Gen a
forall (i :: AInstr) (s :: AStore) g gs a.
FindGen i s g gs a =>
(Proxy i, Proxy s, FullGenListOf s) -> g -> gs -> Gen a
findGen (Proxy 'Shift, Proxy s, FullGenListOf s)
p b
b g
gens
{-# INLINEABLE findGen #-}
instance {-# OVERLAPS #-} FindGen 'Shift s g () a => FindGen 'Shift s () g a where
findGen :: (Proxy 'Shift, Proxy s, FullGenListOf s) -> () -> g -> Gen a
findGen (Proxy 'Shift, Proxy s, FullGenListOf s)
p () g
g = (Proxy 'Shift, Proxy s, FullGenListOf s) -> g -> () -> Gen a
forall (i :: AInstr) (s :: AStore) g gs a.
FindGen i s g gs a =>
(Proxy i, Proxy s, FullGenListOf s) -> g -> gs -> Gen a
findGen (Proxy 'Shift, Proxy s, FullGenListOf s)
p g
g ()
instance FindGen 'Shift s g (h :+ gs) a => FindGen 'Shift s (g :+ h) gs a where
findGen :: (Proxy 'Shift, Proxy s, FullGenListOf s) -> (g :+ h) -> gs -> Gen a
findGen (Proxy 'Shift, Proxy s, FullGenListOf s)
p (g
g :+ h
h) gs
gs = (Proxy 'Shift, Proxy s, FullGenListOf s) -> g -> (h :+ gs) -> Gen a
forall (i :: AInstr) (s :: AStore) g gs a.
FindGen i s g gs a =>
(Proxy i, Proxy s, FullGenListOf s) -> g -> gs -> Gen a
findGen (Proxy 'Shift, Proxy s, FullGenListOf s)
p g
g (h
h h -> gs -> h :+ gs
forall a b. a -> b -> a :+ b
:+ gs
gs)
instance FindGen ('Match 'INCOHERENT) s g gs a => FindGen 'Shift s (Incoherent g) gs a where
findGen :: (Proxy 'Shift, Proxy s, FullGenListOf s)
-> Incoherent g -> gs -> Gen a
findGen (Proxy 'Shift
_, Proxy s
s, FullGenListOf s
fg) (Incoherent g
g) = (Proxy ('Match 'INCOHERENT), Proxy s, FullGenListOf s)
-> g -> gs -> Gen a
forall (i :: AInstr) (s :: AStore) g gs a.
FindGen i s g gs a =>
(Proxy i, Proxy s, FullGenListOf s) -> g -> gs -> Gen a
findGen (Proxy ('Match 'INCOHERENT)
im, Proxy s
s, FullGenListOf s
fg) g
g where
im :: Proxy ('Match 'INCOHERENT)
im = Proxy ('Match 'INCOHERENT)
forall k (t :: k). Proxy t
Proxy :: Proxy ('Match 'INCOHERENT)
instance {-# OVERLAPPABLE #-} FindGen ('Match (ACoherenceOf s)) s g gs a
=> FindGen 'Shift s g gs a where
findGen :: (Proxy 'Shift, Proxy s, FullGenListOf s) -> g -> gs -> Gen a
findGen (Proxy 'Shift
_, Proxy s
s, FullGenListOf s
fg) = (Proxy ('Match (ACoherenceOf s)), Proxy s, FullGenListOf s)
-> g -> gs -> Gen a
forall (i :: AInstr) (s :: AStore) g gs a.
FindGen i s g gs a =>
(Proxy i, Proxy s, FullGenListOf s) -> g -> gs -> Gen a
findGen (Proxy ('Match (ACoherenceOf s))
im, Proxy s
s, FullGenListOf s
fg) where
im :: Proxy ('Match (ACoherenceOf s))
im = Proxy ('Match (ACoherenceOf s))
forall k (t :: k). Proxy t
Proxy :: Proxy ('Match (ACoherenceOf s))
instance FindGen 'Shift s () gs a
=> FindGen ('Match 'INCOHERENT) s _g gs a where
findGen :: (Proxy ('Match 'INCOHERENT), Proxy s, FullGenListOf s)
-> _g -> gs -> Gen a
findGen (Proxy ('Match 'INCOHERENT)
_, Proxy s
s, FullGenListOf s
fg) _g
_ = (Proxy 'Shift, Proxy s, FullGenListOf s) -> () -> gs -> Gen a
forall (i :: AInstr) (s :: AStore) g gs a.
FindGen i s g gs a =>
(Proxy i, Proxy s, FullGenListOf s) -> g -> gs -> Gen a
findGen (Proxy 'Shift
iShift, Proxy s
s, FullGenListOf s
fg) () where
instance {-# INCOHERENT #-} FindGen ('Match 'INCOHERENT) s (Gen a) gs a where
findGen :: (Proxy ('Match 'INCOHERENT), Proxy s, FullGenListOf s)
-> Gen a -> gs -> Gen a
findGen (Proxy ('Match 'INCOHERENT), Proxy s, FullGenListOf s)
_ Gen a
gen gs
_ = Gen a
gen
{-# INLINEABLE findGen #-}
instance {-# INCOHERENT #-} FindGen ('Match 'INCOHERENT) s (Gen1_ f) gs (f a) where
findGen :: (Proxy ('Match 'INCOHERENT), Proxy s, FullGenListOf s)
-> Gen1_ f -> gs -> Gen (f a)
findGen (Proxy ('Match 'INCOHERENT), Proxy s, FullGenListOf s)
_ (Gen1_ forall (a :: k). Gen (f a)
gen) gs
_ = Gen (f a)
forall (a :: k). Gen (f a)
gen
instance {-# INCOHERENT #-} FindGen 'Shift ('S fg coh DummySel) () fg a
=> FindGen ('Match 'INCOHERENT) ('S fg coh _sel) (Gen1 f) gs (f a) where
findGen :: (Proxy ('Match 'INCOHERENT), Proxy ('S fg coh _sel),
FullGenListOf ('S fg coh _sel))
-> Gen1 f -> gs -> Gen (f a)
findGen (Proxy ('Match 'INCOHERENT)
_, Proxy ('S fg coh _sel)
_, FullGenListOf ('S fg coh _sel)
fg) (Gen1 forall a. Gen a -> Gen (f a)
gen) gs
_ = Gen a -> Gen (f a)
forall a. Gen a -> Gen (f a)
gen ((Proxy 'Shift, Proxy ('S fg coh DummySel),
FullGenListOf ('S fg coh DummySel))
-> () -> fg -> Gen a
forall (i :: AInstr) (s :: AStore) g gs a.
FindGen i s g gs a =>
(Proxy i, Proxy s, FullGenListOf s) -> g -> gs -> Gen a
findGen (Proxy 'Shift
iShift, Proxy ('S fg coh DummySel)
s, FullGenListOf ('S fg coh _sel)
FullGenListOf ('S fg coh DummySel)
fg) () fg
FullGenListOf ('S fg coh _sel)
fg) where
s :: Proxy ('S fg coh DummySel)
s = Proxy ('S fg coh DummySel)
forall k (t :: k). Proxy t
Proxy :: Proxy ('S fg coh DummySel)
type DummySel = '( 'Nothing, 0, 'Nothing)
instance {-# INCOHERENT #-} (a ~ a')
=> FindGen ('Match 'INCOHERENT) ('S _fg _coh '(con, i, 'Just s)) (FieldGen s a) gs a' where
findGen :: (Proxy ('Match 'INCOHERENT),
Proxy ('S _fg _coh '(con, i, 'Just s)),
FullGenListOf ('S _fg _coh '(con, i, 'Just s)))
-> FieldGen s a -> gs -> Gen a'
findGen (Proxy ('Match 'INCOHERENT),
Proxy ('S _fg _coh '(con, i, 'Just s)),
FullGenListOf ('S _fg _coh '(con, i, 'Just s)))
_ (FieldGen Gen a
gen) gs
_ = Gen a
Gen a'
gen
{-# INLINEABLE findGen #-}
instance {-# INCOHERENT #-} (a ~ a')
=> FindGen ('Match 'INCOHERENT) ('S _fg _coh '( 'Just c, i, s)) (ConstrGen c i a) gs a' where
findGen :: (Proxy ('Match 'INCOHERENT), Proxy ('S _fg _coh '( 'Just c, i, s)),
FullGenListOf ('S _fg _coh '( 'Just c, i, s)))
-> ConstrGen c i a -> gs -> Gen a'
findGen (Proxy ('Match 'INCOHERENT), Proxy ('S _fg _coh '( 'Just c, i, s)),
FullGenListOf ('S _fg _coh '( 'Just c, i, s)))
_ (ConstrGen Gen a
gen) gs
_ = Gen a
Gen a'
gen
{-# INLINEABLE findGen #-}
type family Name (d :: Meta) :: Maybe Symbol
type instance Name ('MetaSel mn su ss ds) = mn
type instance Name ('MetaCons n _f _s) = 'Just n
instance FindGen ('MatchCoh (Matches (ASelOf s) g a)) s g gs a
=> FindGen ('Match 'COHERENT) s g gs a where
findGen :: (Proxy ('Match 'COHERENT), Proxy s, FullGenListOf s)
-> g -> gs -> Gen a
findGen (Proxy ('Match 'COHERENT)
_, Proxy s
s, FullGenListOf s
fg) = (Proxy ('MatchCoh (Matches (ASelOf s) g a)), Proxy s,
FullGenListOf s)
-> g -> gs -> Gen a
forall (i :: AInstr) (s :: AStore) g gs a.
FindGen i s g gs a =>
(Proxy i, Proxy s, FullGenListOf s) -> g -> gs -> Gen a
findGen (Proxy ('MatchCoh (Matches (ASelOf s) g a))
im, Proxy s
s, FullGenListOf s
fg) where
im :: Proxy ('MatchCoh (Matches (ASelOf s) g a))
im = Proxy ('MatchCoh (Matches (ASelOf s) g a))
forall k (t :: k). Proxy t
Proxy :: Proxy ('MatchCoh (Matches (ASelOf s) g a))
type family Matches (s :: ASel) (g :: Type) (a :: Type) :: Bool where
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
instance FindGen 'Shift s () gs a => FindGen ('MatchCoh 'False) s _g gs a where
findGen :: (Proxy ('MatchCoh 'False), Proxy s, FullGenListOf s)
-> _g -> gs -> Gen a
findGen (Proxy ('MatchCoh 'False)
_, Proxy s
s, FullGenListOf s
fg) _g
_ = (Proxy 'Shift, Proxy s, FullGenListOf s) -> () -> gs -> Gen a
forall (i :: AInstr) (s :: AStore) g gs a.
FindGen i s g gs a =>
(Proxy i, Proxy s, FullGenListOf s) -> g -> gs -> Gen a
findGen (Proxy 'Shift
iShift, Proxy s
s, FullGenListOf s
fg) () where
instance (a ~ a') => FindGen ('MatchCoh 'True) s (Gen a) gs a' where
findGen :: (Proxy ('MatchCoh 'True), Proxy s, FullGenListOf s)
-> Gen a -> gs -> Gen a'
findGen (Proxy ('MatchCoh 'True), Proxy s, FullGenListOf s)
_ Gen a
g gs
_ = Gen a
Gen a'
g
instance (f x ~ a') => FindGen ('MatchCoh 'True) s (Gen1_ f) gs a' where
findGen :: (Proxy ('MatchCoh 'True), Proxy s, FullGenListOf s)
-> Gen1_ f -> gs -> Gen a'
findGen (Proxy ('MatchCoh 'True), Proxy s, FullGenListOf s)
_ (Gen1_ forall (a :: k). Gen (f a)
g) gs
_ = Gen a'
forall (a :: k). Gen (f a)
g
instance (f x ~ a', FindGen 'Shift ('S fg coh DummySel) () fg x)
=> FindGen ('MatchCoh 'True) ('S fg coh _sel) (Gen1 f) gs a' where
findGen :: (Proxy ('MatchCoh 'True), Proxy ('S fg coh _sel),
FullGenListOf ('S fg coh _sel))
-> Gen1 f -> gs -> Gen a'
findGen (Proxy ('MatchCoh 'True)
_, Proxy ('S fg coh _sel)
_, FullGenListOf ('S fg coh _sel)
fg) (Gen1 forall a. Gen a -> Gen (f a)
gen) gs
_ = Gen x -> Gen (f x)
forall a. Gen a -> Gen (f a)
gen ((Proxy 'Shift, Proxy ('S fg coh DummySel),
FullGenListOf ('S fg coh DummySel))
-> () -> fg -> Gen x
forall (i :: AInstr) (s :: AStore) g gs a.
FindGen i s g gs a =>
(Proxy i, Proxy s, FullGenListOf s) -> g -> gs -> Gen a
findGen (Proxy 'Shift
iShift, Proxy ('S fg coh DummySel)
s, FullGenListOf ('S fg coh _sel)
FullGenListOf ('S fg coh DummySel)
fg) () fg
FullGenListOf ('S fg coh _sel)
fg) where
s :: Proxy ('S fg coh DummySel)
s = Proxy ('S fg coh DummySel)
forall k (t :: k). Proxy t
Proxy :: Proxy ('S fg coh DummySel)
instance (a ~ a')
=> FindGen ('MatchCoh 'True) s (FieldGen sn a) gs a' where
findGen :: (Proxy ('MatchCoh 'True), Proxy s, FullGenListOf s)
-> FieldGen sn a -> gs -> Gen a'
findGen (Proxy ('MatchCoh 'True), Proxy s, FullGenListOf s)
_ (FieldGen Gen a
gen) gs
_ = Gen a
Gen a'
gen
instance (a ~ a')
=> FindGen ('MatchCoh 'True) s (ConstrGen c i a) gs a' where
findGen :: (Proxy ('MatchCoh 'True), Proxy s, FullGenListOf s)
-> ConstrGen c i a -> gs -> Gen a'
findGen (Proxy ('MatchCoh 'True), Proxy s, FullGenListOf s)
_ (ConstrGen Gen a
gen) gs
_ = Gen a
Gen a'
gen
newtype Weighted a = Weighted (Maybe (Int -> Gen a, Int))
deriving a -> Weighted b -> Weighted a
(a -> b) -> Weighted a -> Weighted b
(forall a b. (a -> b) -> Weighted a -> Weighted b)
-> (forall a b. a -> Weighted b -> Weighted a) -> Functor Weighted
forall a b. a -> Weighted b -> Weighted a
forall a b. (a -> b) -> Weighted a -> Weighted b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Weighted b -> Weighted a
$c<$ :: forall a b. a -> Weighted b -> Weighted a
fmap :: (a -> b) -> Weighted a -> Weighted b
$cfmap :: forall a b. (a -> b) -> Weighted a -> Weighted b
Functor
instance Applicative Weighted where
pure :: a -> Weighted a
pure a
a = Maybe (Int -> Gen a, Int) -> Weighted a
forall a. Maybe (Int -> Gen a, Int) -> Weighted a
Weighted ((Int -> Gen a, Int) -> Maybe (Int -> Gen a, Int)
forall a. a -> Maybe a
Just ((Gen a -> Int -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Gen a -> Int -> Gen a) -> (a -> Gen a) -> a -> Int -> Gen a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure) a
a, Int
1))
Weighted Maybe (Int -> Gen (a -> b), Int)
f <*> :: Weighted (a -> b) -> Weighted a -> Weighted b
<*> Weighted Maybe (Int -> Gen a, Int)
a = Maybe (Int -> Gen b, Int) -> Weighted b
forall a. Maybe (Int -> Gen a, Int) -> Weighted a
Weighted (Maybe (Int -> Gen b, Int) -> Weighted b)
-> Maybe (Int -> Gen b, Int) -> Weighted b
forall a b. (a -> b) -> a -> b
$ ((Int -> Gen (a -> b), Int)
-> (Int -> Gen a, Int) -> (Int -> Gen b, Int))
-> Maybe (Int -> Gen (a -> b), Int)
-> Maybe (Int -> Gen a, Int)
-> Maybe (Int -> Gen b, Int)
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (Int -> Gen (a -> b), Int)
-> (Int -> Gen a, Int) -> (Int -> Gen b, Int)
forall b (f :: * -> *) a b.
(Integral b, Applicative f) =>
(b -> f (a -> b), b) -> (b -> f a, b) -> (b -> f b, b)
g Maybe (Int -> Gen (a -> b), Int)
f Maybe (Int -> Gen a, Int)
a
where
g :: (b -> f (a -> b), b) -> (b -> f a, b) -> (b -> f b, b)
g (b -> f (a -> b)
f1, b
m) (b -> f a
a1, b
n) =
( \b
i ->
let (b
j, b
k) = b
i b -> b -> (b, b)
forall a. Integral a => a -> a -> (a, a)
`divMod` b
m
in b -> f (a -> b)
f1 b
j f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> b -> f a
a1 b
k
, b
m b -> b -> b
forall a. Num a => a -> a -> a
* b
n )
instance Alternative Weighted where
empty :: Weighted a
empty = Maybe (Int -> Gen a, Int) -> Weighted a
forall a. Maybe (Int -> Gen a, Int) -> Weighted a
Weighted Maybe (Int -> Gen a, Int)
forall a. Maybe a
Nothing
Weighted a
a <|> :: Weighted a -> Weighted a -> Weighted a
<|> Weighted Maybe (Int -> Gen a, Int)
Nothing = Weighted a
a
Weighted Maybe (Int -> Gen a, Int)
Nothing <|> Weighted a
b = Weighted a
b
Weighted (Just (Int -> Gen a
a, Int
m)) <|> Weighted (Just (Int -> Gen a
b, Int
n)) = Maybe (Int -> Gen a, Int) -> Weighted a
forall a. Maybe (Int -> Gen a, Int) -> Weighted a
Weighted (Maybe (Int -> Gen a, Int) -> Weighted a)
-> ((Int -> Gen a, Int) -> Maybe (Int -> Gen a, Int))
-> (Int -> Gen a, Int)
-> Weighted a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Gen a, Int) -> Maybe (Int -> Gen a, Int)
forall a. a -> Maybe a
Just ((Int -> Gen a, Int) -> Weighted a)
-> (Int -> Gen a, Int) -> Weighted a
forall a b. (a -> b) -> a -> b
$
( \Int
i ->
if Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
m then
Int -> Gen a
a Int
i
else
Int -> Gen a
b (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
m)
, Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n )
liftGen :: Gen a -> Weighted a
liftGen :: Gen a -> Weighted a
liftGen Gen a
g = Maybe (Int -> Gen a, Int) -> Weighted a
forall a. Maybe (Int -> Gen a, Int) -> Weighted a
Weighted ((Int -> Gen a, Int) -> Maybe (Int -> Gen a, Int)
forall a. a -> Maybe a
Just (\Int
_ -> Gen a
g, Int
1))