{-|
Module      : Test.QuickCheck.Arbitrary.ADT
Description : Generate arbitrary values for all constructors
Copyright   : Plow Technologies LLC
License     : BSD3
Maintainer  : mchaver@gmail.com
Stability   : Beta

Type classes to assist random generation of values for various types of
abstract data types.
-}

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}

module Test.QuickCheck.Arbitrary.ADT (
  -- * How to use this library
  -- $use

  -- * Data types
  -- $datatypes
    ConstructorArbitraryPair(..)
  , ADTArbitrarySingleton(..)
  , ADTArbitrary(..)

  -- * Type classes
  -- $typeclasses
  , ToADTArbitrary(..)

  -- * Generic type classes
  -- $generictypeclasses
  , GToADTArbitrarySingleton(..)
  , GToADTArbitrary(..)
  , GArbitrary(..)
  , genericArbitrary

  ) where

-- base
import Data.Typeable
import GHC.Generics

-- QuickCheck
import Test.QuickCheck.Arbitrary
import Test.QuickCheck.Gen

-- $datatypes

-- | ConstructorArbitraryPair holds the construct name as a string and an
-- arbitrary instance of that constructor.
data ConstructorArbitraryPair a =
  ConstructorArbitraryPair
    { ConstructorArbitraryPair a -> String
capConstructor :: String
    , ConstructorArbitraryPair a -> a
capArbitrary   :: a
    } deriving (ConstructorArbitraryPair a -> ConstructorArbitraryPair a -> Bool
(ConstructorArbitraryPair a -> ConstructorArbitraryPair a -> Bool)
-> (ConstructorArbitraryPair a
    -> ConstructorArbitraryPair a -> Bool)
-> Eq (ConstructorArbitraryPair a)
forall a.
Eq a =>
ConstructorArbitraryPair a -> ConstructorArbitraryPair a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ConstructorArbitraryPair a -> ConstructorArbitraryPair a -> Bool
$c/= :: forall a.
Eq a =>
ConstructorArbitraryPair a -> ConstructorArbitraryPair a -> Bool
== :: ConstructorArbitraryPair a -> ConstructorArbitraryPair a -> Bool
$c== :: forall a.
Eq a =>
ConstructorArbitraryPair a -> ConstructorArbitraryPair a -> Bool
Eq,(forall x.
 ConstructorArbitraryPair a -> Rep (ConstructorArbitraryPair a) x)
-> (forall x.
    Rep (ConstructorArbitraryPair a) x -> ConstructorArbitraryPair a)
-> Generic (ConstructorArbitraryPair a)
forall x.
Rep (ConstructorArbitraryPair a) x -> ConstructorArbitraryPair a
forall x.
ConstructorArbitraryPair a -> Rep (ConstructorArbitraryPair a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x.
Rep (ConstructorArbitraryPair a) x -> ConstructorArbitraryPair a
forall a x.
ConstructorArbitraryPair a -> Rep (ConstructorArbitraryPair a) x
$cto :: forall a x.
Rep (ConstructorArbitraryPair a) x -> ConstructorArbitraryPair a
$cfrom :: forall a x.
ConstructorArbitraryPair a -> Rep (ConstructorArbitraryPair a) x
Generic,ReadPrec [ConstructorArbitraryPair a]
ReadPrec (ConstructorArbitraryPair a)
Int -> ReadS (ConstructorArbitraryPair a)
ReadS [ConstructorArbitraryPair a]
(Int -> ReadS (ConstructorArbitraryPair a))
-> ReadS [ConstructorArbitraryPair a]
-> ReadPrec (ConstructorArbitraryPair a)
-> ReadPrec [ConstructorArbitraryPair a]
-> Read (ConstructorArbitraryPair a)
forall a. Read a => ReadPrec [ConstructorArbitraryPair a]
forall a. Read a => ReadPrec (ConstructorArbitraryPair a)
forall a. Read a => Int -> ReadS (ConstructorArbitraryPair a)
forall a. Read a => ReadS [ConstructorArbitraryPair a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ConstructorArbitraryPair a]
$creadListPrec :: forall a. Read a => ReadPrec [ConstructorArbitraryPair a]
readPrec :: ReadPrec (ConstructorArbitraryPair a)
$creadPrec :: forall a. Read a => ReadPrec (ConstructorArbitraryPair a)
readList :: ReadS [ConstructorArbitraryPair a]
$creadList :: forall a. Read a => ReadS [ConstructorArbitraryPair a]
readsPrec :: Int -> ReadS (ConstructorArbitraryPair a)
$creadsPrec :: forall a. Read a => Int -> ReadS (ConstructorArbitraryPair a)
Read,Int -> ConstructorArbitraryPair a -> ShowS
[ConstructorArbitraryPair a] -> ShowS
ConstructorArbitraryPair a -> String
(Int -> ConstructorArbitraryPair a -> ShowS)
-> (ConstructorArbitraryPair a -> String)
-> ([ConstructorArbitraryPair a] -> ShowS)
-> Show (ConstructorArbitraryPair a)
forall a. Show a => Int -> ConstructorArbitraryPair a -> ShowS
forall a. Show a => [ConstructorArbitraryPair a] -> ShowS
forall a. Show a => ConstructorArbitraryPair a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ConstructorArbitraryPair a] -> ShowS
$cshowList :: forall a. Show a => [ConstructorArbitraryPair a] -> ShowS
show :: ConstructorArbitraryPair a -> String
$cshow :: forall a. Show a => ConstructorArbitraryPair a -> String
showsPrec :: Int -> ConstructorArbitraryPair a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> ConstructorArbitraryPair a -> ShowS
Show,Typeable)

-- | fmap applies a function to `capArbitrary`
instance Functor ConstructorArbitraryPair where
  fmap :: (a -> b)
-> ConstructorArbitraryPair a -> ConstructorArbitraryPair b
fmap a -> b
f (ConstructorArbitraryPair String
c a
a) = String -> b -> ConstructorArbitraryPair b
forall a. String -> a -> ConstructorArbitraryPair a
ConstructorArbitraryPair String
c (a -> b
f a
a)

instance (Arbitrary a) => Arbitrary (ConstructorArbitraryPair a) where
  arbitrary :: Gen (ConstructorArbitraryPair a)
