module Utils where import System.IO import Database.TxtSushi.FlatFile import Data.Char -- import Debug.Trace type Tbl = [[String]] mapTable ::(Tbl -> Tbl) -> String -> String mapTable f = formatTable csvFormat . f . parseTable csvFormat padTbl :: a -> [[a]] -> [[a]] padTbl _ [] = [] padTbl dflt xss0@(xs0:_) = zipWith (padRow cols) [1::Int ..] $ xss0 where cols = length xs0 -- padRow = take cols (xs ++ repeat dflt) padRow 0 _ [] = [] padRow 0 i _ = error $ "Row " ++ show i ++ " is too long" padRow n _ [] = replicate n dflt padRow n i (x:xs) = x : padRow (n - 1) i xs getContentsFromFileOrStdin :: FilePath -> IO String getContentsFromFileOrStdin "-" = hSetEncoding stdin latin1 >> getContents getContentsFromFileOrStdin fp = readFile fp interactTable ::(Tbl -> Tbl) -> FilePath -> IO () interactTable f = (putStr . mapTable f =<<) . getContentsFromFileOrStdin evalChar :: Char -> Char evalChar 'a' = '\a' evalChar 'b' = '\b' evalChar 'f' = '\f' evalChar 'n' = '\n' evalChar 'r' = '\r' evalChar 't' = '\t' evalChar 'v' = '\v' evalChar x = x evalStr :: String -> String evalStr ('\\':'0':'x':x:y:xs) = chr (16 * digitToInt x + digitToInt y) : evalStr xs evalStr ('\\':x:xs) = evalChar x : evalStr xs evalStr (x:xs) = x : evalStr xs evalStr [] = [] expandRanges :: String -> String expandRanges (x:'-':y:zs) = [x..y]++expandRanges zs expandRanges (x:xs) = x : expandRanges xs expandRanges [] = [] addDefaultInput :: [String] -> [String] addDefaultInput [] = ["-"] addDefaultInput xs = xs getInput :: String -> [String] -> String getInput _ [] = "-" getInput _ [x] = x getInput d _ = d substChar :: Eq a => a -> a -> (a -> a) substChar s d x | x == s = d | otherwise = x zipWith' :: [c] -> (a -> b -> c) -> [a] -> [b] -> [c] zipWith' _ _ [] [] = [] zipWith' d f (x:xs) (y:ys) = f x y : zipWith' d f xs ys zipWith' d _ _ _ = d