module BuildBox.Data.Range ( Range (..) , makeRange , flattenRange) where import BuildBox.Pretty import BuildBox.Data.Dividable -- | A range extracted from many-valued data. data Range a = Range { rangeMin :: a , rangeAvg :: a , rangeMax :: a } deriving (Read, Show) instance Pretty a => Pretty (Range a) where ppr (Range mi av mx) = (ppr mi) <+> text "/" <+> (ppr av) <+> text "/" <+> (ppr mx) instance Functor Range where fmap f (Range mi av mx) = Range (f mi) (f av) (f mx) -- | Make statistics from a list of values. makeRange :: (Real a, Dividable a) => [a] -> Range a makeRange xs = Range (minimum xs) (sum xs `divide` (fromIntegral $ length xs)) (maximum xs) -- | Flatten a `Range` into a list of its min, avg and max values. flattenRange :: Range a -> [a] flattenRange (Range mi av mx) = [mi, av, mx]