packages feed

hasql-mapping-0.1: src/library/Hasql/Mapping/IsStatement.hs

module Hasql.Mapping.IsStatement where

import qualified Hasql.Statement as Statement

-- |
-- Evidence that a data-structure models statement parameters determining the statement and its result type.
--
-- Supports a modularisation pattern, where you define everything related to one statement in an isolated module.
-- This pattern leads to high code cohesion and low coupling.
--
-- ==== __Example of such a module__
--
-- > module MusicCatalogueDb.Statements.SelectArtistIdsByName where
-- >
-- > import Data.Functor.Contravariant
-- > import Data.Text (Text)
-- > import Data.UUID (UUID)
-- > import Data.Vector (Vector)
-- > import qualified Hasql.Decoders as Decoders
-- > import qualified Hasql.Encoders as Encoders
-- > import Hasql.Mapping.IsStatement
-- > import Prelude
-- >
-- > data SelectArtistIdsByName = SelectArtistIdsByName
-- >   { name :: Text
-- >   }
-- >
-- > type SelectArtistIdsByNameResult = Vector SelectArtistIdsByNameResultRow
-- >
-- > data SelectArtistIdsByNameResultRow = SelectArtistIdsByNameResultRow
-- >   { id :: UUID
-- >   }
-- >
-- > instance IsStatement SelectArtistIdsByName where
-- >   type Result SelectArtistIdsByName = SelectArtistIdsByNameResult
-- >   statement =
-- >     Statement.preparable sql encoder decoder
-- >     where
-- >       sql =
-- >         "select id from artist\n\
-- >         \where name = $1\n\
-- >         \limit 1"
-- >       encoder =
-- >         mconcat
-- >           [ (\(SelectArtistIdsByName x) -> x)
-- >               >$< Encoders.param (Encoders.nonNullable Encoders.text)
-- >           ]
-- >       decoder =
-- >         Decoders.rowVector
-- >           ( SelectArtistIdsByNameResultRow
-- >               <$> Decoders.column (Decoders.nonNullable Decoders.uuid)
-- >           )
class IsStatement a where
  type Result a
  statement :: Statement.Statement a (Result a)