{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE ScopedTypeVariables #-}
module DSV.FileStrictMap
( mapDsvFileStrictWithoutHeader
, mapDsvFileStrictIgnoringHeader
, mapDsvFileStrictUsingHeader
) where
import DSV.ByteString
import DSV.DelimiterType
import DSV.Fold
import DSV.Header
import DSV.IO
import DSV.ParseStop
import DSV.Parsing
import DSV.Pipes
import DSV.Prelude
import DSV.Vector
import qualified Pipes.Prelude as P
mapDsvFileStrictWithoutHeader ::
forall m row .
MonadIO m
=> Delimiter
-> FilePath
-> (Vector ByteString -> IO row)
-> m (ParseStop, Vector row)
mapDsvFileStrictWithoutHeader d fp f =
liftIO $ runSafeT $
do
foldProducerM foldVectorM $
withFile fp ReadMode $ \h ->
handleDsvRowProducer d h >-> P.mapM (lift . f)
mapDsvFileStrictIgnoringHeader ::
forall m row .
MonadIO m
=> Delimiter
-> FilePath
-> (Vector ByteString -> IO row)
-> m (ParseStop, Vector row)
mapDsvFileStrictIgnoringHeader d fp f =
liftIO $ runSafeT $
do
foldProducerM (foldDropM 1 foldVectorM) $
withFile fp ReadMode $ \h ->
handleDsvRowProducer d h >-> P.mapM (lift . f)
mapDsvFileStrictUsingHeader ::
forall m row .
MonadIO m
=> Delimiter
-> FilePath
-> (Vector ByteString -> IO (Vector ByteString -> IO row))
-> m (ParseStop, Vector row)
mapDsvFileStrictUsingHeader d fp f =
liftIO $ runSafeT $
do
foldProducerM foldVectorM $
withFile fp ReadMode $ \h ->
handleDsvRowProducer d h >-> applyHeaderPipeM (bigLift f)
bigLift ::
(Vector ByteString -> IO (Vector ByteString -> IO a))
-> (Vector ByteString -> SafeT IO (Vector ByteString -> SafeT IO a))
bigLift = fmap liftIO . ((fmap . fmap . fmap) liftIO)