{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE UndecidableInstances #-}

module Prolude.Test 
  ( -- * QuickCheck re-exports
    module Test.QuickCheck
    -- * Type
  , ArbitraryUniform(..)
    -- * Function
  , arbitraryIO
  )
where

import Test.QuickCheck (Arbitrary(arbitrary), generate, resize, sublistOf)
import Test.QuickCheck.Instances ()
import qualified Control.Monad.IO.Class as Monad
import qualified Generic.Random as Random
import qualified GHC.Generics as Generic

newtype ArbitraryUniform a = ArbitraryUniform  { ArbitraryUniform a -> a
unArbitraryUniform :: a }
  deriving Rep (ArbitraryUniform a) x -> ArbitraryUniform a
ArbitraryUniform a -> Rep (ArbitraryUniform a) x
(forall x. ArbitraryUniform a -> Rep (ArbitraryUniform a) x)
-> (forall x. Rep (ArbitraryUniform a) x -> ArbitraryUniform a)
-> Generic (ArbitraryUniform a)
forall a x.
Generic a =>
Rep (ArbitraryUniform a) x -> ArbitraryUniform a
forall a x.
Generic a =>
ArbitraryUniform a -> Rep (ArbitraryUniform a) x
forall x. Rep (ArbitraryUniform a) x -> ArbitraryUniform a
forall x. ArbitraryUniform a -> Rep (ArbitraryUniform a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
to :: Rep (ArbitraryUniform a) x -> ArbitraryUniform a
$cto :: forall a x.
Generic a =>
Rep (ArbitraryUniform a) x -> ArbitraryUniform a
from :: ArbitraryUniform a -> Rep (ArbitraryUniform a) x
$cfrom :: forall a x.
Generic a =>
ArbitraryUniform a -> Rep (ArbitraryUniform a) x
Generic.Generic via a

instance (Random.GArbitrary Random.UnsizedOpts a, Random.GUniformWeight a) =>  Arbitrary (ArbitraryUniform a) where
  arbitrary :: Gen (ArbitraryUniform a)
arbitrary = Gen (ArbitraryUniform a)
forall a. (GArbitrary UnsizedOpts a, GUniformWeight a) => Gen a
Random.genericArbitraryU

arbitraryIO :: (Arbitrary a, Monad.MonadIO m) => m a
arbitraryIO :: m a
arbitraryIO = IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
Monad.liftIO (Gen a -> IO a
forall a. Gen a -> IO a
generate Gen a
forall a. Arbitrary a => Gen a
arbitrary)