@@ -71,7 +71,7 @@ import Data.Array as A
7171import Data.Array.Partial as AP
7272import Data.Char (fromCharCode )
7373import Data.Foldable (fold )
74- import Data.Int (fromNumber , toNumber )
74+ import Data.Int (toNumber )
7575import Data.Lazy (Lazy , defer )
7676import Data.List as L
7777import Data.Machine.Mealy as Mealy
@@ -180,7 +180,7 @@ resize sz g = GenT $ lmap (stateM (\s -> s { size = sz })) (unGen g)
180180
181181-- | A generator for characters.
182182charGen :: forall f . Monad f => GenT f Char
183- charGen = fromCharCode <$> chooseInt 0.0 65535.0
183+ charGen = fromCharCode <$> chooseInt 0 65535
184184
185185-- | Creates a generator that generates real numbers between the specified
186186-- | inclusive range.
@@ -192,20 +192,19 @@ choose a b = (*) (max - min) >>> (+) min <$> uniform
192192
193193-- | Creates a generator that generates integers between the specified
194194-- | 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
203202
204203-- | Creates a generator that chooses another generator from the specified list
205204-- | at random, and then generates a value with that generator.
206205oneOf :: forall f a . Monad f => GenT f a -> Array (GenT f a ) -> GenT f a
207206oneOf x xs = do
208- n <- chooseInt 0.0 (toNumber ( A .length xs) )
207+ n <- chooseInt 0 ( A .length xs)
209208 if n == 0 then x else fromMaybe x (xs A .!! (n - 1 ))
210209
211210-- | Generates elements by the specified frequencies (which will be normalized).
@@ -217,7 +216,7 @@ frequency
217216 -> GenT f a
218217frequency x xs = do
219218 let xxs :: L.List (Tuple Number (GenT f a ))
220- xxs = L.Cons x xs
219+ xxs = L.Cons x xs
221220
222221 total :: Number
223222 total = unwrap $ fold ((Additive <<< fst) <$> xxs)
@@ -226,19 +225,19 @@ frequency x xs = do
226225 pick _ d L.Nil = d
227226 pick n d (L.Cons (Tuple k x) xs) = if n <= k then x else pick (n - k) d xs
228227
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
231230
232231-- | Creates a generator of elements ranging from 0 to the maximum size.
233232arrayOf :: forall f a . Monad f => GenT f a -> GenT f (Array a )
234233arrayOf g = sized \n -> do
235- k <- chooseInt 0.0 (toNumber n)
234+ k <- chooseInt 0 n
236235 vectorOf k g
237236
238237-- | Creates a generator of elements ranging from 1 to the maximum size.
239238arrayOf1 :: forall f a . Monad f => GenT f a -> GenT f (Tuple a (Array a ))
240239arrayOf1 g = sized \n -> do
241- k <- chooseInt 0.0 (toNumber n)
240+ k <- chooseInt 0 n
242241 x <- g
243242 xs <- vectorOf (k - 1 ) g
244243 pure $ Tuple x xs
@@ -254,7 +253,7 @@ vectorOf n g = transGen f [] (extend n g)
254253-- | Creates a generator that chooses an element from among a set of elements.
255254elements :: forall f a . Monad f => a -> L.List a -> GenT f a
256255elements x xs = do
257- n <- chooseInt 0.0 (toNumber ( L .length xs) )
256+ n <- chooseInt 0 ( L .length xs)
258257 pure if n == 0 then x else fromMaybe x (xs L .!! (n - 1 ))
259258
260259foreign import float32ToInt32 :: Number -> Int
@@ -529,7 +528,7 @@ shuffleArray = shuffle0 []
529528 where
530529 shuffle0 acc [] = pure $ acc
531530 shuffle0 acc xs = do
532- i <- chooseInt 0.0 (toNumber ( A .length xs - 1 ) )
531+ i <- chooseInt 0 ( A .length xs - 1 )
533532 let acc' = acc <> (maybe [] A .singleton (xs A .!! i))
534533 xs' = fromMaybe xs $ A .deleteAt i xs
535534 shuffle0 acc' xs'
0 commit comments