Skip to content

Commit 8edf244

Browse files
committed
Merge pull request #48 from purescript/repeatable
Fix 'repeatable'
2 parents bbd014d + 3bdf6f6 commit 8edf244

File tree

8 files changed

+72
-53
lines changed

8 files changed

+72
-53
lines changed

docs/Test/QuickCheck.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ Testable properties can be passed to the `quickCheck` function.
7373

7474
##### Instances
7575
``` purescript
76-
instance testableResult :: Testable Result
77-
instance testableBoolean :: Testable Boolean
78-
instance testableFunction :: (Arbitrary t, Testable prop) => Testable (t -> prop)
76+
Testable Result
77+
Testable Boolean
78+
(Arbitrary t, Testable prop) => Testable (t -> prop)
7979
```
8080

8181
#### `Result`
@@ -90,8 +90,8 @@ The result of a test: success or failure (with an error message).
9090

9191
##### Instances
9292
``` purescript
93-
instance testableResult :: Testable Result
94-
instance showResult :: Show Result
93+
Testable Result
94+
Show Result
9595
```
9696

9797
#### `(<?>)`
@@ -113,7 +113,7 @@ test x = myProperty x <?> ("myProperty did not hold for " <> show x)
113113
#### `(===)`
114114

115115
``` purescript
116-
(===) :: forall a b. (Eq a, Show a) => a -> a -> Result
116+
(===) :: forall a. (Eq a, Show a) => a -> a -> Result
117117
```
118118

119119
_left-associative / precedence -1_
@@ -123,7 +123,7 @@ Self-documenting equality assertion
123123
#### `(/==)`
124124

125125
``` purescript
126-
(/==) :: forall a b. (Eq a, Show a) => a -> a -> Result
126+
(/==) :: forall a. (Eq a, Show a) => a -> a -> Result
127127
```
128128

129129
_left-associative / precedence -1_

docs/Test/QuickCheck/Arbitrary.md

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,21 @@ module can be used to construct random generators.
1616

1717
##### Instances
1818
``` purescript
19-
instance arbBoolean :: Arbitrary Boolean
20-
instance arbNumber :: Arbitrary Number
21-
instance arbInt :: Arbitrary Int
22-
instance arbString :: Arbitrary String
23-
instance arbChar :: Arbitrary Char
24-
instance arbUnit :: Arbitrary Unit
25-
instance arbOrdering :: Arbitrary Ordering
26-
instance arbArray :: (Arbitrary a) => Arbitrary (Array a)
27-
instance arbFunction :: (Coarbitrary a, Arbitrary b) => Arbitrary (a -> b)
28-
instance arbTuple :: (Arbitrary a, Arbitrary b) => Arbitrary (Tuple a b)
29-
instance arbMaybe :: (Arbitrary a) => Arbitrary (Maybe a)
30-
instance arbEither :: (Arbitrary a, Arbitrary b) => Arbitrary (Either a b)
19+
Arbitrary Boolean
20+
Arbitrary Number
21+
Arbitrary Int
22+
Arbitrary String
23+
Arbitrary Char
24+
Arbitrary Unit
25+
Arbitrary Ordering
26+
(Arbitrary a) => Arbitrary (Array a)
27+
(Coarbitrary a, Arbitrary b) => Arbitrary (a -> b)
28+
(Arbitrary a, Arbitrary b) => Arbitrary (Tuple a b)
29+
(Arbitrary a) => Arbitrary (Maybe a)
30+
(Arbitrary a, Arbitrary b) => Arbitrary (Either a b)
31+
(Arbitrary a) => Arbitrary (List a)
32+
(Arbitrary a) => Arbitrary (Identity a)
33+
(Arbitrary a) => Arbitrary (Lazy a)
3134
```
3235

3336
#### `Coarbitrary`
@@ -48,18 +51,21 @@ is the role of the `coarbitrary` function.
4851

