module Hasql.Encoders.Value where

import Hasql.Prelude
import qualified Database.PostgreSQL.LibPQ as LibPQ
import qualified PostgreSQL.Binary.Encoder as Encoder
import qualified Hasql.PTI as PTI


data Value a =
  Value PTI.OID PTI.OID (Bool -> Encoder.Encoder a)

instance Contravariant Value where
  {-# INLINE contramap #-}
  contramap f (Value valueOID arrayOID encoder) =
    Value valueOID arrayOID (\integerDatetimes input -> encoder integerDatetimes (f input))

{-# INLINE run #-}
run :: Value a -> (PTI.OID, PTI.OID, Bool -> Encoder.Encoder a)
run (Value valueOID arrayOID encoder') =
  (valueOID, arrayOID, encoder')

{-# INLINE unsafePTI #-}
unsafePTI :: PTI.PTI -> (Bool -> Encoder.Encoder a) -> Value a
unsafePTI pti encoder' =
  Value (PTI.ptiOID pti) (fromMaybe ($bug "No array OID") (PTI.ptiArrayOID pti)) encoder'