packages feed

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 '='