{-# LANGUAGE PatternGuards #-}

-- | Pretty printing benchmark results.
module BuildBox.Benchmark.Pretty
	( pprBenchResultAspectHeader
	, pprBenchResultAspect)
where
import BuildBox.Benchmark.Base
import BuildBox.Benchmark.TimeAspect
import BuildBox.Pretty

-- | Header to use when pretty printing benchmark results.
pprBenchResultAspectHeader :: Doc
pprBenchResultAspectHeader 
	=  vcat
	[ text "    aspect       min   ref%   avg   ref%   max   ref%   spread% "
	, text "    ---------    ----------   ----------   ----------   ------- " ]


-- | Pretty print an aspect of a benchmark result.
--   If the given aspect does not exist in the result then `Nothing`.
pprBenchResultAspect 
	:: TimeAspect 			-- ^ Aspect of the result to print.
	-> Maybe BenchResult		-- ^ Optional prior result for comparison.
	-> BenchResult			-- ^ The result to print.
	-> Maybe Doc

pprBenchResultAspect aspect prior result
 	| Just (tmin,  tavg,  tmax)	<- takeMinAvgMaxOfBenchResult aspect result
	, spread			<- tmax - tmin
	, spreadPercent			<- (floor $ (spread / tavg) * 100) :: Integer
	, Just result'			<- prior
	, Just (tmin', tavg', tmax')	<- takeMinAvgMaxOfBenchResult aspect result'
	= Just	$   text "    "
		<>  padL 10 (ppr aspect)
		<+> (padR 12 $ pprFloatRef tmin tmin')
		<+> (padR 12 $ pprFloatRef tavg tavg')
		<+> (padR 12 $ pprFloatRef tmax tmax')
		<+> (padR 8  $ ppr spreadPercent)

 	| Just (tmin, tavg, tmax)	<- takeMinAvgMaxOfBenchResult aspect result
	, spread			<- tmax - tmin
	, spreadPercent			<- (floor $ (spread / tavg) * 100) :: Integer
	= Just	$   text "    "
		<>  padL 10 (ppr aspect)
		<+> (padR 12 $ (pprFloatTime tmin <> text "     "))
		<+> (padR 12 $ (pprFloatTime tavg <> text "     "))
		<+> (padR 12 $ (pprFloatTime tmax <> text "     "))
		<+> (padR 8 $ ppr spreadPercent)
	
	| otherwise
	= Nothing