@@ -71,7 +71,7 @@ import Data.Array as A
71
71
import Data.Array.Partial as AP
72
72
import Data.Char (fromCharCode )
73
73
import Data.Foldable (fold )
74
- import Data.Int (fromNumber , toNumber )
74
+ import Data.Int (toNumber )
75
75
import Data.Lazy (Lazy , defer )
76
76
import Data.List as L
77
77
import Data.Machine.Mealy as Mealy
@@ -180,7 +180,7 @@ resize sz g = GenT $ lmap (stateM (\s -> s { size = sz })) (unGen g)
180
180
181
181
-- | A generator for characters.
182
182
charGen :: forall f . Monad f => GenT f Char
183
- charGen = fromCharCode <$> chooseInt 0.0 65535.0
183
+ charGen = fromCharCode <$> chooseInt 0 65535
184
184
185
185
-- | Creates a generator that generates real numbers between the specified
186
186
-- | inclusive range.
@@ -192,20 +192,19 @@ choose a b = (*) (max - min) >>> (+) min <$> uniform
192
192
193
193
-- | Creates a generator that generates integers between the specified
194
194
-- | inclusive range.
195
- chooseInt :: forall f . Monad f => Number -> Number -> GenT f Int
196
- chooseInt a b =
197
- let min = M .ceil (M .min a b)
198
- max = M .floor (M .max a b)
199
- numRes = ((+) (min - 0.5 ) <<< (*) (max - min + 1.0 )) <$> uniform
200
- rounded = M .round <$> numRes
201
- intRes = fromNumber <$> rounded
202
- in fromMaybe 0 <$> intRes
195
+ chooseInt :: forall f . Monad f => Int -> Int -> GenT f Int
196
+ chooseInt a b = clamp <$> lcgStep
197
+ where
198
+ clamp :: Int -> Int
199
+ clamp x = case x `mod` (b - a + one) of
200
+ r | r >= 0 -> a + r
201
+ | otherwise -> b + r + one
203
202
204
203
-- | Creates a generator that chooses another generator from the specified list
205
204
-- | at random, and then generates a value with that generator.
206
205
oneOf :: forall f a . Monad f => GenT f a -> Array (GenT f a ) -> GenT f a
207
206
oneOf x xs = do
208
- n <- chooseInt 0.0 (toNumber ( A .length xs) )
207
+ n <- chooseInt 0 ( A .length xs)
209
208
if n == 0 then x else fromMaybe x (xs A .!! (n - 1 ))
210
209
211
210
-- | Generates elements by the specified frequencies (which will be normalized).
@@ -217,7 +216,7 @@ frequency
217
216
-> GenT f a
218
217
frequency x xs = do
219
218
let xxs :: L.List (Tuple Number (GenT f a ))
220
- xxs = L.Cons x xs
219
+ xxs = L.Cons x xs
221
220
222
221
total :: Number
223
222
total = unwrap $ fold ((Additive <<< fst) <$> xxs)
@@ -226,19 +225,19 @@ frequency x xs = do
226
225
pick _ d L.Nil = d
227
226
pick n d (L.Cons (Tuple k x) xs) = if n <= k then x else pick (n - k) d xs
228
227
229
- n <- chooseInt 1.0 total
230
- pick (toNumber n) (snd x) xxs
228
+ n <- choose 1.0 total
229
+ pick n (snd x) xxs
231
230
232
231
-- | Creates a generator of elements ranging from 0 to the maximum size.
233
232
arrayOf :: forall f a . Monad f => GenT f a -> GenT f (Array a )
234
233
arrayOf g = sized \n -> do
235
- k <- chooseInt 0.0 (toNumber n)
234
+ k <- chooseInt 0 n
236
235
vectorOf k g
237
236
238
237
-- | Creates a generator of elements ranging from 1 to the maximum size.
239
238
arrayOf1 :: forall f a . Monad f => GenT f a -> GenT f (Tuple a (Array a ))
240
239
arrayOf1 g = sized \n -> do
241
- k <- chooseInt 0.0 (toNumber n)
240
+ k <- chooseInt 0 n
242
241
x <- g
243
242
xs <- vectorOf (k - 1 ) g
244
243
pure $ Tuple x xs
@@ -254,7 +253,7 @@ vectorOf n g = transGen f [] (extend n g)
254
253
-- | Creates a generator that chooses an element from among a set of elements.
255
254
elements :: forall f a . Monad f => a -> L.List a -> GenT f a
256
255
elements x xs = do
257
- n <- chooseInt 0.0 (toNumber ( L .length xs) )
256
+ n <- chooseInt 0 ( L .length xs)
258
257
pure if n == 0 then x else fromMaybe x (xs L .!! (n - 1 ))
259
258
260
259
foreign import float32ToInt32 :: Number -> Int
@@ -529,7 +528,7 @@ shuffleArray = shuffle0 []
529
528
where
530
529
shuffle0 acc [] = pure $ acc
531
530
shuffle0 acc xs = do
532
- i <- chooseInt 0.0 (toNumber ( A .length xs - 1 ) )
531
+ i <- chooseInt 0 ( A .length xs - 1 )
533
532
let acc' = acc <> (maybe [] A .singleton (xs A .!! i))
534
533
xs' = fromMaybe xs $ A .deleteAt i xs
535
534
shuffle0 acc' xs'
0 commit comments