module Hasql.Core.EncodeParams where
import Hasql.Prelude
import Hasql.Core.Model
import qualified ByteString.StrictBuilder as B
import qualified VectorBuilder.Builder as N
import qualified Hasql.Core.EncodeParam as A
import qualified Hasql.Core.Protocol.Encoding as C
data EncodeParams input =
EncodeParams (N.Builder Word32) (input -> B.Builder) (input -> B.Builder)
instance Semigroup (EncodeParams input) where
(<>) (EncodeParams leftOids leftBuilder1 leftBuilder2) (EncodeParams rightOids rightBuilder1 rightBuilder2) =
EncodeParams oids builder1 builder2
where
oids =
leftOids <> rightOids
builder1 =
leftBuilder1 <> rightBuilder1
builder2 =
leftBuilder2 <> rightBuilder2
instance Monoid (EncodeParams input) where
mempty =
EncodeParams mempty mempty mempty
mappend =
(<>)
instance Contravariant EncodeParams where
contramap fn (EncodeParams oids builder1 builder2) =
EncodeParams oids (builder1 . fn) (builder2 . fn)
instance Divisible EncodeParams where
conquer =
mempty
divide fn (EncodeParams leftOids leftBuilder1 leftBuilder2) (EncodeParams rightOids rightBuilder1 rightBuilder2) =
EncodeParams oids builder1 builder2
where
oids =
leftOids <> rightOids
builder1 =
mergedBuilder leftBuilder1 rightBuilder1
builder2 =
mergedBuilder leftBuilder2 rightBuilder2
mergedBuilder leftBuilder rightBuilder params =
case fn params of
(leftParams, rightParams) ->
leftBuilder leftParams <>
rightBuilder rightParams
param :: A.EncodeParam param -> EncodeParams param
param (A.EncodeParam oid idtOnEncode idtOffEncode) =
EncodeParams (N.singleton oid) (C.sizedValue . idtOnEncode) (C.sizedValue . idtOffEncode)
nullableParam :: A.EncodeParam param -> EncodeParams (Maybe param)
nullableParam (A.EncodeParam oid idtOnEncode idtOffEncode) =
EncodeParams (N.singleton oid) (C.nullableSizedValue . fmap idtOnEncode) (C.nullableSizedValue . fmap idtOffEncode)