@@ -18,6 +18,7 @@ module Rel8.Type.Composite
18
18
( Composite ( Composite )
19
19
, DBComposite ( compositeFields , compositeTypeName )
20
20
, compose , decompose
21
+ , decodeComposite , encodeComposite
21
22
)
22
23
where
23
24
@@ -52,7 +53,7 @@ import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye
52
53
-- rel8
53
54
import Rel8.Expr ( Expr )
54
55
import Rel8.Expr.Opaleye ( castExpr , fromPrimExpr , toPrimExpr )
55
- import Rel8.Schema.HTable ( HTable , hfield , hspecs , htabulate , htabulateA )
56
+ import Rel8.Schema.HTable (HTable , hfield , hfoldMap , hspecs , htabulate , htabulateA )
56
57
import Rel8.Schema.Name ( Name ( Name ) )
57
58
import Rel8.Schema.Null ( Nullity ( Null , NotNull ) )
58
59
import Rel8.Schema.QualifiedName (QualifiedName )
@@ -97,19 +98,27 @@ newtype Composite a = Composite
97
98
}
98
99
99
100
101
+ decodeComposite :: HTable t => Decoder (t Result )
102
+ decodeComposite =
103
+ Decoder
104
+ { binary = Decoders. composite decoder
105
+ , text = parser
106
+ }
107
+
108
+
109
+ encodeComposite :: forall t . HTable t => Encoder (t Result )
110
+ encodeComposite =
111
+ Encoder
112
+ { binary = Encoders. composite (encoder @ t )
113
+ , text = builder
114
+ , quote = quoter . litHTable
115
+ }
116
+
117
+
100
118
instance DBComposite a => DBType (Composite a ) where
101
119
typeInformation = TypeInformation
102
- { decode =
103
- Decoder
104
- { binary = Decoders. composite (Composite . fromResult @ _ @ (HKD a Expr ) <$> decoder)
105
- , text = fmap (Composite . fromResult @ _ @ (HKD a Expr )) . parser
106
- }
107
- , encode =
108
- Encoder
109
- { binary = Encoders. composite (toResult @ _ @ (HKD a Expr ) . unComposite >$< encoder)
110
- , text = builder . toResult @ _ @ (HKD a Expr ) . unComposite
111
- , quote = quoter . litHTable . toResult @ _ @ (HKD a Expr ) . unComposite
112
- }
120
+ { decode = Composite . fromResult @ _ @ (HKD a Expr ) <$> decodeComposite
121
+ , encode = toResult @ _ @ (HKD a Expr ) . unComposite >$< encodeComposite
113
122
, delimiter = ' ,'
114
123
, typeName =
115
124
TypeName
@@ -256,7 +265,4 @@ buildRow elements =
256
265
257
266
258
267
quoter :: HTable t => t Expr -> Opaleye. PrimExpr
259
- quoter a = Opaleye. FunExpr " ROW" exprs
260
- where
261
- exprs = getConst $ htabulateA \ field -> case hfield a field of
262
- expr -> Const [toPrimExpr expr]
268
+ quoter = Opaleye. FunExpr " ROW" . hfoldMap (pure . toPrimExpr)
0 commit comments