quickcheck-transformer 0.3 → 0.3.1
raw patch · 4 files changed
+98/−31 lines, 4 files
Files
- quickcheck-transformer.cabal +9/−2
- src-fail/before-4.13/Test/QuickCheck/GenT/Private.hs +33/−0
- src-fail/from-4.13/Test/QuickCheck/GenT/Private.hs +34/−0
- src/Test/QuickCheck/GenT.hs +22/−29
quickcheck-transformer.cabal view
@@ -1,5 +1,5 @@ Name: quickcheck-transformer-Version: 0.3+Version: 0.3.1 Synopsis: A GenT monad transformer for QuickCheck library. Description: A fork of QuickCheck-GenT that works for older GHC versions@@ -18,7 +18,7 @@ Source-Repository this- Tag: 0.3+ Tag: 0.3.1 Type: darcs Location: http://hub.darcs.net/thielema/quickcheck-transformer/ @@ -29,11 +29,18 @@ Library Hs-Source-Dirs: src+ If impl(ghc>=8.8)+ Hs-Source-Dirs: src-fail/from-4.13/+ Else+ Hs-Source-Dirs: src-fail/before-4.13/ Exposed-Modules: Test.QuickCheck.GenT+ Other-Modules:+ Test.QuickCheck.GenT.Private Build-Depends: QuickCheck >=2.7 && <3, random >=1.0 && <1.2, transformers >=0.5 && <0.6, base >=4.3 && <5 Default-Language: Haskell2010+ GHC-Options: -Wall
+ src-fail/before-4.13/Test/QuickCheck/GenT/Private.hs view
@@ -0,0 +1,33 @@+module Test.QuickCheck.GenT.Private where++import qualified Test.QuickCheck.Random as QC+import qualified System.Random as Random++import Control.Monad.Trans.Class (MonadTrans, lift)+import Control.Monad.IO.Class (MonadIO, liftIO)+import Control.Monad (ap)+import Control.Applicative (Applicative, pure, (<*>))+++newtype GenT m a = GenT { unGenT :: QC.QCGen -> Int -> m a }++instance (Functor m) => Functor (GenT m) where+ fmap f m = GenT $ \r n -> fmap f $ unGenT m r n++instance (Monad m) => Monad (GenT m) where+ return a = GenT (\_ _ -> return a)+ m >>= k = GenT $ \r n -> do+ let (r1, r2) = Random.split r+ a <- unGenT m r1 n+ unGenT (k a) r2 n+ fail msg = GenT (\_ _ -> fail msg)++instance (Functor m, Monad m) => Applicative (GenT m) where+ pure = return+ (<*>) = ap++instance MonadTrans GenT where+ lift m = GenT (\_ _ -> m)++instance (MonadIO m) => MonadIO (GenT m) where+ liftIO = lift . liftIO
+ src-fail/from-4.13/Test/QuickCheck/GenT/Private.hs view
@@ -0,0 +1,34 @@+module Test.QuickCheck.GenT.Private where++import qualified Test.QuickCheck.Random as QC+import qualified System.Random as Random++import Control.Monad.Trans.Class (MonadTrans, lift)+import Control.Monad.IO.Class (MonadIO, liftIO)+import Control.Monad (ap)+++newtype GenT m a = GenT { unGenT :: QC.QCGen -> Int -> m a }++instance (Functor m) => Functor (GenT m) where+ fmap f m = GenT $ \r n -> fmap f $ unGenT m r n++instance (Monad m) => Monad (GenT m) where+ return a = GenT (\_ _ -> return a)+ m >>= k = GenT $ \r n -> do+ let (r1, r2) = Random.split r+ a <- unGenT m r1 n+ unGenT (k a) r2 n++instance (MonadFail m) => MonadFail (GenT m) where+ fail msg = GenT (\_ _ -> fail msg)++instance (Functor m, Monad m) => Applicative (GenT m) where+ pure = return+ (<*>) = ap++instance MonadTrans GenT where+ lift m = GenT (\_ _ -> m)++instance (MonadIO m) => MonadIO (GenT m) where+ liftIO = lift . liftIO
src/Test/QuickCheck/GenT.hs view
@@ -2,43 +2,36 @@ -- Most of the code is borrowed from -- <http://haskell.1045720.n5.nabble.com/darcs-patch-GenT-monad-transformer-variant-of-Gen-QuickCheck-2-td3172136.html a mailing list discussion>. -- Therefor, credits go to Paul Johnson and Felix Martini.-module Test.QuickCheck.GenT where+module Test.QuickCheck.GenT (+ GenT (GenT, unGenT),+ runGenT,+ MonadGen (liftGen, variant, sized, resize, choose),+ var,+ suchThat,+ suchThatMaybe,+ listOf,+ listOf1,+ vectorOf,+ oneof,+ frequency,+ elements,+ growingElements,+ oneofMay,+ elementsMay,+ growingElementsMay,+ ) where import qualified Test.QuickCheck.Gen as QC import qualified Test.QuickCheck.Random as QC import qualified System.Random as Random -import Control.Monad.Trans.Class (MonadTrans, lift)-import Control.Monad.IO.Class (MonadIO, liftIO)-import Control.Monad (ap)-import Control.Applicative (Applicative, pure, (<*>), (<$>))+import Test.QuickCheck.GenT.Private (GenT(..)) +import Control.Applicative (Applicative, (<$>))+ import Data.Maybe (fromMaybe) -newtype GenT m a = GenT { unGenT :: QC.QCGen -> Int -> m a }--instance (Functor m) => Functor (GenT m) where- fmap f m = GenT $ \r n -> fmap f $ unGenT m r n--instance (Monad m) => Monad (GenT m) where- return a = GenT (\_ _ -> return a)- m >>= k = GenT $ \r n -> do- let (r1, r2) = Random.split r- a <- unGenT m r1 n- unGenT (k a) r2 n- fail msg = GenT (\_ _ -> fail msg)--instance (Functor m, Monad m) => Applicative (GenT m) where- pure = return- (<*>) = ap--instance MonadTrans GenT where- lift m = GenT (\_ _ -> m)--instance (MonadIO m) => MonadIO (GenT m) where- liftIO = lift . liftIO- runGenT :: GenT m a -> QC.Gen (m a) runGenT (GenT run) = QC.MkGen run @@ -180,5 +173,5 @@ where k = length xs mx = 100- log' = round . log . fromIntegral+ log' = round . log . (id :: Double -> Double) . fromIntegral size n = (log' n + 1) * k `div` log' mx