on dev help sign in
remove Joinable

factor our `disjoin`.

commit3d241539ba4aa390cd5d14a8ed54247e1055ec2a authorEitan Chatav <eitan@Eitans-MacBook-Pro.local> dateFri 1 Mar 2019, 09:25 (8 years ago) parenta0afa3c
2 files changed+19−18
squeal-postgresql/src/Squeal/PostgreSQL/Binary.hs+4−8 squeal-postgresql/src/Squeal/PostgreSQL/Schema.hs+15−10
squeal-postgresql/src/Squeal/PostgreSQL/Binary.hs+4−8
@@ -638,8 +638,7 @@ instance (FromField (col ::: pg) (col ::: hask))
638638 => FromRow '[col ::: pg] (P (col ::: hask)) where
639639 fromRow (pg :* Nil) = (unComp . fromField) pg
640640instance
641− ( Joinable row1 row2
642− , row ~ Join row1 row2
641+ ( row ~ Join row1 row2
643642 , FromRow row1 hask1
644643 , FromRow row2 hask2
645644 , SListI row
@@ -647,8 +646,7 @@ instance
647646 fromRow row = case disjoin @row1 @row2 row of
648647 (row1, row2) -> (,) <$> fromRow row1 <*> fromRow row2
649648instance
650− ( Joinable row1 row23
651− , row ~ Join row1 row23
649+ ( row ~ Join row1 row23
652650 , FromRow row1 hask1
653651 , FromRow row23 (hask2, hask3)
654652 , SListI row
@@ -659,8 +657,7 @@ instance
659657 (hask2, hask3) <- fromRow row23
660658 return (hask1, hask2, hask3)
661659instance
662− ( Joinable row1 row234
663− , row ~ Join row1 row234
660+ ( row ~ Join row1 row234
664661 , FromRow row1 hask1
665662 , FromRow row234 (hask2, hask3, hask4)
666663 , SListI row
@@ -671,8 +668,7 @@ instance
671668 (hask2, hask3, hask4) <- fromRow row234
672669 return (hask1, hask2, hask3, hask4)
673670instance
674− ( Joinable row1 row2345
675− , row ~ Join row1 row2345
671+ ( row ~ Join row1 row2345
676672 , FromRow row1 hask1
677673 , FromRow row2345 (hask2, hask3, hask4, hask5)
678674 , SListI row
squeal-postgresql/src/Squeal/PostgreSQL/Schema.hs+15−10
@@ -92,7 +92,8 @@ module Squeal.PostgreSQL.Schema
9292 , Rename
9393 , DropIfConstraintsInvolve
9494 -- * Lists
95− , Joinable (..)
95+ , Join
96+ , disjoin
9697 , Elem
9798 , In
9899 , Length
@@ -628,15 +629,19 @@ type family NullifyFrom (tables :: FromType) :: FromType where
628629
629630-- | `Join` is simply promoted `++` and is used in @JOIN@s in
630631-- `Squeal.PostgreSQL.Query.FromClause`s.
631−class Joinable xs ys where
632− type family Join (xs :: [k]) (ys :: [k]) :: [k]
633− disjoin :: NP expr (Join xs ys) -> (NP expr xs, NP expr ys)
634−instance Joinable '[] ys where
635− type Join '[] ys = ys
636− disjoin list = (Nil, list)
637−instance Joinable xs ys => Joinable (x ': xs) ys where
638− type Join (x ': xs) ys = x ': Join xs ys
639− disjoin (x :* xsys) = case disjoin xsys of (xs,ys) -> (x :* xs, ys)
632+type family Join xs ys where
633+ Join '[] ys = ys
634+ Join (x ': xs) ys = x ': Join xs ys
635+
636+-- | `disjoin` is a utility function for splitting an `NP` list into pieces.
637+disjoin
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) ->
644+ case disjoin xsys of (xs,ys) -> (x :* xs, ys)
640645
641646-- | @Create alias x xs@ adds @alias ::: x@ to the end of @xs@ and is used in
642647-- `Squeal.PostgreSQL.Definition.createTable` statements and in @ALTER TABLE@