@@ -59,9 +59,9 @@ create multi-dimensional fixed length arrays.
5959
6060>>> :{
6161data Row = Row
62− { col1 :: Vector Int16
63− , col2 :: (Maybe Int16,Maybe Int16)
64− , col3 :: ((Int16,Int16),(Int16,Int16),(Int16,Int16))
62+ { col1 :: VarArray (Vector Int16)
63+ , col2 :: FixArray (Maybe Int16,Maybe Int16)
64+ , col3 :: FixArray ((Int16,Int16),(Int16,Int16),(Int16,Int16))
6565 } deriving (Eq, GHC.Generic)
6666:}
6767
@@ -74,13 +74,13 @@ Once again, we define a simple round trip query.
7474let
7575 roundTrip :: Query_ (Public '[]) Row Row
7676 roundTrip = values_ $
77− parameter @1 (int2 & vararray) `as` #col1 :*
78− parameter @2 (int2 & fixarray @2) `as` #col2 :*
79− parameter @3 (int2 & fixarray @2 & fixarray @3) `as` #col3
77+ parameter @1 (int2 & vararray) `as` #col1 :*
78+ parameter @2 (int2 & fixarray @'[2]) `as` #col2 :*
79+ parameter @3 (int2 & fixarray @'[3,2]) `as` #col3
8080:}
8181
8282>>> :set -XOverloadedLists
83−>>> let input = Row [1,2] (Just 1,Nothing) ((1,2),(3,4),(5,6))
83+>>> let input = Row (VarArray [1,2]) (FixArray (Just 1,Nothing)) (FixArray ((1,2),(3,4),(5,6)))
8484>>> :{
8585void . withConnection "host=localhost port=5432 dbname=exampledb" $ do
8686 result <- runQueryParams roundTrip input
@@ -322,19 +322,9 @@ instance (ToParam x pg, HasOid pg)
322322 . Encoding.nullableArray_vector (oid @pg) (unK . toParam @x @pg)
323323 . getVarArray
324324instance (ToFixArray x dims ty, ty ~ nullity pg, HasOid pg)
325− => ToParam (FixArray x) ('PGfixarray_ dims ty) where
325+ => ToParam (FixArray x) ('PGfixarray dims ty) where
326326 toParam = K . Encoding.array (oid @pg)
327327 . unK . unK . toFixArray @x @dims @ty . getFixArray
328−instance ToArray x ('NotNull ('PGvararray ty))
329− => ToParam x ('PGvararray ty) where
330− toParam
331− = K . Encoding.array (baseOid @x @('NotNull ('PGvararray ty)))
332− . unK . toArray @x @('NotNull ('PGvararray ty))
333−instance ToArray x ('NotNull ('PGfixarray n ty))
334− => ToParam x ('PGfixarray n ty) where
335− toParam
336− = K . Encoding.array (baseOid @x @('NotNull ('PGfixarray n ty)))
337− . unK . toArray @x @('NotNull ('PGfixarray n ty))
338328instance
339329 ( IsEnumType x
340330 , HasDatatypeInfo x
@@ -430,47 +420,6 @@ instance
430420 toFixArray = K . K . Encoding.dimensionArray foldlN
431421 (unK . unK . toFixArray @x @dims @ty) . unZ . unSOP . from
432422
433−class ToArray (x :: Type) (array :: NullityType) where
434− toArray :: x -> K Encoding.Array array
435− baseOid :: Word32
436− default baseOid :: HasOid (PGTypeOf array) => Word32
437− baseOid = oid @(PGTypeOf array)
438−instance {-# OVERLAPPABLE #-} (HasOid pg, ToParam x pg)
439− => ToArray x ('NotNull pg) where
440− toArray = K . Encoding.encodingArray . unK . toParam @x @pg
441−instance {-# OVERLAPPABLE #-} (HasOid pg, ToParam x pg)
442− => ToArray (Maybe x) ('Null pg) where
443− toArray = K . maybe Encoding.nullArray
444− (Encoding.encodingArray . unK . toParam @x @pg)
445−instance {-# OVERLAPPING #-} ToArray x array
446− => ToArray (Vector x) ('NotNull ('PGvararray array)) where
447− toArray = K . Encoding.dimensionArray Vector.foldl'
448− (unK . toArray @x @array)
449− baseOid = baseOid @x @array
450−instance {-# OVERLAPPING #-} ToArray x array
451− => ToArray (Maybe (Vector x)) ('Null ('PGvararray array)) where
452− toArray = K . maybe Encoding.nullArray
453− (Encoding.dimensionArray Vector.foldl' (unK . toArray @x @array))
454− baseOid = baseOid @x @array
455−instance {-# OVERLAPPING #-}
456− ( IsProductType product xs
457− , Length xs ~ n
458− , All ((~) x) xs
459− , ToArray x array )
460− => ToArray product ('NotNull ('PGfixarray n array)) where
461− toArray = K . Encoding.dimensionArray foldlN
462− (unK . toArray @x @array) . unZ . unSOP . from
463− baseOid = baseOid @x @array
464−instance {-# OVERLAPPING #-}
465− ( IsProductType product xs
466− , Length xs ~ n
467− , All ((~) x) xs
468− , ToArray x array )
469− => ToArray (Maybe product) ('Null ('PGfixarray n array)) where
470− toArray = K . maybe Encoding.nullArray
471− (Encoding.dimensionArray foldlN (unK . toArray @x @array) . unZ . unSOP . from)
472− baseOid = baseOid @x @array
473−
474423-- | A `ToParams` constraint generically sequences the encodings of `Type`s
475424-- of the fields of a tuple or record to a row of `ColumnType`s. You should
476425-- not define instances of `ToParams`. Instead define `Generic` instances
@@ -567,14 +516,8 @@ instance FromValue pg y
567516 Decoding.array $ Decoding.dimensionArray rep
568517 (fromFixArray @'[] @('Null pg))
569518instance FromFixArray dims ty y
570− => FromValue ('PGfixarray_ dims ty) (FixArray y) where
519+ => FromValue ('PGfixarray dims ty) (FixArray y) where
571520 fromValue = FixArray <$> Decoding.array (fromFixArray @dims @ty @y)
572−instance FromArray ('NotNull ('PGvararray ty)) y
573− => FromValue ('PGvararray ty) y where
574− fromValue = Decoding.array (fromArray @('NotNull ('PGvararray ty)) @y)
575−instance FromArray ('NotNull ('PGfixarray n ty)) y
576− => FromValue ('PGfixarray n ty) y where
577− fromValue = Decoding.array (fromArray @('NotNull ('PGfixarray n ty)) @y)
578521instance
579522 ( IsEnumType y
580523 , HasDatatypeInfo y
@@ -663,45 +606,6 @@ instance
663606 in
664607 Decoding.dimensionArray rep (fromFixArray @dims @ty @y)
665608
666−class FromArray (ty :: NullityType) (y :: Type) where
667− fromArray :: Decoding.Array y
668−instance {-# OVERLAPPABLE #-} FromValue pg y
669− => FromArray ('NotNull pg) y where
670− fromArray = Decoding.valueArray (fromValue @pg @y)
671−instance {-# OVERLAPPABLE #-} FromValue pg y
672− => FromArray ('Null pg) (Maybe y) where
673− fromArray = Decoding.nullableValueArray (fromValue @pg @y)
674−instance {-# OVERLAPPING #-} FromArray array y
675− => FromArray ('NotNull ('PGvararray array)) (Vector y) where
676− fromArray =
677− Decoding.dimensionArray Vector.replicateM (fromArray @array @y)
678−instance {-# OVERLAPPING #-} FromArray array y
679− => FromArray ('Null ('PGvararray array)) (Maybe (Vector y)) where
680− fromArray = Just <$>
681− Decoding.dimensionArray Vector.replicateM (fromArray @array @y)
682−instance {-# OVERLAPPING #-}
683− ( FromArray array y
684− , All ((~) y) ys
685− , SListI ys
686− , IsProductType product ys )
687− => FromArray ('NotNull ('PGfixarray n array)) product where
688− fromArray =
689− let
690− rep _ = fmap (to . SOP . Z) . replicateMN
691− in
692− Decoding.dimensionArray rep (fromArray @array @y)
693−instance {-# OVERLAPPING #-}
694− ( FromArray array y
695− , All ((~) y) ys
696− , SListI ys
697− , IsProductType product ys )
698− => FromArray ('Null ('PGfixarray n array)) (Maybe product) where
699− fromArray =
700− let
701− rep _ = fmap (to . SOP . Z) . replicateMN
702− in
703− Just <$> Decoding.dimensionArray rep (fromArray @array @y)
704−
705609-- | A `FromRow` constraint generically sequences the parsings of the columns
706610-- of a `RowType` into the fields of a record `Type` provided they have
707611-- the same field names. You should not define instances of `FromRow`.
@@ -796,7 +700,7 @@ type it's applied to should be stored as a `PGfixarray`.
796700-}
797701newtype FixArray arr = FixArray {getFixArray :: arr}
798702 deriving (Eq, Ord, Show, Read, GHC.Generic)
799−-- type instance PG (FixArray x) = 'PGfixarray (DimPG x) (FixPG x)
703+type instance PG (FixArray x) = 'PGfixarray (DimPG x) (FixPG x)
800704
801705type family DimPG (hask :: Type) :: [Nat] where
802706 DimPG (x,x) = 2 ': DimPG x