module BishBosh.Attribute.WeightedMeanAndCriterionValues(
WeightedMeanAndCriterionValues(
getWeightedMean,
getCriterionValues
),
criterionValuesTag,
weightedMeanTag,
negateWeightedMean,
mkWeightedMeanAndCriterionValues
) where
import qualified BishBosh.Property.ShowFloat as Property.ShowFloat
import qualified BishBosh.Text.ShowList as Text.ShowList
import qualified Control.DeepSeq
criterionValuesTag :: String
criterionValuesTag = "criterion-values"
weightedMeanTag :: String
weightedMeanTag = "weighted-mean"
data WeightedMeanAndCriterionValues weightedMean criterionValue = MkWeightedMeanAndCriterionValues {
getWeightedMean :: weightedMean,
getCriterionValues :: [criterionValue]
} deriving (Eq, Show)
instance Control.DeepSeq.NFData weightedMean => Control.DeepSeq.NFData (WeightedMeanAndCriterionValues weightedMean criterionValue) where
rnf MkWeightedMeanAndCriterionValues { getWeightedMean = weightedMean } = Control.DeepSeq.rnf weightedMean
instance (Real criterionValue, Real weightedMean) => Property.ShowFloat.ShowFloat (WeightedMeanAndCriterionValues weightedMean criterionValue) where
showsFloat fromDouble MkWeightedMeanAndCriterionValues {
getWeightedMean = weightedMean,
getCriterionValues = criterionValues
} = Text.ShowList.showsAssociationList' [
(weightedMeanTag, fromDouble $ realToFrac weightedMean),
(criterionValuesTag, Text.ShowList.showsFormattedList' (fromDouble . realToFrac) criterionValues)
]
mkWeightedMeanAndCriterionValues :: weightedMean -> [criterionValue] -> WeightedMeanAndCriterionValues weightedMean criterionValue
mkWeightedMeanAndCriterionValues = MkWeightedMeanAndCriterionValues
negateWeightedMean :: Num weightedMean => WeightedMeanAndCriterionValues weightedMean criterionValue -> WeightedMeanAndCriterionValues weightedMean criterionValue
negateWeightedMean weightedMeanAndCriterionValues@MkWeightedMeanAndCriterionValues { getWeightedMean = weightedMean } = weightedMeanAndCriterionValues { getWeightedMean = negate weightedMean }