packages feed

csv-nptools-0.4.1: Utils.hs

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