{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE ScopedTypeVariables #-}

module DSV.FileStrictRead
  ( readDsvFileStrictWithZippedHeader
  , readDsvFileStrictWithoutHeader
  , readDsvFileStrictIgnoringHeader
  ) 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

readDsvFileStrictWithoutHeader ::
    forall m .
    MonadIO m
    => Delimiter  -- ^ What character separates input values, e.g. 'comma' or 'tab'
    -> FilePath   -- ^ The path of a CSV file to read
    -> m (ParseStop, Vector (Vector ByteString))

readDsvFileStrictWithoutHeader :: Delimiter -> FilePath -> m (ParseStop, Vector (Vector ByteString))
readDsvFileStrictWithoutHeader Delimiter
d FilePath
fp =
    IO (ParseStop, Vector (Vector ByteString))
-> m (ParseStop, Vector (Vector ByteString))
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (ParseStop, Vector (Vector ByteString))
 -> m (ParseStop, Vector (Vector ByteString)))
-> IO (ParseStop, Vector (Vector ByteString))
-> m (ParseStop, Vector (Vector ByteString))
forall a b. (a -> b) -> a -> b
$ SafeT IO (ParseStop, Vector (Vector ByteString))
-> IO (ParseStop, Vector (Vector ByteString))
forall (m :: * -> *) r.
(MonadMask m, MonadIO m) =>
SafeT m r -> m r
runSafeT (SafeT IO (ParseStop, Vector (Vector ByteString))
 -> IO (ParseStop, Vector (Vector ByteString)))
-> SafeT IO (ParseStop, Vector (Vector ByteString))
-> IO (ParseStop, Vector (Vector ByteString))
forall a b. (a -> b) -> a -> b
$
      do
        FoldM (SafeT IO) (Vector ByteString) (Vector (Vector ByteString))
-> Producer (Vector ByteString) (SafeT IO) ParseStop
-> SafeT IO (ParseStop, Vector (Vector ByteString))
forall a b (m :: * -> *) r.
Monad m =>
FoldM m a b -> Producer a m r -> m (r, b)
foldProducerM FoldM (SafeT IO) (Vector ByteString) (Vector (Vector ByteString))
forall (v :: * -> *) (m :: * -> *) a.
(PrimMonad m, Vector v a) =>
FoldM m a (v a)
foldVectorM (Producer (Vector ByteString) (SafeT IO) ParseStop
 -> SafeT IO (ParseStop, Vector (Vector ByteString)))
-> Producer (Vector ByteString) (SafeT IO) ParseStop
-> SafeT IO (ParseStop, Vector (Vector ByteString))
forall a b. (a -> b) -> a -> b
$
            FilePath
-> IOMode
-> (Handle -> Producer (Vector ByteString) (SafeT IO) ParseStop)
-> Producer (Vector ByteString) (SafeT IO) ParseStop
forall (m :: * -> *) r.
MonadSafe m =>
FilePath -> IOMode -> (Handle -> m r) -> m r
withFile FilePath
fp IOMode
ReadMode ((Handle -> Producer (Vector ByteString) (SafeT IO) ParseStop)
 -> Producer (Vector ByteString) (SafeT IO) ParseStop)
-> (Handle -> Producer (Vector ByteString) (SafeT IO) ParseStop)
-> Producer (Vector ByteString) (SafeT IO) ParseStop
forall a b. (a -> b) -> a -> b
$ \Handle
h ->
                Delimiter
-> Handle -> Producer (Vector ByteString) (SafeT IO) ParseStop
forall (m :: * -> *).
MonadIO m =>
Delimiter -> Handle -> Producer (Vector ByteString) m ParseStop
handleDsvRowProducer Delimiter
d Handle
h

readDsvFileStrictWithZippedHeader ::
    forall m .
    MonadIO m
    => Delimiter  -- ^ What character separates input values, e.g. 'comma' or 'tab'
    -> FilePath   -- ^ The path of a CSV file to read
    -> m (ParseStop, Vector (Vector (ByteString, ByteString)))

