packages feed

text-encode-0.1.0.0: src/text-encode-cassava/Text/Encode/Cassava.hs

module Text.Encode.Cassava (
  module Text.Encode,
  CsvEncode,
) where

import Text.Encode

import Data.ByteString.Char8 qualified as C8
import Data.Coerce (coerce)
import Data.Csv (FromField (..), ToField (..), runParser)
import Data.Text.Encoding qualified as T

instance TextEncode a => FromField (ViaTextEncode a) where
  parseField = either fail pure . coerce (decodeByteString @a)

  {-# INLINE parseField #-}

instance TextEncode a => ToField (ViaTextEncode a) where
  toField = coerce $ encodeByteString @a

  {-# INLINE toField #-}

data CsvEncode

instance (FromField a, ToField a) => TextEncode (DeriveTextEncode CsvEncode a) where
  encodeByteString = coerce $ toField @a
  decodeByteString = coerce $ runParser . parseField @a

  encodeText = T.decodeLatin1 . encodeByteString
  decodeText = decodeByteString . T.encodeUtf8
  encodeString = C8.unpack . encodeByteString
  decodeString = decodeByteString . C8.pack

  {-# INLINE encodeByteString #-}
  {-# INLINE decodeByteString #-}
  {-# INLINE encodeText #-}
  {-# INLINE decodeText #-}
  {-# INLINE  encodeString #-}
  {-# INLINE  decodeString #-}