-----------------------------------------------------------------------------
-- Copyright 2019, Advise-Me project team. This file is distributed under 
-- the terms of the Apache License 2.0. For more information, see the files
-- "LICENSE.txt" and "NOTICE.txt", which are included in the distribution.
-----------------------------------------------------------------------------
-- |
-- Maintainer  :  bastiaan.heeren@ou.nl
-- Stability   :  provisional
-- Portability :  portable (depends on ghc)
--
-----------------------------------------------------------------------------

module Main.ParserCSV (readFileCSV, CSV, Row, Cell) where

import Control.Monad
import Ideas.Utils.Parsing

type CSV = [Row]
type Row = [Cell]
type Cell = String

readFileCSV :: FilePath -> IO CSV
readFileCSV = readFile >=> parseCSV

parseCSV :: Monad m => String -> m CSV
parseCSV = either fail return . parseSimple pCSV

pCSV :: Parser CSV
pCSV = many pRow

pRow :: Parser Row
pRow = pCell `sepBy` (char ';' <|> char ',') <* optionMaybe (char '\r') <* char '\n'

pCell :: Parser Cell
pCell = pQuotedCell
    <|> many (noneOf ",;\r\n\"")

pQuotedCell :: Parser Cell --v THIS PART WAS COMMENTED    v
pQuotedCell = quoted (many (try (char '"' *> char '"') <|> noneOf "\""))

quoted :: Parser a -> Parser a
quoted = between (char '"') (char '"')