on dev help sign in
remove Joinable
3d24153Eitan Chatav
squeal-postgresql/src/Squeal/PostgreSQL/Binary.hs+4−8
@@ -638,8 +638,7 @@ instance (FromField (col ::: pg) (col ::: hask))
638 => FromRow '[col ::: pg] (P (col ::: hask)) where
638 => FromRow '[col ::: pg] (P (col ::: hask)) where
639 fromRow (pg :* Nil) = (unComp . fromField) pg
639 fromRow (pg :* Nil) = (unComp . fromField) pg
640instance
640instance
641− ( Joinable row1 row2
642− , row ~ Join row1 row2
641+ ( row ~ Join row1 row2
643 , FromRow row1 hask1
642 , FromRow row1 hask1
644 , FromRow row2 hask2
643 , FromRow row2 hask2
645 , SListI row
644 , SListI row
@@ -647,8 +646,7 @@ instance
647 fromRow row = case disjoin @row1 @row2 row of
646 fromRow row = case disjoin @row1 @row2 row of
648 (row1, row2) -> (,) <$> fromRow row1 <*> fromRow row2
647 (row1, row2) -> (,) <$> fromRow row1 <*> fromRow row2
649instance
648instance
650− ( Joinable row1 row23
651− , row ~ Join row1 row23
649+ ( row ~ Join row1 row23
652 , FromRow row1 hask1
650 , FromRow row1 hask1
653 , FromRow row23 (hask2, hask3)
651 , FromRow row23 (hask2, hask3)
654 , SListI row
652 , SListI row
@@ -659,8 +657,7 @@ instance
659 (hask2, hask3) <- fromRow row23
657 (hask2, hask3) <- fromRow row23
660 return (hask1, hask2, hask3)
658 return (hask1, hask2, hask3)
661instance
659instance
662− ( Joinable row1 row234
663− , row ~ Join row1 row234
660+ ( row ~ Join row1 row234
664 , FromRow row1 hask1
661 , FromRow row1 hask1
665 , FromRow row234 (hask2, hask3, hask4)
662 , FromRow row234 (hask2, hask3, hask4)
666 , SListI row
663 , SListI row
@@ -671,8 +668,7 @@ instance
671 (hask2, hask3, hask4) <- fromRow row234
668 (hask2, hask3, hask4) <- fromRow row234
672 return (hask1, hask2, hask3, hask4)
669 return (hask1, hask2, hask3, hask4)
673instance
670instance
674− ( Joinable row1 row2345
675− , row ~ Join row1 row2345
671+ ( row ~ Join row1 row2345
676 , FromRow row1 hask1
672 , FromRow row1 hask1
677 , FromRow row2345 (hask2, hask3, hask4, hask5)
673 , FromRow row2345 (hask2, hask3, hask4, hask5)
678 , SListI row
674 , SListI row
squeal-postgresql/src/Squeal/PostgreSQL/Schema.hs+15−10
@@ -92,7 +92,8 @@ module Squeal.PostgreSQL.Schema
92 , Rename
92 , Rename
93 , DropIfConstraintsInvolve
93 , DropIfConstraintsInvolve
94 -- * Lists
94 -- * Lists
95− , Joinable (..)
95+ , Join
96+ , disjoin
96 , Elem
97 , Elem
97 , In
98 , In
98 , Length
99 , Length
@@ -628,15 +629,19 @@ type family NullifyFrom (tables :: FromType) :: FromType where
628
629
629-- | `Join` is simply promoted `++` and is used in @JOIN@s in
630-- | `Join` is simply promoted `++` and is used in @JOIN@s in
630-- `Squeal.PostgreSQL.Query.FromClause`s.
631-- `Squeal.PostgreSQL.Query.FromClause`s.
631−class Joinable xs ys where
632− type family Join (xs :: [k]) (ys :: [k]) :: [k]
632+type family Join xs ys where
633− disjoin :: NP expr (Join xs ys) -> (NP expr xs, NP expr ys)
633+ Join '[] ys = ys
634−instance Joinable '[] ys where
634+ Join (x ': xs) ys = x ': Join xs ys
635− type Join '[] ys = ys
635+
636− disjoin list = (Nil, list)
636+-- | `disjoin` is a utility function for splitting an `NP` list into pieces.
637−instance Joinable xs ys => Joinable (x ': xs) ys where
637+disjoin
638− type Join (x ': xs) ys = x ': Join xs ys
638+ :: forall xs ys expr. SListI xs
639+ => NP expr (Join xs ys)
640+ -> (NP expr xs, NP expr ys)
641+disjoin = case sList @xs of
642+ SNil -> \ys -> (Nil, ys)
643+ SCons -> \(x :* xsys) ->
639− disjoin (x :* xsys) = case disjoin xsys of (xs,ys) -> (x :* xs, ys)
644+ case disjoin xsys of (xs,ys) -> (x :* xs, ys)
640
645
641-- | @Create alias x xs@ adds @alias ::: x@ to the end of @xs@ and is used in
646-- | @Create alias x xs@ adds @alias ::: x@ to the end of @xs@ and is used in
642-- `Squeal.PostgreSQL.Definition.createTable` statements and in @ALTER TABLE@
647-- `Squeal.PostgreSQL.Definition.createTable` statements and in @ALTER TABLE@