rel8-1.1.0.0: src/Rel8/Schema/Result.hs
{-# language DataKinds #-}
{-# language GADTs #-}
{-# language NamedFieldPuns #-}
{-# language StandaloneKindSignatures #-}
{-# language TypeFamilies #-}
module Rel8.Schema.Result
( Result
, null, nullifier, unnullifier
, vectorizer, unvectorizer
)
where
-- base
import Data.Functor.Identity ( Identity( Identity), runIdentity )
import Prelude hiding ( null )
-- rel8
import Rel8.Schema.Kind ( Context )
import Rel8.Schema.Null ( Nullify, Nullity( Null, NotNull ) )
import Rel8.Schema.Spec ( Spec(..) )
-- | The @Result@ context is the context used for decoded query results.
--
-- When a query is executed against a PostgreSQL database, Rel8 parses the
-- returned rows, decoding each row into the @Result@ context.
type Result :: Context
type Result = Identity
null :: Result (Maybe a)
null = Identity Nothing
nullifier :: Spec a -> Result a -> Result (Nullify a)
nullifier Spec {nullity} (Identity a) = Identity $ case nullity of
Null -> a
NotNull -> Just a
unnullifier :: Spec a -> Result (Nullify a) -> Maybe (Result a)
unnullifier Spec {nullity} (Identity a) =
case nullity of
Null -> pure $ Identity a
NotNull -> Identity <$> a
vectorizer :: Functor f => Spec a -> f (Result a) -> Result (f a)
vectorizer _ = Identity . fmap runIdentity
unvectorizer :: Functor f => Spec a -> Result (f a) -> f (Result a)
unvectorizer _ (Identity results) = Identity <$> results