module Siphon.Encoding where

import Siphon.Types
import Colonnade (Colonnade,Headed)
import Pipes (Pipe,yield)
import qualified Pipes.Prelude as Pipes
import qualified Colonnade.Encode as E

row :: Siphon c -> Colonnade f a c -> a -> c
row (Siphon escape intercalate _ _) e =
  intercalate . E.row escape e

header :: Siphon c -> Colonnade Headed a c -> c
header (Siphon escape intercalate _ _) e =
  intercalate (E.header escape e)

pipe :: Monad m
  => Siphon c
  -> Colonnade f a c
  -> Pipe a c m x
pipe siphon encoding = Pipes.map (row siphon encoding)

headedPipe :: Monad m
  => Siphon c
  -> Colonnade Headed a c
  -> Pipe a c m x
headedPipe siphon encoding = do
  yield (header siphon encoding)
  pipe siphon encoding