4952
##### Instances
5053
``` purescript
51-
instance coarbBoolean :: Coarbitrary Boolean
52-
instance coarbNumber :: Coarbitrary Number
53-
instance coarbInt :: Coarbitrary Int
54-
instance coarbString :: Coarbitrary String
55-
instance coarbChar :: Coarbitrary Char
56-
instance coarbUnit :: Coarbitrary Unit
57-
instance coarbOrdering :: Coarbitrary Ordering
58-
instance coarbArray :: (Coarbitrary a) => Coarbitrary (Array a)
59-
instance coarbFunction :: (Arbitrary a, Coarbitrary b) => Coarbitrary (a -> b)
60-
instance coarbTuple :: (Coarbitrary a, Coarbitrary b) => Coarbitrary (Tuple a b)
61-
instance coarbMaybe :: (Coarbitrary a) => Coarbitrary (Maybe a)
62-
instance coarbEither :: (Coarbitrary a, Coarbitrary b) => Coarbitrary (Either a b)
54+
Coarbitrary Boolean
55+
Coarbitrary Number
56+
Coarbitrary Int
57+
Coarbitrary String
58+
Coarbitrary Char
59+
Coarbitrary Unit
60+
Coarbitrary Ordering
61+
(Coarbitrary a) => Coarbitrary (Array a)
62+
(Arbitrary a, Coarbitrary b) => Coarbitrary (a -> b)
63+
(Coarbitrary a, Coarbitrary b) => Coarbitrary (Tuple a b)
64+
(Coarbitrary a) => Coarbitrary (Maybe a)
65+
(Coarbitrary a, Coarbitrary b) => Coarbitrary (Either a b)
66+
(Coarbitrary a) => Coarbitrary (List a)
67+
(Coarbitrary a) => Coarbitrary (Identity a)
68+
(Coarbitrary a) => Coarbitrary (Lazy a)
6369
```
6470

6571

docs/Test/QuickCheck/Data/AlphaNumString.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ alphanumeric strings.
1212

1313
##### Instances
1414
``` purescript
15-
instance arbAlphaNumString :: Arbitrary AlphaNumString
16-
instance coarbAlphaNumString :: Coarbitrary AlphaNumString
15+
Arbitrary AlphaNumString
16+
Coarbitrary AlphaNumString
1717
```
1818

1919
#### `runAlphaNumString`

docs/Test/QuickCheck/Data/ApproxNumber.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ for precision erros when comparing.
1212

1313
##### Instances
1414
``` purescript
15-
instance arbitraryApproxNumber :: Arbitrary ApproxNumber
16-
instance coarbitraryApproxNumber :: Coarbitrary ApproxNumber
17-
instance eqApproxNumber :: Eq ApproxNumber
18-
instance ordApproxNumber :: Ord ApproxNumber
19-
instance semiringApproxNumber :: Semiring ApproxNumber
20-
instance moduloSemiringApproxNumber :: ModuloSemiring ApproxNumber
21-
instance ringApproxNumber :: Ring ApproxNumber
22-
instance divisionRingApproxNumber :: DivisionRing ApproxNumber
23-
instance numApproxNumber :: Num ApproxNumber
15+
Arbitrary ApproxNumber
16+
Coarbitrary ApproxNumber
17+
Eq ApproxNumber
18+
Ord ApproxNumber
19+
Semiring ApproxNumber
20+
ModuloSemiring ApproxNumber
21+
Ring ApproxNumber
22+
DivisionRing ApproxNumber
23+
Num ApproxNumber
2424
```
2525

2626
#### `(=~=)`

docs/Test/QuickCheck/Gen.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ Run a random generator, keeping only the randomly-generated result
166166
#### `sample`
167167

168168
``` purescript
169-
sample :: forall r a. Seed -> Size -> Gen a -> Array a
169+
sample :: forall a. Seed -> Size -> Gen a -> Array a
170170
```
171171

172172
Sample a random generator

docs/Test/QuickCheck/LCG.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ It is equal to 2^31 - 1, a Mersenne prime. It is useful for this value to
2727
be prime, because then the requirement of the initial seed being coprime
2828
to the modulus is satisfied when the seed is between 1 and lcgN - 1.
2929

