module Hasql.Codecs.RequestingOid
  ( RequestingOid,
    toUnknownTypes,
    toBase,
    requestAndHandle,
    lift,
    hoist,
    lookup,
    lookingUp,
    hoistLookingUp,
  )
where

import Hasql.Codecs.RequestingOid.LookingUp qualified as LookingUp
import Hasql.Codecs.Vocab qualified as Vocab
import Hasql.Codecs.Vocab.OidCache qualified as Vocab.OidCache
import Hasql.Codecs.Vocab.TypeInfo qualified as Vocab.TypeInfo
import Hasql.Platform.Prelude hiding (lift, lookup)

type RequestingOid =
  LookingUp.LookingUp
    Vocab.QualifiedTypeName
    Vocab.TypeInfo.TypeInfo

{-# INLINE toUnknownTypes #-}
toUnknownTypes ::
  RequestingOid a ->
  HashSet Vocab.QualifiedTypeName
toUnknownTypes :: forall a. RequestingOid a -> HashSet QualifiedTypeName
toUnknownTypes (LookingUp.LookingUp [QualifiedTypeName]
unknownTypes (QualifiedTypeName -> TypeInfo) -> a
_) =
  [Item (HashSet QualifiedTypeName)] -> HashSet QualifiedTypeName
forall l. IsList l => [Item l] -> l
fromList [Item (HashSet QualifiedTypeName)]
[QualifiedTypeName]
unknownTypes

{-# INLINE toBase #-}
toBase ::
  RequestingOid a ->
  Vocab.OidCache ->
  a
toBase :: forall a. RequestingOid a -> OidCache -> a
toBase (LookingUp.LookingUp [QualifiedTypeName]
_unknownTypes (QualifiedTypeName -> TypeInfo) -> a
decoder) OidCache
oidCache =
  (QualifiedTypeName -> TypeInfo) -> a
decoder \QualifiedTypeName
key ->
    QualifiedTypeName -> OidCache -> Maybe TypeInfo
Vocab.OidCache.lookupTypeInfo QualifiedTypeName
key OidCache
oidCache
      Maybe TypeInfo -> (Maybe TypeInfo -> TypeInfo) -> TypeInfo
forall a b. a -> (a -> b) -> b
& TypeInfo -> Maybe TypeInfo -> TypeInfo
forall a. a -> Maybe a -> a
fromMaybe (Word32 -> Word32 -> TypeInfo
Vocab.TypeInfo.TypeInfo Word32
0 Word32
0)

{-# INLINE requestAndHandle #-}
requestAndHandle ::
  [Vocab.QualifiedTypeName] ->
  ((Vocab.QualifiedTypeName -> Vocab.TypeInfo.TypeInfo) -> a) ->
  RequestingOid a
requestAndHandle :: forall a.
[QualifiedTypeName]
-> ((QualifiedTypeName -> TypeInfo) -> a) -> RequestingOid a
requestAndHandle [QualifiedTypeName]
keys (QualifiedTypeName -> TypeInfo) -> a
fn = [QualifiedTypeName]
-> ((QualifiedTypeName -> TypeInfo) -> a)
-> LookingUp QualifiedTypeName TypeInfo a
forall k v a. [k] -> ((k -> v) -> a) -> LookingUp k v a
LookingUp.LookingUp [QualifiedTypeName]
keys (QualifiedTypeName -> TypeInfo) -> a
fn

{-# INLINE lift #-}
lift :: a -> RequestingOid a
lift :: forall a. a -> RequestingOid a
lift = a -> LookingUp QualifiedTypeName TypeInfo a
forall a k v. a -> LookingUp k v a
LookingUp.lift

{-# INLINE hoist #-}
hoist :: (a -> b) -> RequestingOid a -> RequestingOid b
hoist :: forall a b. (a -> b) -> RequestingOid a -> RequestingOid b
hoist a -> b
fn (LookingUp.LookingUp [QualifiedTypeName]
keys (QualifiedTypeName -> TypeInfo) -> a
use) = [QualifiedTypeName]
-> ((QualifiedTypeName -> TypeInfo) -> b)
-> LookingUp QualifiedTypeName TypeInfo b
forall k v a. [k] -> ((k -> v) -> a) -> LookingUp k v a
LookingUp.LookingUp [QualifiedTypeName]
keys (a -> b
fn (a -> b)
-> ((QualifiedTypeName -> TypeInfo) -> a)
-> (QualifiedTypeName -> TypeInfo)
-> 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
. (QualifiedTypeName -> TypeInfo) -> a
use)

{-# INLINE lookup #-}
lookup :: Vocab.QualifiedTypeName -> RequestingOid Vocab.TypeInfo.TypeInfo
lookup :: QualifiedTypeName -> RequestingOid TypeInfo
lookup = QualifiedTypeName -> RequestingOid TypeInfo
forall k v. k -> LookingUp k v v
LookingUp.lookup

{-# INLINE lookingUp #-}
lookingUp :: Vocab.QualifiedTypeName -> (Vocab.TypeInfo.TypeInfo -> a) -> RequestingOid a
lookingUp :: forall a. QualifiedTypeName -> (TypeInfo -> a) -> RequestingOid a
lookingUp = QualifiedTypeName
-> (TypeInfo -> a) -> LookingUp QualifiedTypeName TypeInfo a
forall k v a. k -> (v -> a) -> LookingUp k v a
LookingUp.lookingUp

{-# INLINE hoistLookingUp #-}
hoistLookingUp :: Vocab.QualifiedTypeName -> (Vocab.TypeInfo.TypeInfo -> a -> b) -> RequestingOid a -> RequestingOid b
hoistLookingUp :: forall a b.
QualifiedTypeName
-> (TypeInfo -> a -> b) -> RequestingOid a -> RequestingOid b
hoistLookingUp = QualifiedTypeName
-> (TypeInfo -> a -> b)
-> LookingUp QualifiedTypeName TypeInfo a
-> LookingUp QualifiedTypeName TypeInfo b
forall k v a b.
k -> (v -> a -> b) -> LookingUp k v a -> LookingUp k v b
LookingUp.hoistLookingUp