readDsvFileStrictWithZippedHeader :: Delimiter
-> FilePath
-> m (ParseStop, Vector (Vector (ByteString, ByteString)))
readDsvFileStrictWithZippedHeader Delimiter
d FilePath
fp =
    IO (ParseStop, Vector (Vector (ByteString, ByteString)))
-> m (ParseStop, Vector (Vector (ByteString, ByteString)))
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (ParseStop, Vector (Vector (ByteString, ByteString)))
 -> m (ParseStop, Vector (Vector (ByteString, ByteString))))
-> IO (ParseStop, Vector (Vector (ByteString, ByteString)))
-> m (ParseStop, Vector (Vector (ByteString, ByteString)))
forall a b. (a -> b) -> a -> b
$ SafeT IO (ParseStop, Vector (Vector (ByteString, ByteString)))
-> IO (ParseStop, Vector (Vector (ByteString, ByteString)))
forall (m :: * -> *) r.
(MonadMask m, MonadIO m) =>
SafeT m r -> m r
runSafeT (SafeT IO (ParseStop, Vector (Vector (ByteString, ByteString)))
 -> IO (ParseStop, Vector (Vector (ByteString, ByteString))))
-> SafeT IO (ParseStop, Vector (Vector (ByteString, ByteString)))
-> IO (ParseStop, Vector (Vector (ByteString, ByteString)))
forall a b. (a -> b) -> a -> b
$
      do
        FoldM
  (SafeT IO)
  (Vector (ByteString, ByteString))
  (Vector (Vector (ByteString, ByteString)))
-> Producer (Vector (ByteString, ByteString)) (SafeT IO) ParseStop
-> SafeT IO (ParseStop, Vector (Vector (ByteString, ByteString)))
forall a b (m :: * -> *) r.
Monad m =>
FoldM m a b -> Producer a m r -> m (r, b)
foldProducerM FoldM
  (SafeT IO)
  (Vector (ByteString, ByteString))
  (Vector (Vector (ByteString, ByteString)))
forall (v :: * -> *) (m :: * -> *) a.
(PrimMonad m, Vector v a) =>
FoldM m a (v a)
foldVectorM (Producer (Vector (ByteString, ByteString)) (SafeT IO) ParseStop
 -> SafeT IO (ParseStop, Vector (Vector (ByteString, ByteString))))
-> Producer (Vector (ByteString, ByteString)) (SafeT IO) ParseStop
-> SafeT IO (ParseStop, Vector (Vector (ByteString, ByteString)))
forall a b. (a -> b) -> a -> b
$
            FilePath
-> IOMode
-> (Handle
    -> Producer (Vector (ByteString, ByteString)) (SafeT IO) ParseStop)
-> Producer (Vector (ByteString, ByteString)) (SafeT IO) ParseStop
forall (m :: * -> *) r.
MonadSafe m =>
FilePath -> IOMode -> (Handle -> m r) -> m r
withFile FilePath
fp IOMode
ReadMode ((Handle
  -> Producer (Vector (ByteString, ByteString)) (SafeT IO) ParseStop)
 -> Producer (Vector (ByteString, ByteString)) (SafeT IO) ParseStop)
-> (Handle
    -> Producer (Vector (ByteString, ByteString)) (SafeT IO) ParseStop)
-> Producer (Vector (ByteString, ByteString)) (SafeT IO) ParseStop
forall a b. (a -> b) -> a -> b
$ \Handle
h ->
                Delimiter
-> Handle -> Producer (Vector ByteString) (SafeT IO) ParseStop
forall (m :: * -> *).
MonadIO m =>
Delimiter -> Handle -> Producer (Vector ByteString) m ParseStop
handleDsvRowProducer Delimiter
d Handle
h Producer (Vector ByteString) (SafeT IO) ParseStop
-> Proxy
     ()
     (Vector ByteString)
     ()
     (Vector (ByteString, ByteString))
     (SafeT IO)
     ParseStop
-> Producer (Vector (ByteString, ByteString)) (SafeT IO) ParseStop
forall (m :: * -> *) a' a b r c' c.
Monad m =>
Proxy a' a () b m r -> Proxy () b c' c m r -> Proxy a' a c' c m r
>-> Proxy
  ()
  (Vector ByteString)
  ()
  (Vector (ByteString, ByteString))
  (SafeT IO)
  ParseStop
