module Hasql.Codecs.Decoders.Composite where
import Hasql.Codecs.Decoders.NullableOrNot qualified as NullableOrNot
import Hasql.Codecs.Decoders.Value qualified as Value
import Hasql.Codecs.RequestingOid qualified as RequestingOid
import Hasql.Platform.Prelude
import PostgreSQL.Binary.Decoding qualified as Binary
newtype Composite a
= Composite (RequestingOid.RequestingOid (Binary.Composite a))
deriving
((forall a b. (a -> b) -> Composite a -> Composite b)
-> (forall a b. a -> Composite b -> Composite a)
-> Functor Composite
forall a b. a -> Composite b -> Composite a
forall a b. (a -> b) -> Composite a -> Composite b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Composite a -> Composite b
fmap :: forall a b. (a -> b) -> Composite a -> Composite b
$c<$ :: forall a b. a -> Composite b -> Composite a
<$ :: forall a b. a -> Composite b -> Composite a
Functor, Functor Composite
Functor Composite =>
(forall a. a -> Composite a)
-> (forall a b. Composite (a -> b) -> Composite a -> Composite b)
-> (forall a b c.
(a -> b -> c) -> Composite a -> Composite b -> Composite c)
-> (forall a b. Composite a -> Composite b -> Composite b)
-> (forall a b. Composite a -> Composite b -> Composite a)
-> Applicative Composite
forall a. a -> Composite a
forall a b. Composite a -> Composite b -> Composite a
forall a b. Composite a -> Composite b -> Composite b
forall a b. Composite (a -> b) -> Composite a -> Composite b
forall a b c.
(a -> b -> c) -> Composite a -> Composite b -> Composite c
forall (f :: * -> *).
Functor f =>
(forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
$cpure :: forall a. a -> Composite a
pure :: forall a. a -> Composite a
$c<*> :: forall a b. Composite (a -> b) -> Composite a -> Composite b
<*> :: forall a b. Composite (a -> b) -> Composite a -> Composite b
$cliftA2 :: forall a b c.
(a -> b -> c) -> Composite a -> Composite b -> Composite c
liftA2 :: forall a b c.
(a -> b -> c) -> Composite a -> Composite b -> Composite c
$c*> :: forall a b. Composite a -> Composite b -> Composite b
*> :: forall a b. Composite a -> Composite b -> Composite b
$c<* :: forall a b. Composite a -> Composite b -> Composite a
<* :: forall a b. Composite a -> Composite b -> Composite a
Applicative)
via (Compose RequestingOid.RequestingOid Binary.Composite)
toValueDecoder :: Composite a -> RequestingOid.RequestingOid (Binary.Value a)
toValueDecoder :: forall a. Composite a -> RequestingOid (Value a)
toValueDecoder (Composite RequestingOid (Composite a)
imp) =
(Composite a -> Value a)
-> RequestingOid (Composite a)
-> LookingUp (Maybe Text, Text) (Word32, Word32) (Value a)
forall a b.
(a -> b)
-> LookingUp (Maybe Text, Text) (Word32, Word32) a
-> LookingUp (Maybe Text, Text) (Word32, Word32) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Composite a -> Value a
forall a. Composite a -> Value a
Binary.composite RequestingOid (Composite a)
imp
field :: NullableOrNot.NullableOrNot Value.Value a -> Composite a
field :: forall a. NullableOrNot Value a -> Composite a
field = \case
NullableOrNot.NonNullable Value a
imp ->
let dimensionality :: Word
dimensionality = Value a -> Word
forall a. Value a -> Word
Value.toDimensionality Value a
imp
staticOid :: Maybe Word32
staticOid = if Word
dimensionality Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
0 then Value a -> Maybe Word32
forall a. Value a -> Maybe Word32
Value.toBaseOid Value a
imp else Value a -> Maybe Word32
forall a. Value a -> Maybe Word32
Value.toArrayOid Value a
imp
in case Maybe Word32
staticOid of
Just Word32
oid ->
RequestingOid (Composite a) -> Composite a
forall a. RequestingOid (Composite a) -> Composite a
Composite ((Value a -> Composite a)
-> LookingUp (Maybe Text, Text) (Word32, Word32) (Value a)
-> RequestingOid (Composite a)
forall a b.
(a -> b)
-> LookingUp (Maybe Text, Text) (Word32, Word32) a
-> LookingUp (Maybe Text, Text) (Word32, Word32) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Word32 -> Value a -> Composite a
forall a. Word32 -> Value a -> Composite a
Binary.typedValueComposite Word32
oid) (Value a -> LookingUp (Maybe Text, Text) (Word32, Word32) (Value a)
forall a. Value a -> RequestingOid (Value a)
Value.toDecoder Value a
imp))
Maybe Word32
Nothing ->
RequestingOid (Composite a) -> Composite a
forall a. RequestingOid (Composite a) -> Composite a
Composite
( (Maybe Text, Text)
-> ((Word32, Word32) -> Value a -> Composite a)
-> LookingUp (Maybe Text, Text) (Word32, Word32) (Value a)
-> RequestingOid (Composite a)
forall a b.
(Maybe Text, Text)
-> ((Word32, Word32) -> a -> b)
-> RequestingOid a
-> RequestingOid b
RequestingOid.hoistLookingUp
(Value a -> Maybe Text
forall a. Value a -> Maybe Text
Value.toSchema Value a
imp, Value a -> Text
forall a. Value a -> Text
Value.toTypeName Value a
imp)
(\(Word32
baseOid, Word32
arrayOid) Value a
decoder -> Word32 -> Value a -> Composite a
forall a. Word32 -> Value a -> Composite a
Binary.typedValueComposite (if Word
dimensionality Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
0 then Word32
baseOid else Word32
arrayOid) Value a
decoder)
(Value a -> LookingUp (Maybe Text, Text) (Word32, Word32) (Value a)
forall a. Value a -> RequestingOid (Value a)
Value.toDecoder Value a
imp)
)
NullableOrNot.Nullable Value a1
imp ->
let dimensionality :: Word
dimensionality = Value a1 -> Word
forall a. Value a -> Word
Value.toDimensionality Value a1
imp
staticOid :: Maybe Word32
staticOid = if Word
dimensionality Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
0 then Value a1 -> Maybe Word32
forall a. Value a -> Maybe Word32
Value.toBaseOid Value a1
imp else Value a1 -> Maybe Word32
forall a. Value a -> Maybe Word32
Value.toArrayOid Value a1
imp
in case Maybe Word32
staticOid of
Just Word32
oid ->
RequestingOid (Composite a) -> Composite a
forall a. RequestingOid (Composite a) -> Composite a
Composite ((Value a1 -> Composite a)
-> LookingUp (Maybe Text, Text) (Word32, Word32) (Value a1)
-> RequestingOid (Composite a)
forall a b.
(a -> b)
-> LookingUp (Maybe Text, Text) (Word32, Word32) a
-> LookingUp (Maybe Text, Text) (Word32, Word32) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Word32 -> Value a1 -> Composite (Maybe a1)
forall a. Word32 -> Value a -> Composite (Maybe a)
Binary.typedNullableValueComposite Word32
oid) (Value a1
-> LookingUp (Maybe Text, Text) (Word32, Word32) (Value a1)
forall a. Value a -> RequestingOid (Value a)
Value.toDecoder Value a1
imp))
Maybe Word32
Nothing ->
RequestingOid (Composite a) -> Composite a
forall a. RequestingOid (Composite a) -> Composite a
Composite
( (Maybe Text, Text)
-> ((Word32, Word32) -> Value a1 -> Composite a)
-> LookingUp (Maybe Text, Text) (Word32, Word32) (Value a1)
-> RequestingOid (Composite a)
forall a b.
(Maybe Text, Text)
-> ((Word32, Word32) -> a -> b)
-> RequestingOid a
-> RequestingOid b
RequestingOid.hoistLookingUp
(Value a1 -> Maybe Text
forall a. Value a -> Maybe Text
Value.toSchema Value a1
imp, Value a1 -> Text
forall a. Value a -> Text
Value.toTypeName Value a1
imp)
(\(Word32
baseOid, Word32
arrayOid) Value a1
decoder -> Word32 -> Value a1 -> Composite (Maybe a1)
forall a. Word32 -> Value a -> Composite (Maybe a)
Binary.typedNullableValueComposite (if Word
dimensionality Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
== Word
0 then Word32
baseOid else Word32
arrayOid) Value a1
decoder)
(Value a1
-> LookingUp (Maybe Text, Text) (Word32, Word32) (Value a1)
forall a. Value a -> RequestingOid (Value a)
Value.toDecoder Value a1
imp)
)