servant-db-postgresql-0.2.0.0: src/Servant/DB/PostgreSQL/Composite.hs
{-|
Module : Servant.DB.PostgreSQL.Composite
Description : Composite types support.
Portability : Not portable
-}
module Servant.DB.PostgreSQL.Composite(
Composite(..)
) where
import Data.List (intersperse)
import Data.Typeable
import Database.PostgreSQL.Simple.ToField
import Database.PostgreSQL.Simple.ToRow
import GHC.Generics
-- | Wrapper around 'a' that indicates that the type can be used as composite
-- type.
--
-- >>> type UserAPI = Arg "u" (Composite User) :> Procedure "insertUser" ()
newtype Composite a = Composite { unComposite :: a }
deriving (Typeable, Eq, Generic, Show, Read, Ord)
instance ToRow a => ToField (Composite a) where
toField (Composite a) = Many [
Plain "("
, Many $ intersperse (Plain ",") $ toRow a
, Plain ")"
]