module BuildBox.Data.Comparison ( -- * Comparisons Comparison (..) , makeComparison) where import BuildBox.Pretty import Text.Printf -- | The comparison of two values. data Comparison a -- | Comparison of a recent value with a baseline. = Comparison { comparisonBaseline :: a , comparisonRecent :: a , comparisonSwing :: Double } -- | A new value that doesn't have a baseline. | ComparisonNew { comparisonNew :: a } deriving (Read, Show) instance Pretty a => Pretty (Comparison a) where ppr (Comparison _ recent ratio) | abs ratio < 0.01 = text $ printf "%s (----)" (render $ ppr recent) | otherwise = text $ printf "%s (%+4.0f)" (render $ ppr recent) (ratio * 100) ppr (ComparisonNew new) = (padL 10 $ ppr new) -- | Make a comparison from two values. makeComparison :: Real a => a -> a -> Comparison a makeComparison base recent = Comparison base recent swing where dBase = fromRational $ toRational base dRecent = fromRational $ toRational recent swing = ((dRecent - dBase) / dBase)