forall a (m :: * -> *) r.
Monad m =>
Pipe (Vector a) (Vector (a, a)) m r
zipHeaderPipe

readDsvFileStrictIgnoringHeader ::
    forall m .
    MonadIO m
    => Delimiter  -- ^ What character separates input values, e.g. 'comma' or 'tab'
    -> FilePath   -- ^ The path of a CSV file to read

    -> m (ParseStop, Vector (Vector ByteString))

readDsvFileStrictIgnoringHeader :: Delimiter -> FilePath -> m (ParseStop, Vector (Vector ByteString))
readDsvFileStrictIgnoringHeader Delimiter
d FilePath
fp =
    IO (ParseStop, Vector (Vector ByteString))
-> m (ParseStop, Vector (Vector ByteString))
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (ParseStop, Vector (Vector ByteString))
 -> m (ParseStop, Vector (Vector ByteString)))
-> IO (ParseStop, Vector (Vector ByteString))
-> m (ParseStop, Vector (Vector ByteString))
forall a b. (a -> b) -> a -> b
$ SafeT IO (ParseStop, Vector (Vector ByteString))
-> IO (ParseStop, Vector (Vector ByteString))
forall (m :: * -> *) r.
(MonadMask m, MonadIO m) =>
SafeT m r -> m r
runSafeT (SafeT IO (ParseStop, Vector (Vector ByteString))
 -> IO (ParseStop, Vector (Vector ByteString)))
-> SafeT IO (ParseStop, Vector (Vector ByteString))
-> IO (ParseStop, Vector (Vector ByteString))
forall a b. (a -> b) -> a -> b
$
      do
        FoldM (SafeT IO) (Vector ByteString) (Vector (Vector ByteString))
-> Producer (Vector ByteString) (SafeT IO) ParseStop
-> SafeT IO (ParseStop, Vector (Vector ByteString))
forall a b (m :: * -> *) r.
Monad m =>
FoldM m a b -> Producer a m r -> m (r, b)
foldProducerM (Natural
-> FoldM
     (SafeT IO) (Vector ByteString) (Vector (Vector ByteString))
-> FoldM
     (SafeT IO) (Vector ByteString) (Vector (Vector ByteString))
forall (m :: * -> *) a b.
Monad m =>
Natural -> FoldM m a b -> FoldM m a b
foldDropM Natural
1 FoldM (SafeT IO) (Vector ByteString) (Vector (Vector ByteString))
forall (v :: * -> *) (m :: * -> *) a.
(PrimMonad m, Vector v a) =>
FoldM m a (v a)
foldVectorM) (Producer (Vector ByteString) (SafeT IO) ParseStop
 -> SafeT IO (ParseStop, Vector (Vector ByteString)))
-> Producer (Vector ByteString) (SafeT IO) ParseStop
-> SafeT IO (ParseStop, Vector (Vector ByteString))
forall a b. (a -> b) -> a -> b
$
            FilePath
-> IOMode
-> (Handle -> Producer (Vector ByteString) (SafeT IO) ParseStop)
-> Producer (Vector ByteString) (SafeT IO) ParseStop
forall (m :: * -> *) r.
MonadSafe m =>
FilePath -> IOMode -> (Handle -> m r) -> m r
withFile FilePath
fp IOMode
ReadMode ((Handle -> Producer (Vector ByteString) (SafeT IO) ParseStop)
 -> Producer (Vector ByteString) (SafeT IO) ParseStop)
-> (Handle -> Producer (Vector ByteString) (SafeT IO) ParseStop)
-> Producer (Vector ByteString) (SafeT IO) ParseStop
forall a b. (a -> b) -> a -> b
$ \Handle
h ->
                Delimiter
-> Handle -> Producer (Vector ByteString) (SafeT IO) ParseStop
forall (m :: * -> *).
MonadIO m =>
Delimiter -> Handle -> Producer (Vector ByteString) m ParseStop
handleDsvRowProducer Delimiter
d Handle
h