{-|
Module : Pipes.KeyValueCsv.IO
Copyright : (c) Marcin Mrotek, 2015
License : BSD3
Maintainer : marcin.jan.mrotek@gmail.com
Stability : experimental
File input and output.
-}
{-# LANGUAGE
DataKinds
, FlexibleContexts
, PolyKinds
, RankNTypes
, TypeOperators
#-}
module Pipes.KeyValueCsv.IO
( streamIn
, streamInBS
-- * Re-exports
, SafeT
) where
import Prelude hiding (lines)
import Pipes.KeyValueCsv
import Data.Vinyl
import Data.Vinyl.Functor
import Pipes
import Pipes.ByteString (ByteString)
import qualified Pipes.ByteString as Pipes
import Pipes.Safe (SafeT, MonadMask)
import qualified Pipes.Safe as Pipes
import Pipes.Text.Encoding
import System.IO
streamInBS
:: ( MonadIO m
, MonadMask m
)
=> FilePath
-> Producer ByteString (SafeT m) ()
-- ^Read a 'ByteString' stream from file.
streamInBS path =
Pipes.bracket
( liftIO $ openFile path ReadMode )
( liftIO . hClose )
Pipes.fromHandle
streamIn
:: forall (m :: * -> *) (f :: k -> *) (g :: j -> *) (hs :: [k]) (rs :: [j])
. ( MonadIO m
, MonadMask m
, Record hs
)
=> Codec -- ^File encoding.
-> FilePath -- ^Input file.
-> Options (SafeT m) f g hs rs -- ^Parsing options.
-> SafeT m
( Rec (WithKeyValueError :. f) hs
, Producer (Rec (WithCsvError :. g) rs) (SafeT m)
( Producer ByteString (SafeT m) () )
)
-- ^Read a CSV file.
streamIn codec path options =
parseKeyValueCsv options
. decode codec
$ streamInBS path