@@ -634,9 +634,50 @@ instance
634634 = fmap fromRecord
635635 . hsequence'
636636 . htrans (Proxy @FromField) fromField
637−instance (FromField (col ::: pgkey) (col ::: key), FromRow pgval val)
638− => FromRow (col ::: pgkey ': pgval) (P (col ::: key), val) where
639− fromRow (key :* val) = (,) <$> (unComp . fromField) key <*> fromRow val
637+instance (FromField (col ::: pg) (col ::: hask))
638+ => FromRow '[col ::: pg] (P (col ::: hask)) where
639+ fromRow (pg :* Nil) = (unComp . fromField) pg
640+instance
641+ ( row ~ Join row1 row2
642+ , FromRow row1 hask1
643+ , FromRow row2 hask2
644+ , SListI row
645+ ) => FromRow row (hask1, hask2) where
646+ fromRow row = case disjoin @row1 @row2 row of
647+ (row1, row2) -> (,) <$> fromRow row1 <*> fromRow row2
648+instance
649+ ( row ~ Join row1 row23
650+ , FromRow row1 hask1
651+ , FromRow row23 (hask2, hask3)
652+ , SListI row
653+ ) => FromRow row (hask1, hask2, hask3) where
654+ fromRow row = case disjoin @row1 @row23 row of
655+ (row1, row23) -> do
656+ hask1 <- fromRow row1
657+ (hask2, hask3) <- fromRow row23
658+ return (hask1, hask2, hask3)
659+instance
660+ ( row ~ Join row1 row234
661+ , FromRow row1 hask1
662+ , FromRow row234 (hask2, hask3, hask4)
663+ , SListI row
664+ ) => FromRow row (hask1, hask2, hask3, hask4) where
665+ fromRow row = case disjoin @row1 @row234 row of
666+ (row1, row234) -> do
667+ hask1 <- fromRow row1
668+ (hask2, hask3, hask4) <- fromRow row234
669+ return (hask1, hask2, hask3, hask4)
670+instance
671+ ( row ~ Join row1 row2345
672+ , FromRow row1 hask1
673+ , FromRow row2345 (hask2, hask3, hask4, hask5)
674+ , SListI row
675+ ) => FromRow row (hask1, hask2, hask3, hask4, hask5) where
676+ fromRow row = case disjoin @row1 @row2345 row of
677+ (row1, row2345) -> do
678+ hask1 <- fromRow row1
679+ (hask2, hask3, hask4, hask5) <- fromRow row2345
680+ return (hask1, hask2, hask3, hask4, hask5)
640681
641682-- | `Only` is a 1-tuple type, useful for encoding a single parameter with
642683-- `toParams` or decoding a single value with `fromRow`.