{-# LANGUAGE CPP #-}
module BishBosh.Metric.CriterionValue(
CriterionValue(),
) where
import qualified BishBosh.Type.Mass as Type.Mass
#ifdef USE_NEWTYPE_WRAPPERS
import qualified BishBosh.Data.Exception as Data.Exception
import qualified Control.Exception
newtype CriterionValue = MkCriterionValue Type.Mass.CriterionValue deriving (Eq, Ord)
instance Show CriterionValue where
showsPrec precedence (MkCriterionValue criterionValue) = showsPrec precedence criterionValue
instance Num CriterionValue where
MkCriterionValue l + MkCriterionValue r = mkCriterionValue $! l + r
MkCriterionValue l * MkCriterionValue r = MkCriterionValue $! l * r
abs (MkCriterionValue criterionValue) = MkCriterionValue $! abs criterionValue
signum (MkCriterionValue criterionValue) = MkCriterionValue $! signum criterionValue
fromInteger = mkCriterionValue . fromInteger
negate (MkCriterionValue criterionValue) = MkCriterionValue $! negate criterionValue
instance Fractional CriterionValue where
MkCriterionValue l / MkCriterionValue r = mkCriterionValue $! l / r
fromRational = mkCriterionValue . fromRational
instance Real CriterionValue where
toRational (MkCriterionValue criterionValue) = toRational criterionValue
mkCriterionValue :: Type.Mass.CriterionValue -> CriterionValue
mkCriterionValue criterionValue
| abs criterionValue > 1 = Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Metric.CriterionValue.mkCriterionValue:\t" $ shows criterionValue " must be within the closed interval '[-1,1]'."
| otherwise = MkCriterionValue criterionValue
#else
type CriterionValue = Type.Mass.CriterionValue
#endif