@@ -60,6 +60,8 @@ module System.Random.Internal
60
60
, uniformFloatPositive01M
61
61
, uniformEnumM
62
62
, uniformEnumRM
63
+ , isInRangeOrd
64
+ , isInRangeEnum
63
65
64
66
-- * Generators for sequences of pseudo-random bytes
65
67
, uniformByteStringM
@@ -997,7 +999,9 @@ class UniformRange a where
997
999
-- > isInRange (lo, hi) lo' && isInRange (lo, hi) hi' && isInRange (lo', hi') x
998
1000
-- > ==> isInRange (lo, hi) x
999
1001
--
1000
- -- There is a default implementation of 'isInRange' via 'Generic'.
1002
+ -- There is a default implementation of 'isInRange' via 'Generic'. Other helper function
1003
+ -- that can be used for implementing this function are `isInRangeOrd` and
1004
+ -- `isInRangeEnum`
1001
1005
--
1002
1006
-- @since 1.3.0
1003
1007
isInRange :: (a , a ) -> a -> Bool
@@ -1036,9 +1040,20 @@ instance (GUniformRange f, GUniformRange g) => GUniformRange (f :*: g) where
1036
1040
gisInRange (x1 :*: y1, x2 :*: y2) (x3 :*: y3) =
1037
1041
gisInRange (x1, x2) x3 && gisInRange (y1, y2) y3
1038
1042
1043
+ -- | Utilize `Ord` instance to decide if a value is within the range. Designed to be used
1044
+ -- for implementing `isInRange`
1045
+ --
1046
+ -- @since 1.3.0
1039
1047
isInRangeOrd :: Ord a => (a , a ) -> a -> Bool
1040
1048
isInRangeOrd (a, b) x = min a b <= x && x <= max a b
1041
1049
1050
+ -- | Utilize `Enum` instance to decide if a value is within the range. Designed to be used
1051
+ -- for implementing `isInRange`
1052
+ --
1053
+ -- @since 1.3.0
1054
+ isInRangeEnum :: Enum a => (a , a ) -> a -> Bool
1055
+ isInRangeEnum (a, b) x = isInRangeOrd (fromEnum a, fromEnum b) (fromEnum x)
1056
+
1042
1057
instance UniformRange Integer where
1043
1058
uniformRM = uniformIntegralM
1044
1059
{-# INLINE uniformRM #-}
0 commit comments