module Siphon.Text where

import Siphon.Types
import Data.Text (Text)
import Data.Vector (Vector)
import Data.Coerce (coerce)
import qualified Data.Text   as Text
import qualified Data.Vector as Vector

siphon :: Siphon Text
siphon = Siphon escape encodeRow
  (error "siphon: uhoent") (error "siphon: uheokj")

encodeRow :: Vector (Escaped Text) -> Text
encodeRow = id
  . Text.intercalate (Text.singleton ',')
  . Vector.toList
  . coerce

escape :: Text -> Escaped Text
escape t = case Text.find (\c -> c == '\n' || c == ',' || c == '"') t of
  Nothing -> Escaped t
  Just _  -> escapeAlways t

escapeAlways :: Text -> Escaped Text
escapeAlways t = Escaped $ Text.concat
  [ Text.singleton '"'
  , Text.replace (Text.pack "\"") (Text.pack "\"\"") t
  , Text.singleton '"'
  ]