falsify-0.1.0: src/Test/Falsify/Internal/Range.hs
-- | Internal 'Range' API
module Test.Falsify.Internal.Range (
-- * Definition
Range(..)
, ProperFraction(ProperFraction)
, Precision(..)
) where
import Data.Word
import GHC.Show
import GHC.Stack
{-------------------------------------------------------------------------------
Proper frations
-------------------------------------------------------------------------------}
-- | Value @x@ such that @0 <= x < 1@
newtype ProperFraction = UnsafeProperFraction { getProperFraction :: Double }
deriving stock (Eq, Ord)
deriving newtype (Num, Fractional)
-- | Show instance relies on the 'ProperFraction' pattern synonym
instance Show ProperFraction where
showsPrec p (UnsafeProperFraction f) = showParen (p >= appPrec1) $
showString "ProperFraction "
. showsPrec appPrec1 f
mkProperFraction :: HasCallStack => Double -> ProperFraction
mkProperFraction f
| 0 <= f && f < 1 = UnsafeProperFraction f
| otherwise = error $ "mkProperFraction: not a proper fraction: " ++ show f
pattern ProperFraction :: Double -> ProperFraction
pattern ProperFraction f <- (getProperFraction -> f)
where
ProperFraction = mkProperFraction
{-# COMPLETE ProperFraction #-}
{-------------------------------------------------------------------------------
Precision
-------------------------------------------------------------------------------}
-- | Precision (in bits)
newtype Precision = Precision Word8
deriving stock (Show, Eq, Ord)
deriving newtype (Num, Enum)
{-------------------------------------------------------------------------------
Range
-------------------------------------------------------------------------------}
-- | Range of values
data Range a =
Constant a
| FromProperFraction Precision (ProperFraction -> a)
| Towards a [Range a]
deriving stock (Functor)