module Hasql.Decoders.Value where
import Hasql.PostgresTypeInfo qualified as PTI
import Hasql.Prelude
import PostgreSQL.Binary.Decoding qualified as A
data Value a
= Value
Text
(Maybe PTI.OID)
(Maybe PTI.OID)
(A.Value a)
(A.Value a)
deriving ((forall a b. (a -> b) -> Value a -> Value b)
-> (forall a b. a -> Value b -> Value a) -> Functor Value
forall a b. a -> Value b -> Value a
forall a b. (a -> b) -> Value a -> Value 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) -> Value a -> Value b
fmap :: forall a b. (a -> b) -> Value a -> Value b
$c<$ :: forall a b. a -> Value b -> Value a
<$ :: forall a b. a -> Value b -> Value a
Functor)
instance Filterable Value where
{-# INLINE mapMaybe #-}
mapMaybe :: forall a b. (a -> Maybe b) -> Value a -> Value b
mapMaybe a -> Maybe b
fn =
(a -> Either Text b) -> Value a -> Value b
forall a b. (a -> Either Text b) -> Value a -> Value b
refine (Either Text b -> (b -> Either Text b) -> Maybe b -> Either Text b
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Text -> Either Text b
forall a b. a -> Either a b
Left Text
"Invalid value") b -> Either Text b
forall a b. b -> Either a b
Right (Maybe b -> Either Text b) -> (a -> Maybe b) -> a -> Either Text b
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> Maybe b
fn)
{-# INLINE run #-}
run :: Value a -> Bool -> A.Value a
run :: forall a. Value a -> Bool -> Value a
run (Value Text
_ Maybe OID
_ Maybe OID
_ Value a
floatDecoder Value a
intDecoder) Bool
integerDatetimes =
if Bool
integerDatetimes then Value a
intDecoder else Value a
floatDecoder
{-# INLINE decoder #-}
decoder :: A.Value a -> Value a
decoder :: forall a. Value a -> Value a
decoder Value a
aDecoder =
{-# SCC "decoder" #-}
Text -> Maybe OID -> Maybe OID -> Value a -> Value a -> Value a
forall a.
Text -> Maybe OID -> Maybe OID -> Value a -> Value a -> Value a
Value Text
"unknown" Maybe OID
forall a. Maybe a
Nothing Maybe OID
forall a. Maybe a
Nothing Value a
aDecoder Value a
aDecoder
{-# INLINE decoderFn #-}
decoderFn :: (Bool -> ByteString -> Either Text a) -> Value a
decoderFn :: forall a. (Bool -> ByteString -> Either Text a) -> Value a
decoderFn Bool -> ByteString -> Either Text a
fn =
Text -> Maybe OID -> Maybe OID -> Value a -> Value a -> Value a
forall a.
Text -> Maybe OID -> Maybe OID -> Value a -> Value a -> Value a
Value
Text
"unknown"
Maybe OID
forall a. Maybe a
Nothing
Maybe OID
forall a. Maybe a
Nothing
((ByteString -> Either Text a) -> Value a
forall a. (ByteString -> Either Text a) -> Value a
A.fn ((ByteString -> Either Text a) -> Value a)
-> (ByteString -> Either Text a) -> Value a
forall a b. (a -> b) -> a -> b
$ Bool -> ByteString -> Either Text a
fn Bool
False)
((ByteString -> Either Text a) -> Value a
forall a. (ByteString -> Either Text a) -> Value a
A.fn ((ByteString -> Either Text a) -> Value a)
-> (ByteString -> Either Text a) -> Value a
forall a b. (a -> b) -> a -> b
$ Bool -> ByteString -> Either Text a
fn Bool
True)
{-# INLINE refine #-}
refine :: (a -> Either Text b) -> Value a -> Value b
refine :: forall a b. (a -> Either Text b) -> Value a -> Value b
refine a -> Either Text b
fn (Value Text
typeName Maybe OID
typeOID Maybe OID
arrayOID Value a
floatDecoder Value a
intDecoder) =
Text -> Maybe OID -> Maybe OID -> Value b -> Value b -> Value b
forall a.
Text -> Maybe OID -> Maybe OID -> Value a -> Value a -> Value a
Value Text
typeName Maybe OID
typeOID Maybe OID
arrayOID ((a -> Either Text b) -> Value a -> Value b
forall a b. (a -> Either Text b) -> Value a -> Value b
A.refine a -> Either Text b
fn Value a
floatDecoder) ((a -> Either Text b) -> Value a -> Value b
forall a b. (a -> Either Text b) -> Value a -> Value b
A.refine a -> Either Text b
fn Value a
intDecoder)
{-# INLINE unsafePTI #-}
unsafePTI :: Text -> PTI.PTI -> A.Value a -> A.Value a -> Value a
unsafePTI :: forall a. Text -> PTI -> Value a -> Value a -> Value a
unsafePTI Text
typeName PTI
pti Value a
floatDecoder Value a
intDecoder =
Text -> Maybe OID -> Maybe OID -> Value a -> Value a -> Value a
forall a.
Text -> Maybe OID -> Maybe OID -> Value a -> Value a -> Value a
Value Text
typeName (OID -> Maybe OID
forall a. a -> Maybe a
Just (PTI -> OID
PTI.ptiOID PTI
pti)) (PTI -> Maybe OID
PTI.ptiArrayOID PTI
pti) Value a
floatDecoder Value a
intDecoder