From e7489043d8bf2a406a910adcb93280e83d6d2faa Mon Sep 17 00:00:00 2001 From: defanor Date: Wed, 20 Dec 2017 00:22:25 +0300 Subject: Prepare for IO DSV functions operate on individual lines now, unit type gets printed/parsed as nothing (handier for argument parsing to set '()' when there's none, and that's what it should be anyway). --- Coalpit/DSV.hs | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-) (limited to 'Coalpit/DSV.hs') diff --git a/Coalpit/DSV.hs b/Coalpit/DSV.hs index 4940843..2ba9464 100644 --- a/Coalpit/DSV.hs +++ b/Coalpit/DSV.hs @@ -31,15 +31,6 @@ composeDSVLine fs = intercalate [fs] . map escapeVal then inner else init $ tail inner --- | Composes DSV out of values. -composeDSV :: Char - -- ^ Field separator. - -> [[String]] - -- ^ Lines of values. - -> String -composeDSV fs = unlines . map (composeDSVLine fs) - - pStr :: Char -> Parsec Void String String pStr fs = do s <- try (between (char '"') (char '"') @@ -54,23 +45,15 @@ pStr fs = do pDSVLine :: Char -> Parsec Void String [String] pDSVLine fs = pStr fs `sepBy` char fs --- | Parses values out of DSV. -parseDSV :: Char - -- ^ Field separator - -> String - -- ^ A string containing lines. - -> [Either String [String]] -parseDSV fs = map parseLine . lines - where parseLine :: String -> Either String [String] - parseLine l = case parse (pDSVLine fs) "line" l of - Left err -> Left $ parseErrorPretty err - Right x -> Right x - +parseDSVLine :: Char -> String -> Either String [String] +parseDSVLine fs l = case parse (pDSVLine fs) "line" l of + Left err -> Left $ parseErrorPretty err + Right x -> Right x -- | Shows values in DSV format. -showDSV :: Coalpit a => Options -> [a] -> String -showDSV opt = composeDSV (fieldSeparator opt) . map (toArgs opt) +showDSV :: Coalpit a => Options -> a -> String +showDSV opt = composeDSVLine (fieldSeparator opt) . (toArgs opt) -- | Reads values from DSV format. -readDSV :: Coalpit a => Options -> String -> [Either String a] -readDSV opt = map (>>= fromArgs opt) . parseDSV (fieldSeparator opt) +readDSV :: Coalpit a => Options -> String -> Either String a +readDSV opt = (>>= fromArgs opt) . parseDSVLine (fieldSeparator opt) -- cgit v1.2.3