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]