@@ -58,6 +58,7 @@ module Squeal.PostgreSQL.Schema
58 , Aliased (As)
58 , Aliased (As)
59 , renderAliasedAs
59 , renderAliasedAs
60 , AliasesOf
60 , AliasesOf
62 , HasUnique
63 , HasUnique
@@ -118,7 +119,6 @@ module Squeal.PostgreSQL.Schema
118 , FieldTypeOf
119 , FieldTypeOf
119 , FieldTypesOf
120 , FieldTypesOf
120 , RecordFieldTypesOf
121 , RecordFieldTypesOf
124import Control.DeepSeq
124import Control.DeepSeq
@@ -413,6 +413,27 @@ type family AliasesOf aliaseds where
413 AliasesOf '[] = '[]
413 AliasesOf '[] = '[]
414 AliasesOf (alias ::: ty ': tys) = alias ': AliasesOf tys
414 AliasesOf (alias ::: ty ': tys) = alias ': AliasesOf tys
416+class SOP.All KnownSymbol ns => ZipAliased ns xs where
419+ (ns :: [Symbol]) (xs :: [k]) = (zs :: [(Symbol,k)]) | zs -> ns xs
424+ -> SOP.NP (Aliased expr) (ZipAs ns xs)
426+instance ZipAliased '[] '[] where
427+ type ZipAs '[] '[] = '[]
428+ zipAliases SOP.Nil SOP.Nil = SOP.Nil
433+ ) => ZipAliased (n ': ns) (x ': xs) where
434+ type ZipAs (n ': ns) (x ': xs) = '(n,x) ': ZipAs ns xs
435+ zipAliases (n SOP.:* ns) (x SOP.:* xs) = x `As` n SOP.:* zipAliases ns xs
416-- | @HasUnique alias fields field@ is a constraint that proves that
437-- | @HasUnique alias fields field@ is a constraint that proves that
417-- @fields@ is a singleton of @alias ::: field@.
438-- @fields@ is a singleton of @alias ::: field@.
418type HasUnique alias fields field = fields ~ '[alias ::: field]
439type HasUnique alias fields field = fields ~ '[alias ::: field]
@@ -701,7 +722,7 @@ type family PGenumWith (hask :: Type) :: [Type.ConstructorName] where
702type family PGcompositeWith (hask :: Type) :: PGType where
723type family PGcompositeWith (hask :: Type) :: PGType where
703 PGcompositeWith hask =
724 PGcompositeWith hask =
704− 'PGcomposite (Zip
725+ 'PGcomposite (ZipAs
705 (FieldNamesOf (FieldsOf (SOP.DatatypeInfoOf hask)))
726 (FieldNamesOf (FieldsOf (SOP.DatatypeInfoOf hask)))
706 (RecordFieldTypesOf (SOP.Code hask)))
727 (RecordFieldTypesOf (SOP.Code hask)))
@@ -746,7 +767,3 @@ type family FieldTypesOf (fields :: [Type]) where
747type family RecordFieldTypesOf (code :: [[Type]]) where
768type family RecordFieldTypesOf (code :: [[Type]]) where
748 RecordFieldTypesOf '[fields] = FieldTypesOf fields
769 RecordFieldTypesOf '[fields] = FieldTypesOf fields
750−type family Zip xs ys where
752− Zip (x ': xs) (y ': ys) = '(x,y) ': Zip xs ys