@@ -397,6 +397,20 @@ class ToField (x :: (Symbol, Type)) (field :: (Symbol, NullityType)) where
397instance ToNullityParam x ty => ToField (alias ::: x) (alias ::: ty) where
397instance ToNullityParam x ty => ToField (alias ::: x) (alias ::: ty) where
398 toField (P x) = K . unK $ toNullityParam @x @ty x
398 toField (P x) = K . unK $ toNullityParam @x @ty x
400+class ToFixArray (x :: Type) (dims :: [Nat]) (array :: NullityType) where
401+ toFixArray :: x -> K (K Encoding.Array dims) array
402+instance ToNullityParam x ty => ToFixArray x '[] ty where
403+ toFixArray = K . K . maybe Encoding.nullArray Encoding.encodingArray . unK
404+ . toNullityParam @x @ty
406+ ( IsProductType product xs
409+ , ToFixArray x dims ty )
410+ => ToFixArray product (dim ': dims) ty where
411+ toFixArray = K . K . Encoding.dimensionArray foldlN
412+ (unK . unK . toFixArray @x @dims @ty) . unZ . unSOP . from
400class ToArray (x :: Type) (array :: NullityType) where
414class ToArray (x :: Type) (array :: NullityType) where
401 toArray :: x -> K Encoding.Array array
415 toArray :: x -> K Encoding.Array array
402 baseOid :: Word32
416 baseOid :: Word32
@@ -501,6 +515,41 @@ instance Aeson.FromJSON x => FromValue 'PGjson (Json x) where
501instance Aeson.FromJSON x => FromValue 'PGjsonb (Jsonb x) where
515instance Aeson.FromJSON x => FromValue 'PGjsonb (Jsonb x) where
502 fromValue = Jsonb <$>
516 fromValue = Jsonb <$>
503 Decoding.jsonb_bytes (left Strict.Text.pack . Aeson.eitherDecodeStrict)
517 Decoding.jsonb_bytes (left Strict.Text.pack . Aeson.eitherDecodeStrict)
518+instance FromValue pg y
519+ => FromValue ('PGvararray ('NotNull pg)) (VarArray (Vector y)) where
522+ rep n x = VarArray <$> Vector.replicateM n x
524+ Decoding.array $ Decoding.dimensionArray rep
525+ (fromFixArray @'[] @('NotNull pg))
526+instance FromValue pg y
527+ => FromValue ('PGvararray ('Null pg)) (VarArray (Vector (Maybe y))) where
530+ rep n x = VarArray <$> Vector.replicateM n x
532+ Decoding.array $ Decoding.dimensionArray rep
533+ (fromFixArray @'[] @('Null pg))
534+instance FromValue pg y
535+ => FromValue ('PGvararray ('NotNull pg)) (VarArray [y]) where
538+ rep n x = VarArray <$> replicateM n x
540+ Decoding.array $ Decoding.dimensionArray rep
541+ (fromFixArray @'[] @('NotNull pg))
542+instance FromValue pg y
543+ => FromValue ('PGvararray ('Null pg)) (VarArray [Maybe y]) where
546+ rep n x = VarArray <$> replicateM n x
548+ Decoding.array $ Decoding.dimensionArray rep
549+ (fromFixArray @'[] @('Null pg))
550+instance FromFixArray dims ty y
551+ => FromValue ('PGfixarray_ dims ty) (FixArray y) where
552+ fromValue = FixArray <$> Decoding.array (fromFixArray @dims @ty @y)
504instance FromArray ('NotNull ('PGvararray ty)) y
553instance FromArray ('NotNull ('PGvararray ty)) y
505 => FromValue ('PGvararray ty) y where
554 => FromValue ('PGvararray ty) y where
506 fromValue = Decoding.array (fromArray @('NotNull ('PGvararray ty)) @y)
555 fromValue = Decoding.array (fromArray @('NotNull ('PGvararray ty)) @y)
@@ -577,6 +626,24 @@ instance FromValue pg y
577 K (Just bytestring) -> P . Just <$>
626 K (Just bytestring) -> P . Just <$>
578 Decoding.valueParser (fromValue @pg) bytestring
627 Decoding.valueParser (fromValue @pg) bytestring
629+class FromFixArray (dims :: [Nat]) (ty :: NullityType) (y :: Type) where
630+ fromFixArray :: Decoding.Array y
631+instance FromValue pg y => FromFixArray '[] ('NotNull pg) y where
632+ fromFixArray = Decoding.valueArray (fromValue @pg @y)
633+instance FromValue pg y => FromFixArray '[] ('Null pg) (Maybe y) where
634+ fromFixArray = Decoding.nullableValueArray (fromValue @pg @y)
636+ ( IsProductType product ys
639+ , FromFixArray dims ty y )
640+ => FromFixArray (dim ': dims) ty product where
643+ rep _ = fmap (to . SOP . Z) . replicateMN
645+ Decoding.dimensionArray rep (fromFixArray @dims @ty @y)
580class FromArray (ty :: NullityType) (y :: Type) where
647class FromArray (ty :: NullityType) (y :: Type) where
581 fromArray :: Decoding.Array y
648 fromArray :: Decoding.Array y
582instance {-# OVERLAPPABLE #-} FromValue pg y
649instance {-# OVERLAPPABLE #-} FromValue pg y