arbitrary = String -> a -> ConstructorArbitraryPair a
forall a. String -> a -> ConstructorArbitraryPair a
ConstructorArbitraryPair (String -> a -> ConstructorArbitraryPair a)
-> Gen String -> Gen (a -> ConstructorArbitraryPair a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen String
forall a. Arbitrary a => Gen a
arbitrary Gen (a -> ConstructorArbitraryPair a)
-> Gen a -> Gen (ConstructorArbitraryPair a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
forall a. Arbitrary a => Gen a
arbitrary

-- | ADTArbitrarySingleton holds the type name and one ConstructorArbitraryPair.
data ADTArbitrarySingleton a =
  ADTArbitrarySingleton
    { ADTArbitrarySingleton a -> String
adtasModuleName :: String
    , ADTArbitrarySingleton a -> String
adtasTypeName   :: String
    , ADTArbitrarySingleton a -> ConstructorArbitraryPair a
adtasCAP        :: ConstructorArbitraryPair a
    } deriving (ADTArbitrarySingleton a -> ADTArbitrarySingleton a -> Bool
(ADTArbitrarySingleton a -> ADTArbitrarySingleton a -> Bool)
-> (ADTArbitrarySingleton a -> ADTArbitrarySingleton a -> Bool)
-> Eq (ADTArbitrarySingleton a)
forall a.
Eq a =>
ADTArbitrarySingleton a -> ADTArbitrarySingleton a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ADTArbitrarySingleton a -> ADTArbitrarySingleton a -> Bool
$c/= :: forall a.
Eq a =>
ADTArbitrarySingleton a -> ADTArbitrarySingleton a -> Bool
== :: ADTArbitrarySingleton a -> ADTArbitrarySingleton a -> Bool
$c== :: forall a.
Eq a =>
ADTArbitrarySingleton a -> ADTArbitrarySingleton a -> Bool
Eq,(forall x.
 ADTArbitrarySingleton a -> Rep (ADTArbitrarySingleton a) x)
-> (forall x.
    Rep (ADTArbitrarySingleton a) x -> ADTArbitrarySingleton a)
-> Generic (ADTArbitrarySingleton a)
forall x.
Rep (ADTArbitrarySingleton a) x -> ADTArbitrarySingleton a
forall x.
ADTArbitrarySingleton a -> Rep (ADTArbitrarySingleton a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x.
Rep (ADTArbitrarySingleton a) x -> ADTArbitrarySingleton a
forall a x.
ADTArbitrarySingleton a -> Rep (ADTArbitrarySingleton a) x
$cto :: forall a x.
Rep (ADTArbitrarySingleton a) x -> ADTArbitrarySingleton a
$cfrom :: forall a x.
ADTArbitrarySingleton a -> Rep (ADTArbitrarySingleton a) x
Generic,ReadPrec [ADTArbitrarySingleton a]
ReadPrec (ADTArbitrarySingleton a)
Int -> ReadS (ADTArbitrarySingleton a)
ReadS [ADTArbitrarySingleton a]
(Int -> ReadS (ADTArbitrarySingleton a))
-> ReadS [ADTArbitrarySingleton a]
-> ReadPrec (ADTArbitrarySingleton a)
-> ReadPrec [ADTArbitrarySingleton a]
-> Read (ADTArbitrarySingleton a)
forall a. Read a => ReadPrec [ADTArbitrarySingleton a]
forall a. Read a => ReadPrec (ADTArbitrarySingleton a)
forall a. Read a => Int -> ReadS (ADTArbitrarySingleton a)
forall a. Read a => ReadS [ADTArbitrarySingleton a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ADTArbitrarySingleton a]
$creadListPrec :: forall a. Read a => ReadPrec [ADTArbitrarySingleton a]
readPrec :: ReadPrec (ADTArbitrarySingleton a)
$creadPrec :: forall a. Read a => ReadPrec (ADTArbitrarySingleton a)
readList :: ReadS [ADTArbitrarySingleton a]
$creadList :: forall a. Read a => ReadS [ADTArbitrarySingleton a]
readsPrec :: Int -> ReadS (ADTArbitrarySingleton a)
$creadsPrec :: forall a. Read a => Int -> ReadS (ADTArbitrarySingleton a)
Read,Int -> ADTArbitrarySingleton a -> ShowS
[ADTArbitrarySingleton a] -> ShowS
ADTArbitrarySingleton a -> String
(Int -> ADTArbitrarySingleton a -> ShowS)
-> (ADTArbitrarySingleton a -> String)
-> ([ADTArbitrarySingleton a] -> ShowS)
-> Show (ADTArbitrarySingleton a)
forall a. Show a => Int -> ADTArbitrarySingleton a -> ShowS
forall a. Show a => [ADTArbitrarySingleton a] -> ShowS
forall a. Show a => ADTArbitrarySingleton a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ADTArbitrarySingleton a] -> ShowS
$cshowList :: forall a. Show a => [ADTArbitrarySingleton a] -> ShowS
show :: ADTArbitrarySingleton a -> String
$cshow :: forall a. Show a => ADTArbitrarySingleton a -> String
showsPrec :: Int -> ADTArbitrarySingleton a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> ADTArbitrarySingleton a -> ShowS
Show,Typeable)

-- | fmap applies a function to the ConstructorArbitraryPair in adtasCAP.
instance Functor ADTArbitrarySingleton where
  fmap :: (a -> b) -> ADTArbitrarySingleton a -> ADTArbitrarySingleton b
fmap a -> b
f (ADTArbitrarySingleton String
m String
t ConstructorArbitraryPair a
c) = String
-> String -> ConstructorArbitraryPair b -> ADTArbitrarySingleton b
forall a.
String
-> String -> ConstructorArbitraryPair a -> ADTArbitrarySingleton a
ADTArbitrarySingleton String
m String
t (a -> b
f (a -> b)
-> ConstructorArbitraryPair a -> ConstructorArbitraryPair b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConstructorArbitraryPair a
c)

instance (Arbitrary a) => Arbitrary (ADTArbitrarySingleton a) where
  arbitrary :: Gen (ADTArbitrarySingleton a)
arbitrary = String
-> String -> ConstructorArbitraryPair a -> ADTArbitrarySingleton a
forall a.
String
-> String -> ConstructorArbitraryPair a -> ADTArbitrarySingleton a
ADTArbitrarySingleton (String
 -> String -> ConstructorArbitraryPair a -> ADTArbitrarySingleton a)
-> Gen String
-> Gen
     (String -> ConstructorArbitraryPair a -> ADTArbitrarySingleton a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen String
forall a. Arbitrary a => Gen a
arbitrary Gen
  (String -> ConstructorArbitraryPair a -> ADTArbitrarySingleton a)
-> Gen String
-> Gen (ConstructorArbitraryPair a -> ADTArbitrarySingleton a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen String
forall a. Arbitrary a => Gen a
arbitrary Gen (ConstructorArbitraryPair a -> ADTArbitrarySingleton a)
-> Gen (ConstructorArbitraryPair a)
-> Gen (ADTArbitrarySingleton a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (ConstructorArbitraryPair a)
forall a. Arbitrary a => Gen a
arbitrary

-- | ADTArbitrary holds the type name and a ConstructorArbitraryPair
-- for each constructor.
data ADTArbitrary a =
  ADTArbitrary
    { ADTArbitrary a -> String
adtModuleName :: String
    , ADTArbitrary a -> String
adtTypeName   :: String
    , ADTArbitrary a -> [ConstructorArbitraryPair a]
adtCAPs       :: [ConstructorArbitraryPair a]
    } deriving (ADTArbitrary a -> ADTArbitrary a -> Bool
(ADTArbitrary a -> ADTArbitrary a -> Bool)
-> (ADTArbitrary a -> ADTArbitrary a -> Bool)
-> Eq (ADTArbitrary a)
forall a. Eq a => ADTArbitrary a -> ADTArbitrary a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ADTArbitrary a -> ADTArbitrary a -> Bool
$c/= :: forall a. Eq a => ADTArbitrary a -> ADTArbitrary a -> Bool
== :: ADTArbitrary a -> ADTArbitrary a -> Bool
$c== :: forall a. Eq a => ADTArbitrary a -> ADTArbitrary a -> Bool
Eq,(forall x. ADTArbitrary a -> Rep (ADTArbitrary a) x)
-> (forall x. Rep (ADTArbitrary a) x -> ADTArbitrary a)
-> Generic (ADTArbitrary a)
forall x. Rep (ADTArbitrary a) x -> ADTArbitrary a
forall x. ADTArbitrary a -> Rep (ADTArbitrary a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (ADTArbitrary a) x -> ADTArbitrary a
forall a x. ADTArbitrary a -> Rep (ADTArbitrary a) x
$cto :: forall a x. Rep (ADTArbitrary a) x -> ADTArbitrary a
$cfrom :: forall a x. ADTArbitrary a -> Rep (ADTArbitrary a) x
Generic,ReadPrec [ADTArbitrary a]
ReadPrec (ADTArbitrary a)
Int -> ReadS (ADTArbitrary a)
ReadS [ADTArbitrary a]
(Int -> ReadS (ADTArbitrary a))
-> ReadS [ADTArbitrary a]
-> ReadPrec (ADTArbitrary a)
-> ReadPrec [ADTArbitrary a]
-> Read (ADTArbitrary a)
forall a. Read a => ReadPrec [ADTArbitrary a]
forall a. Read a => ReadPrec (ADTArbitrary a)
forall a. Read a => Int -> ReadS (ADTArbitrary a)
forall a. Read a => ReadS [ADTArbitrary a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ADTArbitrary a]
$creadListPrec :: forall a. Read a => ReadPrec [ADTArbitrary a]
readPrec :: ReadPrec (ADTArbitrary a)
$creadPrec :: forall a. Read a => ReadPrec (ADTArbitrary a)
readList :: ReadS [ADTArbitrary a]
$creadList :: forall a. Read a => ReadS [ADTArbitrary a]
readsPrec :: Int -> ReadS (ADTArbitrary a)
$creadsPrec :: forall a. Read a => Int -> ReadS (ADTArbitrary a)
Read,Int -> ADTArbitrary a -> ShowS
[ADTArbitrary a] -> ShowS
ADTArbitrary a -> String
(Int -> ADTArbitrary a -> ShowS)
-> (ADTArbitrary a -> String)
-> ([ADTArbitrary a] -> ShowS)
-> Show (ADTArbitrary a)
forall a. Show a => Int -> ADTArbitrary a -> ShowS
forall a. Show a => [ADTArbitrary a] -> ShowS
forall a. Show a => ADTArbitrary a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ADTArbitrary a] -> ShowS
$cshowList :: forall a. Show a => [ADTArbitrary a] -> ShowS
show :: ADTArbitrary a -> String
$cshow :: forall a. Show a => ADTArbitrary a -> String
showsPrec :: Int -> ADTArbitrary a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> ADTArbitrary a -> ShowS
Show,Typeable)

-- | fmap applies a function to each ConstructorArbitraryPair in adtCAPs.
instance Functor ADTArbitrary where
  fmap :: (a -> b) -> ADTArbitrary a -> ADTArbitrary b
fmap a -> b
f (ADTArbitrary String
m String
t [ConstructorArbitraryPair a]
cs) = String -> String -> [ConstructorArbitraryPair b] -> ADTArbitrary b
forall a.
String -> String -> [ConstructorArbitraryPair a] -> ADTArbitrary a
ADTArbitrary String
m String
t ((a -> b)
-> ConstructorArbitraryPair a -> ConstructorArbitraryPair b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f (ConstructorArbitraryPair a -> ConstructorArbitraryPair b)
-> [ConstructorArbitraryPair a] -> [ConstructorArbitraryPair b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ConstructorArbitraryPair a]
cs)

instance (Arbitrary a) => Arbitrary (ADTArbitrary a) where
  arbitrary :: Gen (ADTArbitrary a)
arbitrary = String -> String -> [ConstructorArbitraryPair a] -> ADTArbitrary a
forall a.
String -> String -> [ConstructorArbitraryPair a] -> ADTArbitrary a
ADTArbitrary (String
 -> String -> [ConstructorArbitraryPair a] -> ADTArbitrary a)
-> Gen String
-> Gen (String -> [ConstructorArbitraryPair a] -> ADTArbitrary a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen String
forall a. Arbitrary a => Gen a
arbitrary Gen (String -> [ConstructorArbitraryPair a] -> ADTArbitrary a)
-> Gen String
-> Gen ([ConstructorArbitraryPair a] -> ADTArbitrary a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen String
forall a. Arbitrary a => Gen a
arbitrary Gen ([ConstructorArbitraryPair a] -> ADTArbitrary a)
-> Gen [ConstructorArbitraryPair a] -> Gen (ADTArbitrary a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen [ConstructorArbitraryPair a]
forall a. Arbitrary a => Gen a
arbitrary


-- $typeclasses

-- | ToADTArbitrary generalizes the production of arbitrary values for Sum types.
-- and Product types.
class ToADTArbitrary a where
  -- {-# MINIMAL toADTArbitrarySingleton, toADTArbitrary #-}
  -- | produce an arbitrary instance of one random constructor
  toADTArbitrarySingleton :: Proxy a -> Gen (ADTArbitrarySingleton a)
  default toADTArbitrarySingleton ::
    ( Generic a
    , GToADTArbitrarySingleton (Rep a)
    )
    => Proxy a
    -> Gen (ADTArbitrarySingleton a)
  toADTArbitrarySingleton Proxy a
_ = (Rep a Any -> a)
-> ADTArbitrarySingleton (Rep a Any) -> ADTArbitrarySingleton 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 (ADTArbitrarySingleton (Rep a Any) -> ADTArbitrarySingleton a)
-> Gen (ADTArbitrarySingleton (Rep a Any))
-> Gen (ADTArbitrarySingleton a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy (Rep a) -> Gen (ADTArbitrarySingleton (Rep a Any))
forall (rep :: * -> *) a.
GToADTArbitrarySingleton rep =>
Proxy rep -> Gen (ADTArbitrarySingleton (rep a))
gToADTArbitrarySingleton (Proxy (Rep a)
forall k (t :: k). Proxy t
Proxy :: Proxy (Rep a))

  -- | produce an arbitrary instance for each constructor in type a.
  toADTArbitrary :: Proxy a -> Gen (ADTArbitrary a)
  default toADTArbitrary ::
    ( Generic a
    , GToADTArbitrary (Rep a)
    )
    => Proxy a
    -> Gen (ADTArbitrary a)
  toADTArbitrary Proxy a
_ = (Rep a Any -> a) -> ADTArbitrary (Rep a Any) -> ADTArbitrary 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 (ADTArbitrary (Rep a Any) -> ADTArbitrary a)
-> Gen (ADTArbitrary (Rep a Any)) -> Gen (ADTArbitrary a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy (Rep a) -> Gen (ADTArbitrary (Rep a Any))
forall (rep :: * -> *) a.
GToADTArbitrary rep =>
Proxy rep -> Gen (ADTArbitrary (rep a))
gToADTArbitrary (Proxy (Rep a)
forall k (t :: k). Proxy t
Proxy :: Proxy (Rep a))



-- $generictypeclasses

-- | GToADTArbitrarySingleton creates an arbitrary value and returns the name of the
-- constructor that was used to create it and the type name.

class GToADTArbitrarySingleton rep where
  gToADTArbitrarySingleton :: Proxy rep -> Gen (ADTArbitrarySingleton (rep a))

instance GToADTArbitrarySingleton U1 where
  gToADTArbitrarySingleton :: Proxy U1 -> Gen (ADTArbitrarySingleton (U1 a))
gToADTArbitrarySingleton Proxy U1
_ = ADTArbitrarySingleton (U1 a) -> Gen (ADTArbitrarySingleton (U1 a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ADTArbitrarySingleton (U1 a)
 -> Gen (ADTArbitrarySingleton (U1 a)))
-> ADTArbitrarySingleton (U1 a)
-> Gen (ADTArbitrarySingleton (U1 a))
forall a b. (a -> b) -> a -> b
$ String
-> String
-> ConstructorArbitraryPair (U1 a)
-> ADTArbitrarySingleton (U1 a)
forall a.
String
-> String -> ConstructorArbitraryPair a -> ADTArbitrarySingleton a
ADTArbitrarySingleton String
"" String
"" (ConstructorArbitraryPair (U1 a) -> ADTArbitrarySingleton (U1 a))
-> ConstructorArbitraryPair (U1 a) -> ADTArbitrarySingleton (U1 a)
forall a b. (a -> b) -> a -> b
$ String -> U1 a -> ConstructorArbitraryPair (U1 a)
forall a. String -> a -> ConstructorArbitraryPair a
ConstructorArbitraryPair String
"" U1 a
forall k (p :: k). U1 p
U1

instance (GToADTArbitrarySingleton l, GToADTArbitrarySingleton r) => GToADTArbitrarySingleton (l :+: r) where
  gToADTArbitrarySingleton :: Proxy (l :+: r) -> Gen (ADTArbitrarySingleton ((:+:) l r a))
gToADTArbitrarySingleton Proxy (l :+: r)
_ = do
    Bool
b <- Gen Bool
forall a. Arbitrary a => Gen a
arbitrary
    if Bool
b then (l a -> (:+:) l r a)
-> ADTArbitrarySingleton (l a)
-> ADTArbitrarySingleton ((:+:) l r a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap l a -> (:+:) l r a
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1 (ADTArbitrarySingleton (l a)
 -> ADTArbitrarySingleton ((:+:) l r a))
-> Gen (ADTArbitrarySingleton (l a))
-> Gen (ADTArbitrarySingleton ((:+:) l r a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy l -> Gen (ADTArbitrarySingleton (l a))
forall (rep :: * -> *) a.
GToADTArbitrarySingleton rep =>
Proxy rep -> Gen (ADTArbitrarySingleton (rep a))
gToADTArbitrarySingleton (Proxy l
forall k (t :: k). Proxy t
Proxy :: Proxy l)
         else (r a -> (:+:) l r a)
-> ADTArbitrarySingleton (r a)
-> ADTArbitrarySingleton ((:+:) l r a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap r a -> (:+:) l r a
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1 (ADTArbitrarySingleton (r a)
 -> ADTArbitrarySingleton ((:+:) l r a))
-> Gen (ADTArbitrarySingleton (r a))
-> Gen (ADTArbitrarySingleton ((:+:) l r a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy r -> Gen (ADTArbitrarySingleton (r a))
forall (rep :: * -> *) a.
GToADTArbitrarySingleton rep =>
Proxy rep -> Gen (ADTArbitrarySingleton (rep a))
gToADTArbitrarySingleton (Proxy r
forall k (t :: k). Proxy t
Proxy :: Proxy r)

instance (GToADTArbitrarySingleton l, GToADTArbitrarySingleton r) => GToADTArbitrarySingleton (l :*: r) where
  gToADTArbitrarySingleton :: Proxy (l :*: r) -> Gen (ADTArbitrarySingleton ((:*:) l r a))
gToADTArbitrarySingleton Proxy (l :*: r)
_ = do
    l a
x <- ADTArbitrarySingleton (l a) -> l a
forall c. ADTArbitrarySingleton c -> c
getArb (ADTArbitrarySingleton (l a) -> l a)
-> Gen (ADTArbitrarySingleton (l a)) -> Gen (l a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy l -> Gen (ADTArbitrarySingleton (l a))
forall (rep :: * -> *) a.
GToADTArbitrarySingleton rep =>
Proxy rep -> Gen (ADTArbitrarySingleton (rep a))
gToADTArbitrarySingleton (Proxy l
forall k (t :: k). Proxy t
Proxy :: Proxy l)
    r a
y <- ADTArbitrarySingleton (r a) -> r a
forall c. ADTArbitrarySingleton c -> c
getArb (ADTArbitrarySingleton (r a) -> r a)
-> Gen (ADTArbitrarySingleton (r a)) -> Gen (r a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy r -> Gen (ADTArbitrarySingleton (r a))
forall (rep :: * -> *) a.
GToADTArbitrarySingleton rep =>
Proxy rep -> Gen (ADTArbitrarySingleton (rep a))
gToADTArbitrarySingleton (Proxy r
forall k (t :: k). Proxy t
Proxy :: Proxy r)
    ADTArbitrarySingleton ((:*:) l r a)
-> Gen (ADTArbitrarySingleton ((:*:) l r a))
forall (m :: * -> *) a. Monad m => a -> m a
return (ADTArbitrarySingleton ((:*:) l r a)
 -> Gen (ADTArbitrarySingleton ((:*:) l r a)))
-> ADTArbitrarySingleton ((:*:) l r a)
-> Gen (ADTArbitrarySingleton ((:*:) l r a))
forall a b. (a -> b) -> a -> b
$ String
-> String
-> ConstructorArbitraryPair ((:*:) l r a)
-> ADTArbitrarySingleton ((:*:) l r a)
forall a.
String
-> String -> ConstructorArbitraryPair a -> ADTArbitrarySingleton a
ADTArbitrarySingleton String
"" String
"" (ConstructorArbitraryPair ((:*:) l r a)
 -> ADTArbitrarySingleton ((:*:) l r a))
-> ConstructorArbitraryPair ((:*:) l r a)
-> ADTArbitrarySingleton ((:*:) l r a)
forall a b. (a -> b) -> a -> b
$ String -> (:*:) l r a -> ConstructorArbitraryPair ((:*:) l r a)
forall a. String -> a -> ConstructorArbitraryPair a
ConstructorArbitraryPair String
"" (l a
x l a -> r a -> (:*:) l r a
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: r a
y)
    where
      getArb :: ADTArbitrarySingleton c -> c
getArb = ConstructorArbitraryPair c -> c
forall a. ConstructorArbitraryPair a -> a
capArbitrary (ConstructorArbitraryPair c -> c)
-> (ADTArbitrarySingleton c -> ConstructorArbitraryPair c)
-> ADTArbitrarySingleton c
-> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ADTArbitrarySingleton c -> ConstructorArbitraryPair c
forall a. ADTArbitrarySingleton a -> ConstructorArbitraryPair a
adtasCAP

instance Arbitrary a => GToADTArbitrarySingleton (K1 i a) where
  gToADTArbitrarySingleton :: Proxy (K1 i a) -> Gen (ADTArbitrarySingleton (K1 i a a))
gToADTArbitrarySingleton Proxy (K1 i a)
_ =
    String
-> String
-> ConstructorArbitraryPair (K1 i a a)
-> ADTArbitrarySingleton (K1 i a a)
forall a.
String
-> String -> ConstructorArbitraryPair a -> ADTArbitrarySingleton a
ADTArbitrarySingleton
      (String
 -> String
 -> ConstructorArbitraryPair (K1 i a a)
 -> ADTArbitrarySingleton (K1 i a a))
-> Gen String
-> Gen
     (String
      -> ConstructorArbitraryPair (K1 i a a)
      -> ADTArbitrarySingleton (K1 i a a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Gen String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
""
      Gen
  (String
   -> ConstructorArbitraryPair (K1 i a a)
   -> ADTArbitrarySingleton (K1 i a a))
-> Gen String
-> Gen
     (ConstructorArbitraryPair (K1 i a a)
      -> ADTArbitrarySingleton (K1 i a a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> Gen String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
""
      Gen
  (ConstructorArbitraryPair (K1 i a a)
   -> ADTArbitrarySingleton (K1 i a a))
-> Gen (ConstructorArbitraryPair (K1 i a a))
-> Gen (ADTArbitrarySingleton (K1 i a a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (String -> K1 i a a -> ConstructorArbitraryPair (K1 i a a)
forall a. String -> a -> ConstructorArbitraryPair a
ConstructorArbitraryPair
            (String -> K1 i a a -> ConstructorArbitraryPair (K1 i a a))
-> (a -> String)
-> a
-> K1 i a a
-> ConstructorArbitraryPair (K1 i a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> a -> String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
""
            (a -> K1 i a a -> ConstructorArbitraryPair (K1 i a a))
-> (a -> K1 i a a) -> a -> ConstructorArbitraryPair (K1 i a a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> a -> K1 i a a
forall k i c (p :: k). c -> K1 i c p
K1 (a -> ConstructorArbitraryPair (K1 i a a))
-> Gen a -> Gen (ConstructorArbitraryPair (K1 i a a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
forall a. Arbitrary a => Gen a
arbitrary)

instance (Constructor c, GToADTArbitrarySingleton rep) => GToADTArbitrarySingleton (M1 C c rep) where
  gToADTArbitrarySingleton :: Proxy (M1 C c rep) -> Gen (ADTArbitrarySingleton (M1 C c rep a))
gToADTArbitrarySingleton Proxy (M1 C c rep)
_ =
    String
-> String
-> ConstructorArbitraryPair (M1 C c rep a)
-> ADTArbitrarySingleton (M1 C c rep a)
forall a.
String
-> String -> ConstructorArbitraryPair a -> ADTArbitrarySingleton a
ADTArbitrarySingleton
      (String
 -> String
 -> ConstructorArbitraryPair (M1 C c rep a)
 -> ADTArbitrarySingleton (M1 C c rep a))
-> Gen String
-> Gen
     (String
      -> ConstructorArbitraryPair (M1 C c rep a)
      -> ADTArbitrarySingleton (M1 C c rep a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Gen String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
""
      Gen
  (String
   -> ConstructorArbitraryPair (M1 C c rep a)
   -> ADTArbitrarySingleton (M1 C c rep a))
-> Gen String
-> Gen
     (ConstructorArbitraryPair (M1 C c rep a)
      -> ADTArbitrarySingleton (M1 C c rep a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> Gen String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
""
      Gen
  (ConstructorArbitraryPair (M1 C c rep a)
   -> ADTArbitrarySingleton (M1 C c rep a))
-> Gen (ConstructorArbitraryPair (M1 C c rep a))
-> Gen (ADTArbitrarySingleton (M1 C c rep a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (String -> M1 C c rep a -> ConstructorArbitraryPair (M1 C c rep a)
forall a. String -> a -> ConstructorArbitraryPair a
ConstructorArbitraryPair String
con (M1 C c rep a -> ConstructorArbitraryPair (M1 C c rep a))
-> Gen (M1 C c rep a)
-> Gen (ConstructorArbitraryPair (M1 C c rep a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (M1 C c rep a)
forall i (c :: Meta) p. Gen (M1 i c rep p)
ac)
    where
      kRep :: Gen (ADTArbitrarySingleton (rep a))
kRep = Proxy rep -> Gen (ADTArbitrarySingleton (rep a))
forall (rep :: * -> *) a.
GToADTArbitrarySingleton rep =>
Proxy rep -> Gen (ADTArbitrarySingleton (rep a))
gToADTArbitrarySingleton (Proxy rep
forall k (t :: k). Proxy t
Proxy :: Proxy rep)
      ac :: Gen (M1 i c rep p)
ac   = rep p -> M1 i c rep p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (rep p -> M1 i c rep p)
-> (ADTArbitrarySingleton (rep p) -> rep p)
-> ADTArbitrarySingleton (rep p)
-> M1 i c rep p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConstructorArbitraryPair (rep p) -> rep p
forall a. ConstructorArbitraryPair a -> a
capArbitrary (ConstructorArbitraryPair (rep p) -> rep p)
-> (ADTArbitrarySingleton (rep p)
    -> ConstructorArbitraryPair (rep p))
-> ADTArbitrarySingleton (rep p)
-> rep p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ADTArbitrarySingleton (rep p) -> ConstructorArbitraryPair (rep p)
forall a. ADTArbitrarySingleton a -> ConstructorArbitraryPair a
adtasCAP (ADTArbitrarySingleton (rep p) -> M1 i c rep p)
-> Gen (ADTArbitrarySingleton (rep p)) -> Gen (M1 i c rep p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (ADTArbitrarySingleton (rep p))
forall a. Gen (ADTArbitrarySingleton (rep a))
kRep
      con :: String
con = M1 C c rep () -> String
forall k (c :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
       (f :: k1 -> *) (a :: k1).
Constructor c =>
t c f a -> String
conName (M1 C c rep ()
forall a. HasCallStack => a
undefined :: M1 C c rep ())

instance (Datatype t, Typeable t, GToADTArbitrarySingleton rep) => GToADTArbitrarySingleton (M1 D t rep) where
  gToADTArbitrarySingleton :: Proxy (M1 D t rep) -> Gen (ADTArbitrarySingleton (M1 D t rep a))
gToADTArbitrarySingleton Proxy (M1 D t rep)
_ =
    String
-> String
-> ConstructorArbitraryPair (M1 D t rep a)
-> ADTArbitrarySingleton (M1 D t rep a)
forall a.
String
-> String -> ConstructorArbitraryPair a -> ADTArbitrarySingleton a
ADTArbitrarySingleton
      (String
 -> String
 -> ConstructorArbitraryPair (M1 D t rep a)
 -> ADTArbitrarySingleton (M1 D t rep a))
-> Gen String
-> Gen
     (String
      -> ConstructorArbitraryPair (M1 D t rep a)
      -> ADTArbitrarySingleton (M1 D t rep a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Gen String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
m
      Gen
  (String
   -> ConstructorArbitraryPair (M1 D t rep a)
   -> ADTArbitrarySingleton (M1 D t rep a))
-> Gen String
-> Gen
     (ConstructorArbitraryPair (M1 D t rep a)
      -> ADTArbitrarySingleton (M1 D t rep a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> Gen String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
t
      Gen
  (ConstructorArbitraryPair (M1 D t rep a)
   -> ADTArbitrarySingleton (M1 D t rep a))
-> Gen (ConstructorArbitraryPair (M1 D t rep a))
-> Gen (ADTArbitrarySingleton (M1 D t rep a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (String -> M1 D t rep a -> ConstructorArbitraryPair (M1 D t rep a)
forall a. String -> a -> ConstructorArbitraryPair a
ConstructorArbitraryPair
            (String -> M1 D t rep a -> ConstructorArbitraryPair (M1 D t rep a))
-> Gen String
-> Gen (M1 D t rep a -> ConstructorArbitraryPair (M1 D t rep a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ConstructorArbitraryPair (rep Any) -> String
forall a. ConstructorArbitraryPair a -> String
capConstructor (ConstructorArbitraryPair (rep Any) -> String)
-> (ADTArbitrarySingleton (rep Any)
    -> ConstructorArbitraryPair (rep Any))
-> ADTArbitrarySingleton (rep Any)
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ADTArbitrarySingleton (rep Any)
-> ConstructorArbitraryPair (rep Any)
forall a. ADTArbitrarySingleton a -> ConstructorArbitraryPair a
adtasCAP (ADTArbitrarySingleton (rep Any) -> String)
-> Gen (ADTArbitrarySingleton (rep Any)) -> Gen String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (ADTArbitrarySingleton (rep Any))
forall a. Gen (ADTArbitrarySingleton (rep a))
kRep)
            Gen (M1 D t rep a -> ConstructorArbitraryPair (M1 D t rep a))
-> Gen (M1 D t rep a)
-> Gen (ConstructorArbitraryPair (M1 D t rep a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (M1 D t rep a)
forall i (c :: Meta) p. Gen (M1 i c rep p)
ac)
    where
      kRep :: Gen (ADTArbitrarySingleton (rep a))
kRep = Proxy rep -> Gen (ADTArbitrarySingleton (rep a))
forall (rep :: * -> *) a.
GToADTArbitrarySingleton rep =>
Proxy rep -> Gen (ADTArbitrarySingleton (rep a))
gToADTArbitrarySingleton (Proxy rep
forall k (t :: k). Proxy t
Proxy :: Proxy rep)
      ac :: Gen (M1 i c rep p)
ac   = rep p -> M1 i c rep p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (rep p -> M1 i c rep p)
-> (ADTArbitrarySingleton (rep p) -> rep p)
-> ADTArbitrarySingleton (rep p)
-> M1 i c rep p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConstructorArbitraryPair (rep p) -> rep p
forall a. ConstructorArbitraryPair a -> a
capArbitrary (ConstructorArbitraryPair (rep p) -> rep p)
-> (ADTArbitrarySingleton (rep p)
    -> ConstructorArbitraryPair (rep p))
-> ADTArbitrarySingleton (rep p)
-> rep p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ADTArbitrarySingleton (rep p) -> ConstructorArbitraryPair (rep p)
forall a. ADTArbitrarySingleton a -> ConstructorArbitraryPair a
adtasCAP (ADTArbitrarySingleton (rep p) -> M1 i c rep p)
-> Gen (ADTArbitrarySingleton (rep p)) -> Gen (M1 i c rep p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (ADTArbitrarySingleton (rep p))
forall a. Gen (ADTArbitrarySingleton (rep a))
kRep
      m :: String
m    = M1 D t rep () -> String
forall k (d :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
       (f :: k1 -> *) (a :: k1).
Datatype d =>
t d f a -> String
moduleName (M1 D t rep ()
forall a. HasCallStack => a
undefined :: M1 D t rep ())
      t :: String
t    = M1 D t rep () -> String
forall k (d :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
       (f :: k1 -> *) (a :: k1).
Datatype d =>
t d f a -> String
datatypeName (M1 D t rep ()
forall a. HasCallStack => a
undefined :: M1 D t rep ())

instance GToADTArbitrarySingleton rep => GToADTArbitrarySingleton (M1 S t rep) where
  gToADTArbitrarySingleton :: Proxy (M1 S t rep) -> Gen (ADTArbitrarySingleton (M1 S t rep a))
gToADTArbitrarySingleton Proxy (M1 S t rep)
_ =
    String
-> String
-> ConstructorArbitraryPair (M1 S t rep a)
-> ADTArbitrarySingleton (M1 S t rep a)
forall a.
String
-> String -> ConstructorArbitraryPair a -> ADTArbitrarySingleton a
ADTArbitrarySingleton
      (String
 -> String
 -> ConstructorArbitraryPair (M1 S t rep a)
 -> ADTArbitrarySingleton (M1 S t rep a))
-> Gen String
-> Gen
     (String
      -> ConstructorArbitraryPair (M1 S t rep a)
      -> ADTArbitrarySingleton (M1 S t rep a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Gen String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
""
      Gen
  (String
   -> ConstructorArbitraryPair (M1 S t rep a)
   -> ADTArbitrarySingleton (M1 S t rep a))
-> Gen String
-> Gen
     (ConstructorArbitraryPair (M1 S t rep a)
      -> ADTArbitrarySingleton (M1 S t rep a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> Gen String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
""
      Gen
  (ConstructorArbitraryPair (M1 S t rep a)
   -> ADTArbitrarySingleton (M1 S t rep a))
-> Gen (ConstructorArbitraryPair (M1 S t rep a))
-> Gen (ADTArbitrarySingleton (M1 S t rep a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (String -> M1 S t rep a -> ConstructorArbitraryPair (M1 S t rep a)
forall a. String -> a -> ConstructorArbitraryPair a
ConstructorArbitraryPair
            (String -> M1 S t rep a -> ConstructorArbitraryPair (M1 S t rep a))
-> Gen String
-> Gen (M1 S t rep a -> ConstructorArbitraryPair (M1 S t rep a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Gen String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
""
            Gen (M1 S t rep a -> ConstructorArbitraryPair (M1 S t rep a))
-> Gen (M1 S t rep a)
-> Gen (ConstructorArbitraryPair (M1 S t rep a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (M1 S t rep a)
forall i (c :: Meta) p. Gen (M1 i c rep p)
ac)
    where
      kRep :: Gen (ADTArbitrarySingleton (rep a))
kRep = Proxy rep -> Gen (ADTArbitrarySingleton (rep a))
forall (rep :: * -> *) a.
GToADTArbitrarySingleton rep =>
Proxy rep -> Gen (ADTArbitrarySingleton (rep a))
gToADTArbitrarySingleton (Proxy rep
forall k (t :: k). Proxy t
Proxy :: Proxy rep)
      ac :: Gen (M1 i c rep p)
ac   = rep p -> M1 i c rep p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (rep p -> M1 i c rep p)
-> (ADTArbitrarySingleton (rep p) -> rep p)
-> ADTArbitrarySingleton (rep p)
-> M1 i c rep p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConstructorArbitraryPair (rep p) -> rep p
forall a. ConstructorArbitraryPair a -> a
capArbitrary (ConstructorArbitraryPair (rep p) -> rep p)
-> (ADTArbitrarySingleton (rep p)
    -> ConstructorArbitraryPair (rep p))
-> ADTArbitrarySingleton (rep p)
-> rep p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ADTArbitrarySingleton (rep p) -> ConstructorArbitraryPair (rep p)
forall a. ADTArbitrarySingleton a -> ConstructorArbitraryPair a
adtasCAP (ADTArbitrarySingleton (rep p) -> M1 i c rep p)
-> Gen (ADTArbitrarySingleton (rep p)) -> Gen (M1 i c rep p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (ADTArbitrarySingleton (rep p))
forall a. Gen (ADTArbitrarySingleton (rep a))
kRep


-- | GToADTArbitrary is a typeclass for generalizing the creation
-- of a list of arbitrary values for each constructor of a type.  It also
-- returns the name of the constructor and the type name for reference and file
-- creation.

class GToADTArbitrary rep where
  gToADTArbitrary :: Proxy rep -> Gen (ADTArbitrary (rep a))

instance GToADTArbitrary U1 where
  gToADTArbitrary :: Proxy U1 -> Gen (ADTArbitrary (U1 a))
gToADTArbitrary Proxy U1
_ = ADTArbitrary (U1 a) -> Gen (ADTArbitrary (U1 a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ADTArbitrary (U1 a) -> Gen (ADTArbitrary (U1 a)))
-> ADTArbitrary (U1 a) -> Gen (ADTArbitrary (U1 a))
forall a b. (a -> b) -> a -> b
$ String
-> String
-> [ConstructorArbitraryPair (U1 a)]
-> ADTArbitrary (U1 a)
forall a.
String -> String -> [ConstructorArbitraryPair a] -> ADTArbitrary a
ADTArbitrary String
"" String
"" [String -> U1 a -> ConstructorArbitraryPair (U1 a)
forall a. String -> a -> ConstructorArbitraryPair a
ConstructorArbitraryPair String
"" U1 a
forall k (p :: k). U1 p
U1]

instance (GToADTArbitrary l, GToADTArbitrary r) => GToADTArbitrary (l :+: r) where
  gToADTArbitrary :: Proxy (l :+: r) -> Gen (ADTArbitrary ((:+:) l r a))
gToADTArbitrary Proxy (l :+: r)
_ = do
    ADTArbitrary ((:+:) l r a)
a <- (l a -> (:+:) l r a)
-> ADTArbitrary (l a) -> ADTArbitrary ((:+:) l r a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap l a -> (:+:) l r a
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1 (ADTArbitrary (l a) -> ADTArbitrary ((:+:) l r a))
-> Gen (ADTArbitrary (l a)) -> Gen (ADTArbitrary ((:+:) l r a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy l -> Gen (ADTArbitrary (l a))
forall (rep :: * -> *) a.
GToADTArbitrary rep =>
Proxy rep -> Gen (ADTArbitrary (rep a))
gToADTArbitrary (Proxy l
forall k (t :: k). Proxy t
Proxy :: Proxy l)
    ADTArbitrary ((:+:) l r a)
b <- (r a -> (:+:) l r a)
-> ADTArbitrary (r a) -> ADTArbitrary ((:+:) l r a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap r a -> (:+:) l r a
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1 (ADTArbitrary (r a) -> ADTArbitrary ((:+:) l r a))
-> Gen (ADTArbitrary (r a)) -> Gen (ADTArbitrary ((:+:) l r a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy r -> Gen (ADTArbitrary (r a))
forall (rep :: * -> *) a.
GToADTArbitrary rep =>
Proxy rep -> Gen (ADTArbitrary (rep a))
gToADTArbitrary (Proxy r
forall k (t :: k). Proxy t
Proxy :: Proxy r)
    ADTArbitrary ((:+:) l r a) -> Gen (ADTArbitrary ((:+:) l r a))
forall (m :: * -> *) a. Monad m => a -> m a
return (ADTArbitrary ((:+:) l r a) -> Gen (ADTArbitrary ((:+:) l r a)))
-> ADTArbitrary ((:+:) l r a) -> Gen (ADTArbitrary ((:+:) l r a))
forall a b. (a -> b) -> a -> b
$ String
-> String
-> [ConstructorArbitraryPair ((:+:) l r a)]
-> ADTArbitrary ((:+:) l r a)
forall a.
String -> String -> [ConstructorArbitraryPair a] -> ADTArbitrary a
ADTArbitrary String
"" String
"" (ADTArbitrary ((:+:) l r a)
-> [ConstructorArbitraryPair ((:+:) l r a)]
forall a. ADTArbitrary a -> [ConstructorArbitraryPair a]
adtCAPs ADTArbitrary ((:+:) l r a)
a [ConstructorArbitraryPair ((:+:) l r a)]
-> [ConstructorArbitraryPair ((:+:) l r a)]
-> [ConstructorArbitraryPair ((:+:) l r a)]
forall a. [a] -> [a] -> [a]
++ ADTArbitrary ((:+:) l r a)
-> [ConstructorArbitraryPair ((:+:) l r a)]
forall a. ADTArbitrary a -> [ConstructorArbitraryPair a]
adtCAPs ADTArbitrary ((:+:) l r a)
b)

instance (GToADTArbitrarySingleton l, GToADTArbitrarySingleton r) => GToADTArbitrary (l :*: r) where
  gToADTArbitrary :: Proxy (l :*: r) -> Gen (ADTArbitrary ((:*:) l r a))
gToADTArbitrary Proxy (l :*: r)
_ = do
    l a
x <- ADTArbitrarySingleton (l a) -> l a
forall c. ADTArbitrarySingleton c -> c
getArb (ADTArbitrarySingleton (l a) -> l a)
-> Gen (ADTArbitrarySingleton (l a)) -> Gen (l a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy l -> Gen (ADTArbitrarySingleton (l a))
forall (rep :: * -> *) a.
GToADTArbitrarySingleton rep =>
Proxy rep -> Gen (ADTArbitrarySingleton (rep a))
gToADTArbitrarySingleton (Proxy l
forall k (t :: k). Proxy t
Proxy :: Proxy l)
    r a
y <- ADTArbitrarySingleton (r a) -> r a
forall c. ADTArbitrarySingleton c -> c
getArb (ADTArbitrarySingleton (r a) -> r a)
-> Gen (ADTArbitrarySingleton (r a)) -> Gen (r a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy r -> Gen (ADTArbitrarySingleton (r a))
forall (rep :: * -> *) a.
GToADTArbitrarySingleton rep =>
Proxy rep -> Gen (ADTArbitrarySingleton (rep a))
gToADTArbitrarySingleton (Proxy r
forall k (t :: k). Proxy t
Proxy :: Proxy r)
    ADTArbitrary ((:*:) l r a) -> Gen (ADTArbitrary ((:*:) l r a))
forall (m :: * -> *) a. Monad m => a -> m a
return (ADTArbitrary ((:*:) l r a) -> Gen (ADTArbitrary ((:*:) l r a)))
-> ADTArbitrary ((:*:) l r a) -> Gen (ADTArbitrary ((:*:) l r a))
forall a b. (a -> b) -> a -> b
$ String
-> String
-> [ConstructorArbitraryPair ((:*:) l r a)]
-> ADTArbitrary ((:*:) l r a)
forall a.
String -> String -> [ConstructorArbitraryPair a] -> ADTArbitrary a
ADTArbitrary String
"" String
"" [String -> (:*:) l r a -> ConstructorArbitraryPair ((:*:) l r a)
forall a. String -> a -> ConstructorArbitraryPair a
ConstructorArbitraryPair String
"" (l a
x l a -> r a -> (:*:) l r a
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: r a
y)]
    where
      getArb :: ADTArbitrarySingleton c -> c
getArb = ConstructorArbitraryPair c -> c
forall a. ConstructorArbitraryPair a -> a
capArbitrary (ConstructorArbitraryPair c -> c)
-> (ADTArbitrarySingleton c -> ConstructorArbitraryPair c)
-> ADTArbitrarySingleton c
-> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ADTArbitrarySingleton c -> ConstructorArbitraryPair c
forall a. ADTArbitrarySingleton a -> ConstructorArbitraryPair a
adtasCAP

instance Arbitrary a => GToADTArbitrary (K1 i a) where
  gToADTArbitrary :: Proxy (K1 i a) -> Gen (ADTArbitrary (K1 i a a))
gToADTArbitrary Proxy (K1 i a)
_ =
    String
-> String
-> [ConstructorArbitraryPair (K1 i a a)]
-> ADTArbitrary (K1 i a a)
forall a.
String -> String -> [ConstructorArbitraryPair a] -> ADTArbitrary a
ADTArbitrary
      (String
 -> String
 -> [ConstructorArbitraryPair (K1 i a a)]
 -> ADTArbitrary (K1 i a a))
-> (ConstructorArbitraryPair (K1 i a a) -> String)
-> ConstructorArbitraryPair (K1 i a a)
-> String
-> [ConstructorArbitraryPair (K1 i a a)]
-> ADTArbitrary (K1 i a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ConstructorArbitraryPair (K1 i a a) -> String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
""
      (ConstructorArbitraryPair (K1 i a a)
 -> String
 -> [ConstructorArbitraryPair (K1 i a a)]
 -> ADTArbitrary (K1 i a a))
-> (ConstructorArbitraryPair (K1 i a a) -> String)
-> ConstructorArbitraryPair (K1 i a a)
-> [ConstructorArbitraryPair (K1 i a a)]
-> ADTArbitrary (K1 i a a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> ConstructorArbitraryPair (K1 i a a) -> String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
""
      (ConstructorArbitraryPair (K1 i a a)
 -> [ConstructorArbitraryPair (K1 i a a)]
 -> ADTArbitrary (K1 i a a))
-> (ConstructorArbitraryPair (K1 i a a)
    -> [ConstructorArbitraryPair (K1 i a a)])
-> ConstructorArbitraryPair (K1 i a a)
-> ADTArbitrary (K1 i a a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (ConstructorArbitraryPair (K1 i a a)
-> [ConstructorArbitraryPair (K1 i a a)]
-> [ConstructorArbitraryPair (K1 i a a)]
forall a. a -> [a] -> [a]
:[]) (ConstructorArbitraryPair (K1 i a a) -> ADTArbitrary (K1 i a a))
-> Gen (ConstructorArbitraryPair (K1 i a a))
-> Gen (ADTArbitrary (K1 i a a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (ConstructorArbitraryPair (K1 i a a))
forall i p. Gen (ConstructorArbitraryPair (K1 i a p))
genCap
    where
      arb :: Gen a
arb    = Gen a
forall a. Arbitrary a => Gen a
arbitrary :: Gen a
      genCap :: Gen (ConstructorArbitraryPair (K1 i a p))
genCap = String -> K1 i a p -> ConstructorArbitraryPair (K1 i a p)
forall a. String -> a -> ConstructorArbitraryPair a
ConstructorArbitraryPair (String -> K1 i a p -> ConstructorArbitraryPair (K1 i a p))
-> Gen String
-> Gen (K1 i a p -> ConstructorArbitraryPair (K1 i a p))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Gen String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
"" Gen (K1 i a p -> ConstructorArbitraryPair (K1 i a p))
-> Gen (K1 i a p) -> Gen (ConstructorArbitraryPair (K1 i a p))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (a -> K1 i a p
forall k i c (p :: k). c -> K1 i c p
K1 (a -> K1 i a p) -> Gen a -> Gen (K1 i a p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
arb)

-- constructor level
instance (Constructor c, GToADTArbitrary rep) => GToADTArbitrary (M1 C c rep) where
  gToADTArbitrary :: Proxy (M1 C c rep) -> Gen (ADTArbitrary (M1 C c rep a))
gToADTArbitrary Proxy (M1 C c rep)
_ = String
-> String
-> [ConstructorArbitraryPair (M1 C c rep a)]
-> ADTArbitrary (M1 C c rep a)
forall a.
String -> String -> [ConstructorArbitraryPair a] -> ADTArbitrary a
ADTArbitrary (String
 -> String
 -> [ConstructorArbitraryPair (M1 C c rep a)]
 -> ADTArbitrary (M1 C c rep a))
-> (M1 C c rep a -> String)
-> M1 C c rep a
-> String
-> [ConstructorArbitraryPair (M1 C c rep a)]
-> ADTArbitrary (M1 C c rep a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> M1 C c rep a -> String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
"" (M1 C c rep a
 -> String
 -> [ConstructorArbitraryPair (M1 C c rep a)]
 -> ADTArbitrary (M1 C c rep a))
-> (M1 C c rep a -> String)
-> M1 C c rep a
-> [ConstructorArbitraryPair (M1 C c rep a)]
-> ADTArbitrary (M1 C c rep a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> M1 C c rep a -> String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
"" (M1 C c rep a
 -> [ConstructorArbitraryPair (M1 C c rep a)]
 -> ADTArbitrary (M1 C c rep a))
-> (M1 C c rep a -> [ConstructorArbitraryPair (M1 C c rep a)])
-> M1 C c rep a
-> ADTArbitrary (M1 C c rep a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (ConstructorArbitraryPair (M1 C c rep a)
-> [ConstructorArbitraryPair (M1 C c rep a)]
-> [ConstructorArbitraryPair (M1 C c rep a)]
forall a. a -> [a] -> [a]
:[]) (ConstructorArbitraryPair (M1 C c rep a)
 -> [ConstructorArbitraryPair (M1 C c rep a)])
-> (M1 C c rep a -> ConstructorArbitraryPair (M1 C c rep a))
-> M1 C c rep a
-> [ConstructorArbitraryPair (M1 C c rep a)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> M1 C c rep a -> ConstructorArbitraryPair (M1 C c rep a)
forall a. String -> a -> ConstructorArbitraryPair a
ConstructorArbitraryPair String
con (M1 C c rep a -> ADTArbitrary (M1 C c rep a))
-> Gen (M1 C c rep a) -> Gen (ADTArbitrary (M1 C c rep a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (M1 C c rep a)
forall i (c :: Meta) p. Gen (M1 i c rep p)
ac
    where
      kRep :: Gen (ADTArbitrary (rep a))
kRep = Proxy rep -> Gen (ADTArbitrary (rep a))
forall (rep :: * -> *) a.
GToADTArbitrary rep =>
Proxy rep -> Gen (ADTArbitrary (rep a))
gToADTArbitrary (Proxy rep
forall k (t :: k). Proxy t
Proxy :: Proxy rep)
      ac :: Gen (M1 i c rep p)
ac   = rep p -> M1 i c rep p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (rep p -> M1 i c rep p)
-> (ADTArbitrary (rep p) -> rep p)
-> ADTArbitrary (rep p)
-> M1 i c rep p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConstructorArbitraryPair (rep p) -> rep p
forall a. ConstructorArbitraryPair a -> a
capArbitrary (ConstructorArbitraryPair (rep p) -> rep p)
-> (ADTArbitrary (rep p) -> ConstructorArbitraryPair (rep p))
-> ADTArbitrary (rep p)
-> rep p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ConstructorArbitraryPair (rep p)]
-> ConstructorArbitraryPair (rep p)
forall a. [a] -> a
head ([ConstructorArbitraryPair (rep p)]
 -> ConstructorArbitraryPair (rep p))
-> (ADTArbitrary (rep p) -> [ConstructorArbitraryPair (rep p)])
-> ADTArbitrary (rep p)
-> ConstructorArbitraryPair (rep p)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ADTArbitrary (rep p) -> [ConstructorArbitraryPair (rep p)]
forall a. ADTArbitrary a -> [ConstructorArbitraryPair a]
adtCAPs (ADTArbitrary (rep p) -> M1 i c rep p)
-> Gen (ADTArbitrary (rep p)) -> Gen (M1 i c rep p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (ADTArbitrary (rep p))
forall a. Gen (ADTArbitrary (rep a))
kRep
      con :: String
con  = M1 C c rep () -> String
forall k (c :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
       (f :: k1 -> *) (a :: k1).
Constructor c =>
t c f a -> String
conName (M1 C c rep ()
forall a. HasCallStack => a
undefined :: M1 C c rep ())

-- type level
instance (Datatype t, GToADTArbitrary rep) => GToADTArbitrary (M1 D t rep) where
  gToADTArbitrary :: Proxy (M1 D t rep) -> Gen (ADTArbitrary (M1 D t rep a))
gToADTArbitrary Proxy (M1 D t rep)
_ =  String
-> String
-> [ConstructorArbitraryPair (M1 D t rep a)]
-> ADTArbitrary (M1 D t rep a)
forall a.
String -> String -> [ConstructorArbitraryPair a] -> ADTArbitrary a
ADTArbitrary (String
 -> String
 -> [ConstructorArbitraryPair (M1 D t rep a)]
 -> ADTArbitrary (M1 D t rep a))
-> Gen String
-> Gen
     (String
      -> [ConstructorArbitraryPair (M1 D t rep a)]
      -> ADTArbitrary (M1 D t rep a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Gen String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
m Gen
  (String
   -> [ConstructorArbitraryPair (M1 D t rep a)]
   -> ADTArbitrary (M1 D t rep a))
-> Gen String
-> Gen
     ([ConstructorArbitraryPair (M1 D t rep a)]
      -> ADTArbitrary (M1 D t rep a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> Gen String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
t Gen
  ([ConstructorArbitraryPair (M1 D t rep a)]
   -> ADTArbitrary (M1 D t rep a))
-> Gen [ConstructorArbitraryPair (M1 D t rep a)]
-> Gen (ADTArbitrary (M1 D t rep a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen [ConstructorArbitraryPair (M1 D t rep a)]
forall i (c :: Meta) p.
Gen [ConstructorArbitraryPair (M1 i c rep p)]
m1caps
    where
      kRep :: Gen (ADTArbitrary (rep a))
kRep   = Proxy rep -> Gen (ADTArbitrary (rep a))
forall (rep :: * -> *) a.
GToADTArbitrary rep =>
Proxy rep -> Gen (ADTArbitrary (rep a))
gToADTArbitrary (Proxy rep
forall k (t :: k). Proxy t
Proxy :: Proxy rep)
      caps :: Gen [ConstructorArbitraryPair (rep a)]
caps   = ADTArbitrary (rep a) -> [ConstructorArbitraryPair (rep a)]
forall a. ADTArbitrary a -> [ConstructorArbitraryPair a]
adtCAPs (ADTArbitrary (rep a) -> [ConstructorArbitraryPair (rep a)])
-> Gen (ADTArbitrary (rep a))
-> Gen [ConstructorArbitraryPair (rep a)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (ADTArbitrary (rep a))
forall a. Gen (ADTArbitrary (rep a))
kRep
      m1caps :: Gen [ConstructorArbitraryPair (M1 i c rep p)]
m1caps = ((ConstructorArbitraryPair (rep p)
 -> ConstructorArbitraryPair (M1 i c rep p))
-> [ConstructorArbitraryPair (rep p)]
-> [ConstructorArbitraryPair (M1 i c rep p)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((ConstructorArbitraryPair (rep p)
  -> ConstructorArbitraryPair (M1 i c rep p))
 -> [ConstructorArbitraryPair (rep p)]
 -> [ConstructorArbitraryPair (M1 i c rep p)])
-> ((rep p -> M1 i c rep p)
    -> ConstructorArbitraryPair (rep p)
    -> ConstructorArbitraryPair (M1 i c rep p))
-> (rep p -> M1 i c rep p)
-> [ConstructorArbitraryPair (rep p)]
-> [ConstructorArbitraryPair (M1 i c rep p)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (rep p -> M1 i c rep p)
-> ConstructorArbitraryPair (rep p)
-> ConstructorArbitraryPair (M1 i c rep p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap) rep p -> M1 i c rep p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 ([ConstructorArbitraryPair (rep p)]
 -> [ConstructorArbitraryPair (M1 i c rep p)])
-> Gen [ConstructorArbitraryPair (rep p)]
-> Gen [ConstructorArbitraryPair (M1 i c rep p)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [ConstructorArbitraryPair (rep p)]
forall a. Gen [ConstructorArbitraryPair (rep a)]
caps
      m :: String
m      = M1 D t rep () -> String
forall k (d :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
       (f :: k1 -> *) (a :: k1).
Datatype d =>
t d f a -> String
moduleName (M1 D t rep ()
forall a. HasCallStack => a
undefined :: M1 D t rep ())
      t :: String
t      = M1 D t rep () -> String
forall k (d :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
       (f :: k1 -> *) (a :: k1).
Datatype d =>
t d f a -> String
datatypeName (M1 D t rep ()
forall a. HasCallStack => a
undefined :: M1 D t rep ())

-- selector level
instance GToADTArbitrary rep => GToADTArbitrary (M1 S t rep) where
  gToADTArbitrary :: Proxy (M1 S t rep) -> Gen (ADTArbitrary (M1 S t rep a))
gToADTArbitrary Proxy (M1 S t rep)
_ =
    String
-> String
-> [ConstructorArbitraryPair (M1 S t rep a)]
-> ADTArbitrary (M1 S t rep a)
forall a.
String -> String -> [ConstructorArbitraryPair a] -> ADTArbitrary a
ADTArbitrary
      (String
 -> String
 -> [ConstructorArbitraryPair (M1 S t rep a)]
 -> ADTArbitrary (M1 S t rep a))
-> (ConstructorArbitraryPair (M1 S t rep a) -> String)
-> ConstructorArbitraryPair (M1 S t rep a)
-> String
-> [ConstructorArbitraryPair (M1 S t rep a)]
-> ADTArbitrary (M1 S t rep a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ConstructorArbitraryPair (M1 S t rep a) -> String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
""
      (ConstructorArbitraryPair (M1 S t rep a)
 -> String
 -> [ConstructorArbitraryPair (M1 S t rep a)]
 -> ADTArbitrary (M1 S t rep a))
-> (ConstructorArbitraryPair (M1 S t rep a) -> String)
-> ConstructorArbitraryPair (M1 S t rep a)
-> [ConstructorArbitraryPair (M1 S t rep a)]
-> ADTArbitrary (M1 S t rep a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> ConstructorArbitraryPair (M1 S t rep a) -> String
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
""
      (ConstructorArbitraryPair (M1 S t rep a)
 -> [ConstructorArbitraryPair (M1 S t rep a)]
 -> ADTArbitrary (M1 S t rep a))
-> (ConstructorArbitraryPair (M1 S t rep a)
    -> [ConstructorArbitraryPair (M1 S t rep a)])
-> ConstructorArbitraryPair (M1 S t rep a)
-> ADTArbitrary (M1 S t rep a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (ConstructorArbitraryPair (M1 S t rep a)
-> [ConstructorArbitraryPair (M1 S t rep a)]
-> [ConstructorArbitraryPair (M1 S t rep a)]
forall a. a -> [a] -> [a]
:[]) (ConstructorArbitraryPair (M1 S t rep a)
 -> ADTArbitrary (M1 S t rep a))
-> Gen (ConstructorArbitraryPair (M1 S t rep a))
-> Gen (ADTArbitrary (M1 S t rep a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String -> M1 S t rep a -> ConstructorArbitraryPair (M1 S t rep a)
forall a. String -> a -> ConstructorArbitraryPair a
ConstructorArbitraryPair String
"" (M1 S t rep a -> ConstructorArbitraryPair (M1 S t rep a))
-> Gen (M1 S t rep a)
-> Gen (ConstructorArbitraryPair (M1 S t rep a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (M1 S t rep a)
forall i (c :: Meta) p. Gen (M1 i c rep p)
ac)
    where
      kRep :: Gen (ADTArbitrary (rep a))
kRep = Proxy rep -> Gen (ADTArbitrary (rep a))
forall (rep :: * -> *) a.
GToADTArbitrary rep =>
Proxy rep -> Gen (ADTArbitrary (rep a))
gToADTArbitrary (Proxy rep
forall k (t :: k). Proxy t
Proxy :: Proxy rep)
      ac :: Gen (M1 i c rep p)
ac   = rep p -> M1 i c rep p
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (rep p -> M1 i c rep p)
-> (ADTArbitrary (rep p) -> rep p)
-> ADTArbitrary (rep p)
-> M1 i c rep p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConstructorArbitraryPair (rep p) -> rep p
forall a. ConstructorArbitraryPair a -> a
capArbitrary (ConstructorArbitraryPair (rep p) -> rep p)
-> (ADTArbitrary (rep p) -> ConstructorArbitraryPair (rep p))
-> ADTArbitrary (rep p)
-> rep p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ConstructorArbitraryPair (rep p)]
-> ConstructorArbitraryPair (rep p)
forall a. [a] -> a
head ([ConstructorArbitraryPair (rep p)]
 -> ConstructorArbitraryPair (rep p))
-> (ADTArbitrary (rep p) -> [ConstructorArbitraryPair (rep p)])
-> ADTArbitrary (rep p)
-> ConstructorArbitraryPair (rep p)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ADTArbitrary (rep p) -> [ConstructorArbitraryPair (rep p)]
forall a. ADTArbitrary a -> [ConstructorArbitraryPair a]
adtCAPs (ADTArbitrary (rep p) -> M1 i c rep p)
-> Gen (ADTArbitrary (rep p)) -> Gen (M1 i c rep p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (ADTArbitrary (rep p))
forall a. Gen (ADTArbitrary (rep a))
kRep


-- | GArbitrary is a typeclass for generalizing the creation of single arbitrary
-- product and sum types. It creates an arbitrary generating function of this
-- style: @TypeName \<$\> arbitrary \<*\> arbitrary@.

class GArbitrary rep where
  gArbitrary :: Gen (rep a)

instance GArbitrary U1 where
  gArbitrary :: Gen (U1 a)
gArbitrary = U1 a -> Gen (U1 a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure U1 a
forall k (p :: k). U1 p
U1

instance (GArbitrary l, GArbitrary r) => GArbitrary (l :+: r) where
  gArbitrary :: Gen ((:+:) l r a)
gArbitrary = do
    Bool
b <- Gen Bool
forall a. Arbitrary a => Gen a
arbitrary
    if Bool
b then l a -> (:+:) l r a
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1 (l a -> (:+:) l r a) -> Gen (l a) -> Gen ((:+:) l r a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (l a)
forall (rep :: * -> *) a. GArbitrary rep => Gen (rep a)
gArbitrary
         else r a -> (:+:) l r a
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1 (r a -> (:+:) l r a) -> Gen (r a) -> Gen ((:+:) l r a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (r a)
forall (rep :: * -> *) a. GArbitrary rep => Gen (rep a)
gArbitrary

instance (GArbitrary l, GArbitrary r) => GArbitrary (l :*: r) where
  gArbitrary :: Gen ((:*:) l r a)
gArbitrary = l a -> r a -> (:*:) l r a
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
(:*:) (l a -> r a -> (:*:) l r a)
-> Gen (l a) -> Gen (r a -> (:*:) l r a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (l a)
forall (rep :: * -> *) a. GArbitrary rep => Gen (rep a)
gArbitrary Gen (r a -> (:*:) l r a) -> Gen (r a) -> Gen ((:*:) l r a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (r a)
forall (rep :: * -> *) a. GArbitrary rep => Gen (rep a)
gArbitrary

instance Arbitrary a => GArbitrary (K1 i a) where
  gArbitrary :: Gen (K1 i a a)
gArbitrary = a -> K1 i a a
forall k i c (p :: k). c -> K1 i c p
K1 (a -> K1 i a a) -> Gen a -> Gen (K1 i a a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
forall a. Arbitrary a => Gen a
arbitrary

instance GArbitrary rep => GArbitrary (M1 i t rep) where
  gArbitrary :: Gen (M1 i t rep a)
gArbitrary = rep a -> M1 i t rep a
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (rep a -> M1 i t rep a) -> Gen (rep a) -> Gen (M1 i t rep a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (rep a)
forall (rep :: * -> *) a. GArbitrary rep => Gen (rep a)
gArbitrary

-- | Create a arbitrary generator for a specified a type in a naive way. Please
-- be careful when using this function, particularly for recursive types.
genericArbitrary :: (Generic a, GArbitrary (Rep a)) => Gen a
genericArbitrary :: Gen a
genericArbitrary = Rep a Any -> a
forall a x. Generic a => Rep a x -> a
to (Rep a Any -> a) -> Gen (Rep a Any) -> Gen a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Rep a Any)
forall (rep :: * -> *) a. GArbitrary rep => Gen (rep a)
gArbitrary

-- $use
--
-- How to use `ToADTArbitrary` with Generic.
--
-- > {-# LANGUAGE DeriveGeneric #-}
-- >
-- > import Data.Proxy
-- > import GHC.Generics
-- > import Test.QuickCheck
-- > import Test.QuickCheck.Arbitrary.ADT
-- >
-- > -- Sum Type, multiple constructors with parameters
-- > data Fruit
-- >   = Apple Int
-- >   | Orange String Int
-- >   | PassionFruit Int String Int
-- >   deriving (Generic, Show)
-- >
-- > -- Product Type, single constructor
-- > data Person =
-- >   Person
-- >     { name :: String
-- >     , age  :: Int
-- >     } deriving (Generic, Show)
--
-- Any type that implements `ToADTArbitrary` must also implement `Arbitrary`.
-- These examples all require that the data type is an instance of `Generic`.
--
-- @
-- instance Arbitrary Fruit where
--   arbitrary = `genericArbitrary`
--
-- instance `ToADTArbitrary` Fruit
--
-- instance Arbitrary Person where
--   arbitrary = `genericArbitrary`
--
-- instance `ToADTArbitrary` Person
-- @
--
-- Now we can use `toADTArbitrarySingleton` to produce an arbitrary value of
-- one random constructor along with some metadata. `toADTArbitrary` will
-- produce an arbitrary value for each constructor and return it along with
-- a String of the constructor name.
--
-- @
-- λ> generate (toADTArbitrarySingleton (Proxy :: Proxy Fruit))
-- ADTArbitrarySingleton {
--   adtasModuleName = \"Ghci1\"
-- , adtasTypeName = \"Fruit\"
-- , adtasCAP = ConstructorArbitraryPair {
--     capConstructor = \"Apple\", capArbitrary = Apple 30}}
--
-- λ> generate (toADTArbitrary (Proxy :: Proxy Fruit))
-- ADTArbitrary {
--   adtModuleName = \"Ghci1\"
-- , adtTypeName = \"Fruit\"
-- , adtCAPs = [
--     ConstructorArbitraryPair {
--         capConstructor = \"Apple\"
--       , capArbitrary = Apple 17}
--   , ConstructorArbitraryPair {
--         capConstructor = \"Orange\"
--       , capArbitrary = Orange \"abcdef\" 18}
--   , ConstructorArbitraryPair {
--         capConstructor = \"PassionFruit\"
--       , capArbitrary = PassionFruit 16 "datadata" 6}]}
--
-- λ> generate (toADTArbitrarySingleton (Proxy :: Proxy Person))
-- ADTArbitrarySingleton {
--   adtasModuleName = \"Ghci1\"
-- , adtasTypeName = \"Person\"
-- , adtasCAP = ConstructorArbitraryPair {capConstructor = \"Person\", capArbitrary = Person {name = "John Doe", age = 30}}}
--
-- λ> generate (toADTArbitrary (Proxy :: Proxy Person))
-- ADTArbitrary {
--   adtModuleName = \"Ghci1\"
-- , adtTypeName = \"Person\"
-- , adtCAPs = [ConstructorArbitraryPair {capConstructor = \"Person\", capArbitrary = Person {name = "Jane Doe", age = 15}}]}
-- @