-----------------------------------------------------------------------------
-- |
-- Module      :  Disco.Effects.Random
-- Copyright   :  disco team and contributors
-- Maintainer  :  byorgey@gmail.com
--
-- SPDX-License-Identifier: BSD-3-Clause
--
-- Utility functions for random effect.
--
-----------------------------------------------------------------------------

module Disco.Effects.Random
  ( module Polysemy.Random
  , runGen
  )
  where

import           Polysemy
import           Polysemy.Random
import qualified System.Random.SplitMix as SM
import qualified Test.QuickCheck.Gen    as QC
import qualified Test.QuickCheck.Random as QCR

import           Data.Word              (Word64)

-- | Run a QuickCheck generator using a 'Random' effect.
runGen :: Member Random r => QC.Gen a -> Sem r a
runGen :: Gen a -> Sem r a
runGen Gen a
g = do
  Int
n <- (Member Random r, Random Int) => Sem r Int
forall (r :: EffectRow) x. (Member Random r, Random x) => Sem r x
random @_ @Int
  Word64
w <- (Member Random r, Random Word64) => Sem r Word64
forall (r :: EffectRow) x. (Member Random r, Random x) => Sem r x
random @_ @Word64
  a -> Sem r a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> Sem r a) -> a -> Sem r a
forall a b. (a -> b) -> a -> b
$ Gen a -> QCGen -> Int -> a
forall a. Gen a -> QCGen -> Int -> a
QC.unGen Gen a
g (SMGen -> QCGen
QCR.QCGen (Word64 -> SMGen
SM.mkSMGen Word64
w)) Int
n