@@ -85,16 +85,30 @@ instance (DBComposite a, OrdTable (HKD a Expr)) => DBMax (Composite a)
85instance (DBComposite a, OrdTable (HKD a Expr)) => DBMin (Composite a)
85instance (DBComposite a, OrdTable (HKD a Expr)) => DBMin (Composite a)
88+-- | 'DBComposite' is used to associate composite type metadata with a Haskell
88type DBComposite :: Type -> Constraint
90type DBComposite :: Type -> Constraint
89class (DBType a, HKDable a) => DBComposite a where
91class (DBType a, HKDable a) => DBComposite a where
92+ -- | The names of all fields in the composite type that @a@ maps to.
90 compositeFields :: HKD a Name
93 compositeFields :: HKD a Name
95+ -- | The name of the composite type that @a@ maps to.
91 compositeTypeName :: String
96 compositeTypeName :: String
99+-- | Collapse a 'HKD' into a PostgreSQL composite type.
101+-- 'HKD' values are represented in queries by having a column for each field in
102+-- the corresponding Haskell type. 'compose' collapses these columns into a
103+-- single column expression, by combining them into a PostgreSQL composite
94compose :: DBComposite a => HKD a Expr -> Expr a
105compose :: DBComposite a => HKD a Expr -> Expr a
95compose = castExpr . fromPrimExpr . encoder
106compose = castExpr . fromPrimExpr . encoder
109+-- | Expand a composite type into a 'HKD'.
111+-- 'decompose' is the inverse of 'compose'.
98decompose :: forall a. DBComposite a => Expr a -> HKD a Expr
112decompose :: forall a. DBComposite a => Expr a -> HKD a Expr
99decompose (toPrimExpr -> a) = fromColumns $ htabulate \field ->
113decompose (toPrimExpr -> a) = fromColumns $ htabulate \field ->
100 case hfield names field of
114 case hfield names field of