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

import Data.HashMap.Strict qualified as HashMap
import Hasql.Codecs.RequestingOid.LookingUp qualified as LookingUp
import Hasql.Platform.Prelude hiding (lift, lookup)
import PostgreSQL.Binary.Decoding qualified as Binary

type RequestingOid =
  LookingUp.LookingUp
    (Maybe Text, Text)
    (Word32, Word32)

toUnknownTypes ::
  RequestingOid a ->
  HashSet (Maybe Text, Text)
toUnknownTypes :: forall a. RequestingOid a -> HashSet (Maybe Text, Text)
toUnknownTypes (LookingUp.LookingUp [(Maybe Text, Text)]
unknownTypes ((Maybe Text, Text) -> (Word32, Word32)) -> a
_) =
  [Item (HashSet (Maybe Text, Text))] -> HashSet (Maybe Text, Text)
forall l. IsList l => [Item l] -> l
fromList [(Maybe Text, Text)]
[Item (HashSet (Maybe Text, Text))]
unknownTypes

toBase ::
  RequestingOid a ->
  HashMap (Maybe Text, Text) (Word32, Word32) ->
  a
toBase :: forall a.
RequestingOid a -> HashMap (Maybe Text, Text) (Word32, Word32) -> a
toBase (LookingUp.LookingUp [(Maybe Text, Text)]
_unknownTypes ((Maybe Text, Text) -> (Word32, Word32)) -> a
decoder) HashMap (Maybe Text, Text) (Word32, Word32)
oidCache =
  ((Maybe Text, Text) -> (Word32, Word32)) -> a
decoder \(Maybe Text, Text)
key ->
    (Maybe Text, Text)
-> HashMap (Maybe Text, Text) (Word32, Word32)
-> Maybe (Word32, Word32)
forall k v. Hashable k => k -> HashMap k v -> Maybe v
HashMap.lookup (Maybe Text, Text)
key HashMap (Maybe Text, Text) (Word32, Word32)
oidCache
      Maybe (Word32, Word32)
-> (Maybe (Word32, Word32) -> (Word32, Word32)) -> (Word32, Word32)
forall a b. a -> (a -> b) -> b
& (Word32, Word32) -> Maybe (Word32, Word32) -> (Word32, Word32)
forall a. a -> Maybe a -> a
fromMaybe (Word32
0, Word32
0)

requestAndHandle ::
  [(Maybe Text, Text)] ->
  (((Maybe Text, Text) -> (Word32, Word32)) -> a) ->
  RequestingOid a
requestAndHandle :: forall a.
[(Maybe Text, Text)]
-> (((Maybe Text, Text) -> (Word32, Word32)) -> a)
-> RequestingOid a
requestAndHandle [(Maybe Text, Text)]
keys ((Maybe Text, Text) -> (Word32, Word32)) -> a
fn = [(Maybe Text, Text)]
-> (((Maybe Text, Text) -> (Word32, Word32)) -> a)
-> LookingUp (Maybe Text, Text) (Word32, Word32) a
forall k v a. [k] -> ((k -> v) -> a) -> LookingUp k v a
LookingUp.LookingUp [(Maybe Text, Text)]
keys ((Maybe Text, Text) -> (Word32, Word32)) -> a
fn

lift :: a -> RequestingOid a
lift :: forall a. a -> RequestingOid a
lift = a -> LookingUp (Maybe Text, Text) (Word32, Word32) a
forall a k v. a -> LookingUp k v a
LookingUp.lift

hoist :: (a -> b) -> RequestingOid a -> RequestingOid b
hoist :: forall a b. (a -> b) -> RequestingOid a -> RequestingOid b
hoist a -> b
fn (LookingUp.LookingUp [(Maybe Text, Text)]
keys ((Maybe Text, Text) -> (Word32, Word32)) -> a
use) = [(Maybe Text, Text)]
-> (((Maybe Text, Text) -> (Word32, Word32)) -> b)
-> LookingUp (Maybe Text, Text) (Word32, Word32) b
forall k v a. [k] -> ((k -> v) -> a) -> LookingUp k v a
LookingUp.LookingUp [(Maybe Text, Text)]
keys (a -> b
fn (a -> b)
-> (((Maybe Text, Text) -> (Word32, Word32)) -> a)
-> ((Maybe Text, Text) -> (Word32, Word32))
-> 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
. ((Maybe Text, Text) -> (Word32, Word32)) -> a
use)

lookup :: (Maybe Text, Text) -> RequestingOid (Word32, Word32)
lookup :: (Maybe Text, Text) -> RequestingOid (Word32, Word32)
lookup = (Maybe Text, Text) -> RequestingOid (Word32, Word32)
forall k v. k -> LookingUp k v v
LookingUp.lookup

lookingUp :: (Maybe Text, Text) -> ((Word32, Word32) -> a) -> RequestingOid a
lookingUp :: forall a.
(Maybe Text, Text) -> ((Word32, Word32) -> a) -> RequestingOid a
lookingUp = (Maybe Text, Text)
-> ((Word32, Word32) -> a)
-> LookingUp (Maybe Text, Text) (Word32, Word32) a
forall k v a. k -> (v -> a) -> LookingUp k v a
LookingUp.lookingUp

hoistLookingUp :: (Maybe Text, Text) -> ((Word32, Word32) -> a -> b) -> RequestingOid a -> RequestingOid b
hoistLookingUp :: forall a b.
(Maybe Text, Text)
-> ((Word32, Word32) -> a -> b)
-> RequestingOid a
-> RequestingOid b
hoistLookingUp = (Maybe Text, Text)
-> ((Word32, Word32) -> a -> b)
-> LookingUp (Maybe Text, Text) (Word32, Word32) a
-> LookingUp (Maybe Text, Text) (Word32, Word32) b
forall k v a b.
k -> (v -> a -> b) -> LookingUp k v a -> LookingUp k v b
LookingUp.hoistLookingUp