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

module DSV.FileStrictCsvMap
  ( mapCsvFileStrictWithoutHeader
  , mapCsvFileStrictIgnoringHeader
  , mapCsvFileStrictUsingHeader
  ) where

import DSV.ByteString
import DSV.CommonDelimiters
import DSV.FileStrictMap
import DSV.IO
import DSV.ParseStop
import DSV.Prelude
import DSV.Vector

mapCsvFileStrictWithoutHeader ::
    forall m row .
    MonadIO m
    => FilePath
        -- ^ The path of a CSV file to read
    -> (Vector ByteString -> IO row)
        -- ^ Conversion function by which you specify how to interpret one row of bytes from the CSV file
    -> m (ParseStop, Vector row)

mapCsvFileStrictWithoutHeader fp f =
    mapDsvFileStrictWithoutHeader comma fp f

mapCsvFileStrictIgnoringHeader ::
    forall m row .
    MonadIO m
    => FilePath
        -- ^ The path of a CSV file to read
    -> (Vector ByteString -> IO row)
        -- ^ Conversion function by which you specify how to interpret one row of bytes from the CSV file
    -> m (ParseStop, Vector row)

mapCsvFileStrictIgnoringHeader fp f =
    mapDsvFileStrictIgnoringHeader comma fp f

mapCsvFileStrictUsingHeader ::
    forall m row .
    MonadIO m
    => FilePath
        -- ^ The path of a CSV file to read
    -> (Vector ByteString -> IO (Vector ByteString -> IO row))
        -- ^ Function which interprets the header (the first @Vector ByteString@) and returns a conversion function (@Vector ByteString -> IO row@) by which you specify how to interpret one row of bytes from the CSV file
    -> m (ParseStop, Vector row)

mapCsvFileStrictUsingHeader fp f =
    mapDsvFileStrictUsingHeader comma fp f