packages feed

hasql-1.10.3.4: src/library/Hasql/Codecs/RequestingOid/LookingUp.hs

module Hasql.Codecs.RequestingOid.LookingUp where

import Control.Applicative
import Prelude

data LookingUp k v a
  = LookingUp
      -- | Keys requested to be available for lookup.
      [k]
      -- | Continuation that looks up values by keys.
      ((k -> v) -> a)

type role LookingUp _ _ representational

deriving stock instance Functor (LookingUp k v)

instance Applicative (LookingUp k v) where
  {-# INLINE pure #-}
  pure a =
    LookingUp [] (\_ -> a)
  {-# INLINE (<*>) #-}
  LookingUp lKeys lUse <*> LookingUp rKeys rUse =
    LookingUp
      (lKeys <> rKeys)
      (\lookup -> lUse lookup (rUse lookup))

{-# INLINE lookup #-}
lookup :: k -> LookingUp k v v
lookup key =
  LookingUp [key] (\lookupFn -> lookupFn key)

{-# INLINE lift #-}
lift :: a -> LookingUp k v a
lift fa =
  LookingUp [] (const fa)

{-# INLINE lookingUp #-}
lookingUp :: k -> (v -> a) -> LookingUp k v a
lookingUp key cont =
  LookingUp [key] (\lookupFn -> cont (lookupFn key))

{-# INLINE hoistLookingUp #-}
hoistLookingUp :: k -> (v -> a -> b) -> LookingUp k v a -> LookingUp k v b
hoistLookingUp k tx (LookingUp keys use) =
  LookingUp (k : keys) (\lookupFn -> tx (lookupFn k) (use lookupFn))