module Text.Delimited.Put (
    putRow
  , putRecord
  , putContent
  , runPut
) where

import Data.Binary.Put          (Put, putByteString, runPut)
import Text.Show.ByteString     (putAscii, showp, unlinesP)
import Text.Delimited.Types

-- | Intersperse a list of 'Put's with a delimiter.
intersperseP :: Put -> [Put] -> Put
intersperseP _ []     = return ()
intersperseP _ (x:[]) = showp x
intersperseP d (x:xs) = x >> d >> intersperseP d xs

-- | Convert 'Record' fields delimited by 'delim' to 'Put'.
putRow :: Char -> [Put] -> Put
putRow delim = intersperseP (putAscii delim)

-- | Convert 'Record' fields delimited by 'delim' to 'Put'.
putRecord :: Char -> Record -> Put
putRecord delim = putRow delim . map putByteString

-- | Convert 'Content' delimited by 'delim' to a 'Put'.
putContent :: Char -> Content -> Put
putContent delim = unlinesP . map (putRecord delim)