module TextHistogram ( printHistogram, ) where import Control.Monad (forM_, when) import Statistics.Test.ApproxRand import System.IO (hPutStrLn, stderr) import Text.Printf (printf) import Histogram printHistogram :: Int -> TestResult -> IO () printHistogram bins result@(TestResult _ score _) = case histogram bins result of Left err -> hPutStrLn stderr err Right hist -> let bucketSize = (fst $ hist !! 1) - (fst $ head hist) bucketHalf = bucketSize / 2 charsPerDot = (maximum $ map snd hist) `div` 50 in forM_ hist $ \(label, freq) -> do let blocks = freq `div` charsPerDot when (blocks > 0) $ do let lower = label - bucketHalf let barChar = if score >= lower && score < lower + bucketSize then '✣' else '█' putStr $ printf "%12.3e | " $ lower + bucketHalf putStrLn $ replicate blocks barChar