1module Spec.Range 2 ( symmetric 3 , bounded 4 , singleton 5 , uniformRangeWithin 6 , uniformRangeWithinExcludedF 7 , uniformRangeWithinExcludedD 8 ) where 9 10import System.Random.Internal 11import System.Random.Stateful 12import Data.Proxy 13 14symmetric :: (RandomGen g, UniformRange a, Eq a) => Proxy a -> g -> (a, a) -> Bool 15symmetric _ g (l, r) = fst (uniformR (l, r) g) == fst (uniformR (r, l) g) 16 17bounded :: (RandomGen g, UniformRange a, Ord a) => Proxy a -> g -> (a, a) -> Bool 18bounded _ g (l, r) = bottom <= result && result <= top 19 where 20 bottom = min l r 21 top = max l r 22 result = fst (uniformR (l, r) g) 23 24singleton :: (RandomGen g, UniformRange a, Eq a) => Proxy a -> g -> a -> Bool 25singleton _ g x = result == x 26 where 27 result = fst (uniformR (x, x) g) 28 29uniformRangeWithin :: (RandomGen g, UniformRange a, Ord a) => Proxy a -> g -> (a, a) -> Bool 30uniformRangeWithin _ gen (l, r) = 31 runStateGen_ gen $ \g -> 32 (\result -> min l r <= result && result <= max l r) <$> uniformRM (l, r) g 33 34uniformRangeWithinExcludedF :: RandomGen g => g -> Bool 35uniformRangeWithinExcludedF gen = 36 runStateGen_ gen $ \g -> 37 (\result -> 0 < result && result <= 1) <$> uniformFloatPositive01M g 38 39uniformRangeWithinExcludedD :: RandomGen g => g -> Bool 40uniformRangeWithinExcludedD gen = 41 runStateGen_ gen $ \g -> 42 (\result -> 0 < result && result <= 1) <$> uniformDoublePositive01M g 43