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

Types used by the key-vale + CSV processing part.
-}

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

module Pipes.KeyValueCsv.Types
  ( module Pipes.KeyValueCsv.Types
  , module Pipes.KeyValueCsv.Types.Common
  , module Pipes.KeyValueCsv.Types.Csv
  , module Pipes.KeyValueCsv.Types.KeyValue
  ) where


import Pipes.KeyValueCsv.Types.Common
import Pipes.KeyValueCsv.Types.Csv
import Pipes.KeyValueCsv.Types.KeyValue

import Control.Lens
import Data.Default.Class
import Data.Text (Text)

-- |Options for the whole processing. 
data Options (m :: * -> *) (f :: k -> *) (g :: j -> *) (hs :: [k]) (rs :: [j]) = Options
  { _kvOptions  :: KeyValueOptions m f hs
  , _csvOptions :: CsvOptions      m g rs
  , _predicate  :: Text -> Bool
  , _delimiter  :: Char
  }

makeLenses ''Options

instance ( Default (KeyValueOptions m f hs)
         , Default (CsvOptions m g rs)
         ) => Default (Options m f g hs rs) where
  def = Options
    { _kvOptions  = def
    , _csvOptions = def
    , _predicate  = const False
    , _delimiter  = ','
    }