hasql-2.0.0.3: src/to-be-resolved/Hasql/ToBeResolved.hs
module Hasql.ToBeResolved
( ToBeResolved (..),
lookup,
)
where
import Control.Applicative
import Prelude hiding (lookup)
-- |
-- A computation that first declares the keys it needs resolved and then,
-- once a resolver @k -> v@ is provided, produces its result.
--
-- The defining trait is the upfront collection of keys prior to resolution,
-- hence the name.
data ToBeResolved k v a
= ToBeResolved
-- | Keys requested to be available for lookup.
[k]
-- | Continuation that looks up values by keys.
((k -> v) -> a)
type role ToBeResolved _ _ representational
deriving stock instance Functor (ToBeResolved k v)
instance Applicative (ToBeResolved k v) where
{-# INLINE pure #-}
pure a =
ToBeResolved [] (\_ -> a)
{-# INLINE (<*>) #-}
ToBeResolved lKeys lUse <*> ToBeResolved rKeys rUse =
ToBeResolved
(lKeys <> rKeys)
(\lookup -> lUse lookup (rUse lookup))
{-# INLINE lookup #-}
lookup :: k -> ToBeResolved k v v
lookup key =
ToBeResolved [key] (\lookupFn -> lookupFn key)