on master help sign in
Document Rel8.Type.Composite
f998dd7Ollie Charles
src/Rel8/Type/Composite.hs+14
@@ -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)
86
86
87
87
88+-- | 'DBComposite' is used to associate composite type metadata with a Haskell
89+-- type.
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
94+
95+ -- | The name of the composite type that @a@ maps to.
91 compositeTypeName :: String
96 compositeTypeName :: String
92
97
93
98
99+-- | Collapse a 'HKD' into a PostgreSQL composite type.
100+--
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
104+-- type.
94compose :: DBComposite a => HKD a Expr -> Expr a
105compose :: DBComposite a => HKD a Expr -> Expr a
95compose = castExpr . fromPrimExpr . encoder
106compose = castExpr . fromPrimExpr . encoder
96
107
97
108
109+-- | Expand a composite type into a 'HKD'.
110+--
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