30+
#### `lcgPerturb`
31+
32+
``` purescript
33+
lcgPerturb :: Number -> Seed -> Seed
34+
```
35+
36+
Perturb a seed value
37+
3038
#### `lcgNext`
3139

3240
``` purescript
@@ -55,8 +63,8 @@ seed for the generator.
5563

5664
##### Instances
5765
``` purescript
58-
instance showSeed :: Show Seed
59-
instance eqSeed :: Eq Seed
66+
Show Seed
67+
Eq Seed
6068
```
6169

6270
#### `mkSeed`

src/Test/QuickCheck/Gen.purs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@ import Control.Monad.Eff.Random (RANDOM())
3434
import Control.Monad.State (State(), runState, evalState)
3535
import Control.Monad.State.Class (state, modify)
3636
import Control.Monad.Rec.Class (MonadRec, tailRecM)
37+
import Math ((%))
3738
import Data.Array ((!!), length)
3839
import Data.Tuple (Tuple(..))
3940
import Data.Foldable (fold)
40-
import Data.Int (toNumber)
41+
import Data.Int (toNumber, fromNumber)
4142
import Data.Maybe (fromMaybe)
43+
import Data.Maybe.Unsafe as U
4244
import Data.Monoid.Additive (Additive(..), runAdditive)
4345
import Data.Tuple (Tuple(..), fst, snd)
4446
import Data.Either (Either(..))
@@ -60,7 +62,7 @@ type Gen a = State GenState a
6062

6163
-- | Create a random generator for a function type.
6264
repeatable :: forall a b. (a -> Gen b) -> Gen (a -> b)
63-
repeatable f = state $ \s -> Tuple (\a -> fst (runGen (f a) s)) s
65+
repeatable f = state $ \s -> Tuple (\a -> fst (runGen (f a) s)) (s { newSeed = lcgNext s.newSeed })
6466

6567
-- | Create a random generator which uses the generator state explicitly.
6668
stateful :: forall a. (GenState -> Gen a) -> Gen a
@@ -187,7 +189,5 @@ foreign import float32ToInt32 :: Number -> Int
187189
-- | Perturb a random generator by modifying the current seed
188190
perturbGen :: forall a. Number -> Gen a -> Gen a
189191
perturbGen n gen = do
190-
modify \s -> s { newSeed = perturb s.newSeed }
192+
modify \s -> s { newSeed = lcgPerturb (toNumber (float32ToInt32 n)) s.newSeed }
191193
gen
192-
where
193-
perturb oldSeed = mkSeed (runSeed (lcgNext (mkSeed (float32ToInt32 n))) + runSeed oldSeed)

src/Test/QuickCheck/LCG.purs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module Test.QuickCheck.LCG
66
, lcgC
77
, lcgN
88
, lcgNext
9+
, lcgPerturb
910
, randomSeed
1011
) where
1112

@@ -32,11 +33,15 @@ lcgC = 0
3233
lcgN :: Int
3334
lcgN = 2147483647
3435

36+
-- | Perturb a seed value
37+
lcgPerturb :: Number -> Seed -> Seed
38+
lcgPerturb d = Seed <<< go <<< runSeed
39+
where
40+
go n = U.fromJust $ fromNumber $ (toNumber lcgM * toNumber n + d) % toNumber lcgN
41+
3542
-- | Step the linear congruential generator
3643
lcgNext :: Seed -> Seed
37-
lcgNext = Seed <<< go <<< runSeed
38-
where
39-
go n = U.fromJust $ fromNumber $ (toNumber lcgM * toNumber n + toNumber lcgC) % toNumber lcgN
44+
lcgNext = lcgPerturb (toNumber lcgC)
4045

4146
-- | Create a random seed
4247
randomSeed :: forall e. Eff (random :: RANDOM | e) Seed

0 commit comments

Comments
 (0)