import ArrayStuff
import Text.CSV
+-- Command-line interface with simple tab-separated input/output formats.
+-- ./match <example.in
+
-- pretty silly but it does the job
swapTabCommaIn s = map (\c -> if c == '\t' then ',' else if c == ',' then '\t' else c) s
removeQuotes s = filter (\c -> not (c == '"')) s
-parseTSV fname str = case parseCSV fname (swapTabCommaIn str) of
+
+-- Some versions of Text.CSV do not use or accept a trailing newline; compensate for that.
+removeTrailingNewline s = if not (null s) && last s == '\n' then init s else s
+addTrailingNewline s = if not (null s) && last s /= '\n' then s ++ ['\n'] else s
+
+parseTSV fname str = case parseCSV fname (swapTabCommaIn $ removeTrailingNewline str) of
Left pe -> Left pe
Right ll -> Right $ map (map swapTabCommaIn) ll
-printTSV ll = removeQuotes $ swapTabCommaIn $ printCSV $ map (map swapTabCommaIn) ll
+printTSV ll = addTrailingNewline $ removeQuotes $ swapTabCommaIn $ printCSV $ map (map swapTabCommaIn) ll
main = do
incsv <- hGetContents stdin