{-|
Module      : Pipes.KeyValueCsv.Csv
Copyright   : (c) Marcin Mrotek, 2015
License     : BSD3
Maintainer  : marcin.jan.mrotek@gmail.com
Stability   : experimental

Parsing the main CSV body.
-}

{-# LANGUAGE 
    DataKinds
  , FlexibleContexts 
  , PolyKinds
  , RankNTypes
  , TypeOperators
  #-}

module Pipes.KeyValueCsv.Csv 
  ( parseCsv
  , WrapParser(..)
  , wrapParser
  ) where

import Pipes.KeyValueCsv.Internal.Csv
import Pipes.KeyValueCsv.Internal.Types
import Pipes.KeyValueCsv.Common
import Pipes.KeyValueCsv.Types.Common
import Pipes.KeyValueCsv.Types.Csv

import Control.Lens
import Data.Reflection
import Data.Vinyl
import Data.Vinyl.Functor
import qualified Pipes.Group as Group

parseCsv 
  :: forall (m :: * -> *) (f :: k -> *) (rs :: [k]) (r :: *)
   . ( Given Delimiter
     , Monad m
     ) 
  => CsvOptions m f rs
  -> Lines m r 
  -> Producer (Rec (WithCsvError :. f) rs) m r
-- ^Parse a stream of lines.
parseCsv options = 
    Group.concats 
  . Group.maps (parseLine $ options^.csvParser) 
  . unLines