packages feed

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