module BishBosh.Attribute.CriterionWeight(
CriterionWeight(
deconstruct
),
mkCriterionWeight
) where
import qualified BishBosh.Data.Exception as Data.Exception
import qualified BishBosh.Data.Num as Data.Num
import qualified BishBosh.Text.ShowList as Text.ShowList
import qualified Control.DeepSeq
import qualified Control.Exception
import qualified Data.Default
import qualified Text.XML.HXT.Arrow.Pickle as HXT
newtype CriterionWeight criterionWeight = MkCriterionWeight {
deconstruct :: criterionWeight
} deriving (Eq, Ord)
instance Show criterionWeight => Show (CriterionWeight criterionWeight) where
showsPrec _ (MkCriterionWeight criterionWeight) = shows criterionWeight
instance Num criterionWeight => Bounded (CriterionWeight criterionWeight) where
minBound = MkCriterionWeight 0
maxBound = MkCriterionWeight 1
instance Num criterionWeight => Data.Default.Default (CriterionWeight criterionWeight) where
def = minBound
instance Control.DeepSeq.NFData criterionWeight => Control.DeepSeq.NFData (CriterionWeight criterionWeight) where
rnf (MkCriterionWeight criterionWeight) = Control.DeepSeq.rnf criterionWeight
instance (
HXT.XmlPickler criterionWeight,
Num criterionWeight,
Ord criterionWeight,
Show criterionWeight
) => HXT.XmlPickler (CriterionWeight criterionWeight) where
xpickle = HXT.xpWrap (mkCriterionWeight, deconstruct) HXT.xpickle
mkCriterionWeight :: (
Num criterionWeight,
Ord criterionWeight,
Show criterionWeight
) => criterionWeight -> CriterionWeight criterionWeight
mkCriterionWeight criterionWeight
| Data.Num.inClosedUnitInterval criterionWeight = MkCriterionWeight criterionWeight
| otherwise = Control.Exception.throw . Data.Exception.mkOutOfBounds . showString "BishBosh.Attribute.CriterionWeight.mkCriterionWeight:\tweight" . Text.ShowList.showsAssociation $ shows criterionWeight " must be within the closed unit-interval, '[0,1]'."