squeal-postgresql-0.9.2.0: src/Squeal/PostgreSQL/Expression/Default.hs
{-|
Module: Squeal.PostgreSQL.Expression.Default
Description: optional expressions
Copyright: (c) Eitan Chatav, 2019
Maintainer: eitan@morphism.tech
Stability: experimental
optional expressions
-}
{-# LANGUAGE
DataKinds
, GADTs
, LambdaCase
, OverloadedStrings
, PatternSynonyms
, PolyKinds
, QuantifiedConstraints
, RankNTypes
, TypeOperators
#-}
module Squeal.PostgreSQL.Expression.Default
( -- * Default
Optional (..)
, mapOptional
, pattern NotDefault
) where
import Data.Kind
import Generics.SOP
import Squeal.PostgreSQL.Render
import Squeal.PostgreSQL.Type.Schema
-- | `Optional` is either `Default` or `Set`ting of a value,
-- parameterized by an appropriate `Optionality`.
data Optional (expr :: k -> Type) (ty :: (Optionality, k)) where
-- | Use the `Default` value for a column.
Default :: Optional expr ('Def :=> ty)
-- | `Set` a value for a column.
Set :: expr ty -> Optional expr (def :=> ty)
instance (forall x. RenderSQL (expr x)) => RenderSQL (Optional expr ty) where
renderSQL = \case
Default -> "DEFAULT"
Set x -> renderSQL x
-- | Map a function over an `Optional` expression.
mapOptional
:: (expr x -> expr y)
-> Optional expr (def :=> x)
-> Optional expr (def :=> y)
mapOptional f = \case
Default -> Default
Set x -> Set (f x)
-- | `NotDefault` pattern analagous to `Just`.
pattern NotDefault :: ty -> Optional I ('Def :=> ty)
pattern NotDefault x = Set (I x)