module Pipes.KeyValueCsv.Common
( module Pipes.KeyValueCsv.Common
, Lines
, Cells
, Producer
, Text
) where
import Pipes.KeyValueCsv.Cell
import Pipes.KeyValueCsv.Internal.Types
import Pipes.KeyValueCsv.Types.Common
import Control.Lens
import Data.Reflection
import Data.Vinyl
import Data.Vinyl.Functor
import Data.Vinyl.TypeLevel
import Data.Vinyl.Utils.Proxy
import Data.Text (Text)
import Pipes hiding (Proxy)
import qualified Pipes.Group as Group
import Pipes.Parse (Parser)
import qualified Pipes.Text as PipesText
lines
:: Monad m
=> Producer Text m r
-> Lines m r
lines =
Lines
. Group.maps Line
. view PipesText.lines
cells
:: ( Monad m
, Given Delimiter
)
=> Line m r
-> Cells m r
cells =
Cells
. Group.maps Cell
. view (PipesText.splits delim)
. unLine
where delim = getDelimiter given
useDelimiter :: Char -> (Given Delimiter => a) -> a
useDelimiter = give . Delimiter
wrapParser
:: forall m f r . Functor m
=> Parser Text m (Either String (f r))
-> CellParser m f r
wrapParser p = Compose wrapped
where
wrapped :: WrapParser Text m ((Either String :. f) r)
wrapped = WrapParser composed
composed :: Parser Text m ((Either String :. f) r)
composed = Compose <$> p
defaultParser'
:: ( RecAll f rs FromCell
, Monad m
)
=> Rec Proxy rs
-> Rec (CellParser m f) rs
defaultParser' RNil = RNil
defaultParser' (Proxy :& ps) = wrapParser fromCell :& defaultParser' ps
defaultParser
:: forall (m :: * -> *) (f :: k -> *) (rs :: [k])
. ( RecAll f rs FromCell
, Monad m
, Record rs
)
=> Rec (CellParser m f) rs
defaultParser = defaultParser' proxyRecord