packages feed

ascii-art-to-unicode-0.1.0.0: app/Main.hs

{-# LANGUAGE LambdaCase #-}
module Main where

import           System.Environment
import qualified System.IO.Strict as Strict
import           Text.AsciiArt

data Mode
    = Inplace FilePath
    | Read FilePath
    | Pipe

main :: IO ()
main = do
    mode <- getArgs <&> \case
        []           -> Pipe
        ["-i", file] -> Inplace file
        [file]       -> Read file
        _            -> error "Usage: \n\
                              \    aa2u            # reads from stdin, prints to stdout\n\
                              \    aa2u FILE       # reads FILE, prints to stdout\n\
                              \    aa2u -i FILE    # reads from and writes to FILE\n"
    input <- case mode of
        Inplace file -> Strict.readFile file
        Read    file -> readFile file
        Pipe         -> getContents
    let inputLines = lines input
        plane = planeFromList ' ' inputLines
        width = maximum (fmap length inputLines)
        height = length inputLines
    let unicodeArt
            = unlines
            . fmap trimRight
            . planeToList height width
            . renderAsciiToUnicode
            $ plane
    case mode of
        Inplace file -> writeFile file unicodeArt
        Read    _    -> putStr unicodeArt
        Pipe         -> putStr unicodeArt

trimRight :: String -> String
trimRight = reverse . dropWhile (== ' ') . reverse

(<&>) :: Functor f => f a -> (a -> b) -> f b
(<&>) = flip (<$>)