hpqtypes-extras-1.14.0.0: Extra utilities for hpqtypes library
Safe HaskellNone
LanguageHaskell2010

Database.PostgreSQL.PQTypes.Deriving

Synopsis

Helpers, to be used with deriving via (-XDerivingVia).

newtype SQLEnum a Source #

Helper newtype to be used with deriving via to derive (PQFormat, ToSQL, FromSQL) instances for enums, given an instance of EnumEncoding.

Hint: non-trivial Enum instances can be derived using the 'generic-data' package!

>>> :{
data Colours = Blue | Black | Red | Mauve | Orange
  deriving (Eq, Show, Enum, Bounded)
instance EnumEncoding Colours where
  type EnumBase Colours = Int16
  encodeEnum = \case
    Blue   -> 1
    Black  -> 7
    Red    -> 2
    Mauve  -> 6
    Orange -> 3
:}

Note: To get SQL-specific instances use DerivingVia:

data Colours = ...
  ...
  deriving (PQFormat, ToSQL, FromSQL) via SQLEnum Colours
>>> isInjective (encodeEnum @Colours)
True
>>> decodeEnum @Colours 7
Right Black
>>> decodeEnum @Colours 42
Left [(1,3),(6,7)]

Constructors

SQLEnum a 

Instances

Instances details
(EnumEncoding a, PQFormat (EnumBase a), ToSQL (EnumBase a)) => ToSQL (SQLEnum a) Source # 
Instance details

Defined in Database.PostgreSQL.PQTypes.Deriving

Associated Types

type PQDest (SQLEnum a) #

Methods

toSQL :: SQLEnum a -> ParamAllocator -> (Ptr (PQDest (SQLEnum a)) -> IO r) -> IO r #

(EnumEncoding a, PQFormat (EnumBase a), FromSQL (EnumBase a), Show (EnumBase a), Typeable (EnumBase a)) => FromSQL (SQLEnum a) Source # 
Instance details

Defined in Database.PostgreSQL.PQTypes.Deriving

Associated Types

type PQBase (SQLEnum a) #

Methods

fromSQL :: Maybe (PQBase (SQLEnum a)) -> IO (SQLEnum a) #

PQFormat (EnumBase a) => PQFormat (SQLEnum a) Source # 
Instance details

Defined in Database.PostgreSQL.PQTypes.Deriving

type PQDest (SQLEnum a) Source # 
Instance details

Defined in Database.PostgreSQL.PQTypes.Deriving

type PQDest (SQLEnum a) = PQDest (EnumBase a)
type PQBase (SQLEnum a) Source # 
Instance details

Defined in Database.PostgreSQL.PQTypes.Deriving

type PQBase (SQLEnum a) = PQBase (EnumBase a)

class (Enum a, Bounded a, Enum (EnumBase a), Ord (EnumBase a)) => EnumEncoding a where Source #

Minimal complete definition

encodeEnum

Associated Types

type EnumBase a Source #

Methods

encodeEnum :: a -> EnumBase a Source #

Encode a as a base type.

decodeEnum :: EnumBase a -> Either [(EnumBase a, EnumBase a)] a Source #

Decode base type to an a. If the conversion fails, a list of valid ranges is returned instead.

Note: The default implementation looks up values in decodeEnumMap and can be overwritten for performance if necessary.

decodeEnumMap :: Map (EnumBase a) a Source #

Include the inverse map as a top-level part of the EnumEncoding instance to ensure it is only computed once by GHC.

newtype SQLEnumAsText a Source #

A special case of SQLEnum, where the enum is to be encoded as text (SQLEnum can't be used because of the Enum constraint on the domain of encodeEnum).

>>> :{
data Person = Alfred | Bertrand | Charles
  deriving (Eq, Show, Enum, Bounded)
instance EnumAsTextEncoding Person where
  encodeEnumAsText = \case
    Alfred   -> "alfred"
    Bertrand -> "bertrand"
    Charles  -> "charles"
:}

Note: To get SQL-specific instances use DerivingVia:

data Person = ...
  ...
  deriving (PQFormat, ToSQL, FromSQL) via SQLEnumAsText Person
>>> isInjective (encodeEnumAsText @Person)
True
>>> decodeEnumAsText @Person "bertrand"
Right Bertrand
>>> decodeEnumAsText @Person "batman"
Left ["alfred","bertrand","charles"]

Constructors

SQLEnumAsText a 

Instances

Instances details
EnumAsTextEncoding a => ToSQL (SQLEnumAsText a) Source # 
Instance details

Defined in Database.PostgreSQL.PQTypes.Deriving

Associated Types

type PQDest (SQLEnumAsText a) #

Methods

toSQL :: SQLEnumAsText a -> ParamAllocator -> (Ptr (PQDest (SQLEnumAsText a)) -> IO r) -> IO r #

EnumAsTextEncoding a => FromSQL (SQLEnumAsText a) Source # 
Instance details

Defined in Database.PostgreSQL.PQTypes.Deriving

Associated Types

type PQBase (SQLEnumAsText a) #

EnumAsTextEncoding a => PQFormat (SQLEnumAsText a) Source # 
Instance details

Defined in Database.PostgreSQL.PQTypes.Deriving

type PQDest (SQLEnumAsText a) Source # 
Instance details

Defined in Database.PostgreSQL.PQTypes.Deriving

type PQBase (SQLEnumAsText a) Source # 
Instance details

Defined in Database.PostgreSQL.PQTypes.Deriving

class (Enum a, Bounded a) => EnumAsTextEncoding a where Source #

Minimal complete definition

encodeEnumAsText

Methods

encodeEnumAsText :: a -> Text Source #

Encode a as Text.

decodeEnumAsText :: Text -> Either [Text] a Source #

Decode Text to an a. If the conversion fails, a list of valid values is returned instead.

Note: The default implementation looks up values in decodeEnumAsTextMap and can be overwritten for performance if necessary.

decodeEnumAsTextMap :: Map Text a Source #

Include the inverse map as a top-level part of the SQLEnumTextEncoding instance to ensure it is only computed once by GHC.

For use in doctests.

isInjective :: (Enum a, Bounded a, Eq a, Eq b) => (a -> b) -> Bool Source #

To be used in doctests to prove injectivity of encoding functions.

>>> isInjective (id :: Bool -> Bool)
True
>>> isInjective (\(_ :: Bool) -> False)
False