multivariant-0.1.0.1: app/Task/Pretty.hs
{-|
Module : Task.Pretty
Description : Pretty printing task elements
Copyright : (c) Anton Marchenko, Mansur Ziatdinov, 2016-2017
License : BSD-3
Maintainer : gltronred@gmail.com
Stability : experimental
Portability : POSIX
This module provides functions to pretty print variants, e.g. text description, solution,
input/output, test cases.
See "Task" module for more description
-}
{-# LANGUAGE OverloadedStrings #-}
module Task.Pretty where
import Task.Types
import Control.Monad
import Data.Text.Lazy (Text)
import qualified Data.Text.Lazy as T
import Data.Text.Lazy.Builder
import Data.Text.Lazy.Builder.Int
import qualified Data.Text.Lazy.IO as TIO
-- | Outputs a line of given chars
hline :: Char -> IO ()
hline = TIO.putStrLn . T.replicate 80 . T.singleton
-- | Outputs a number
int :: Integral a => a -> Text
int = toLazyText . decimal
-- | Prints a list of numbers
printList :: Integral a => [a] -> IO ()
printList = TIO.putStr . T.intercalate ", " . map (toLazyText . decimal)
-- | Prints an input
printInput :: Input -> IO ()
printInput (xs,ys) = do
TIO.putStr "["
printList xs
TIO.putStr "], ["
printList ys
-- TIO.putStr $ sh ys
TIO.putStr "]"
-- | Outputs anything (not optimal performance, uses conversion to String)
sh :: Show a => a -> Text
sh = toLazyText . fromString . show
-- | Pretty prints a variant
printTask :: Int -- ^ Variant number
-> Text -- ^ Text
-> [Input] -- ^ Example inputs
-> (Input -> Output) -- ^ Solution (it is launched on example inputs and corresponding input-output pairs are printed)
-> [(Input, Output)] -- ^ Test cases
-> IO ()
printTask i varDesc varInputs varSol varTests = do
hline '='
TIO.putStr "Variant "
TIO.putStrLn (int i)
hline '-'
TIO.putStrLn varDesc
hline '-'
forM_ varInputs $ \input -> do
TIO.putStr "* "
printInput input
TIO.putStr "\t ==> \t"
TIO.putStrLn (sh $ varSol input)
hline '-'
forM_ varTests $ \(input, output) -> do
TIO.putStr "* "
printInput input
TIO.putStr "\t /// \t"
TIO.putStr (sh output)
TIO.putStr "\t ==> \t"
TIO.putStrLn (sh $ varSol input)
hline '='