{-# 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  { forall a. ArbitraryUniform a -> a
unArbitraryUniform :: a }
  deriving 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 :: forall x. Rep (ArbitraryUniform a) x -> ArbitraryUniform a
$cto :: forall a x.
Generic a =>
Rep (ArbitraryUniform a) x -> ArbitraryUniform a
from :: forall x. 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 = forall a. (GArbitrary UnsizedOpts a, GUniformWeight a) => Gen a
Random.genericArbitraryU

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