{-# 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 (<$>)