@@ -30,34 +30,76 @@
3030module Data.Generics.Product.Internal.Constraints
3131 (
3232 GHasConstraints (..)
33+ , GHasConstraints' (..)
3334 , HList (..)
3435 ) where
3536
3637import Data.Kind (Type, Constraint)
3738import GHC.Generics
3839import Data.Generics.Internal.VL.Iso
40+import Data.Generics.Internal.VL.Traversal
3941
4042-- | Constrained traversal.
41−class GHasConstraints (c :: * -> Constraint) (f :: * -> *) where
42− gconstraints :: forall g x.
43+class GHasConstraints' (c :: * -> Constraint) (f :: * -> *) where
44+ gconstraints' :: forall g x.
4345 Applicative g => (forall a. c a => a -> g a) -> f x -> g (f x)
4446
45−instance (GHasConstraints c l, GHasConstraints c r) => GHasConstraints c (l :*: r) where
46− gconstraints f (l :*: r) = (:*:) <$> gconstraints @c f l <*> gconstraints @c f r
47+instance
48+ ( GHasConstraints' c l
49+ , GHasConstraints' c r
50+ ) => GHasConstraints' c (l :*: r) where
51+ gconstraints' f (l :*: r)
52+ = (:*:) <$> gconstraints' @c f l <*> gconstraints' @c f r
4753
48−instance (GHasConstraints c l, GHasConstraints c r) => GHasConstraints c (l :+: r) where
54+instance
55+ ( GHasConstraints' c l
56+ , GHasConstraints' c r
57+ ) => GHasConstraints' c (l :+: r) where
58+ gconstraints' f (L1 l) = L1 <$> gconstraints' @c f l
59+ gconstraints' f (R1 r) = R1 <$> gconstraints' @c f r
60+
61+instance c a => GHasConstraints' c (Rec0 a) where
62+ gconstraints' = kIso
63+
64+instance GHasConstraints' c f
65+ => GHasConstraints' c (M1 m meta f) where
66+ gconstraints' f (M1 x) = M1 <$> gconstraints' @c f x
67+
68+instance GHasConstraints' c U1 where
69+ gconstraints' _ _ = pure U1
70+
71+--------------------------------------------------------------------------------
72+
73+class GHasConstraints (c :: * -> * -> Constraint) s t where
74+ gconstraints :: TraversalC c (s x) (t x)
75+
76+instance
77+ ( GHasConstraints c l l'
78+ , GHasConstraints c r r'
79+ ) => GHasConstraints c (l :*: r) (l' :*: r') where
80+ gconstraints f (l :*: r)
81+ = (:*:) <$> gconstraints @c f l <*> gconstraints @c f r
82+
83+instance
84+ ( GHasConstraints c l l'
85+ , GHasConstraints c r r'
86+ ) => GHasConstraints c (l :+: r) (l' :+: r') where
4987 gconstraints f (L1 l) = L1 <$> gconstraints @c f l
5088 gconstraints f (R1 r) = R1 <$> gconstraints @c f r
5189
52−instance c a => GHasConstraints c (K1 R a) where
53− gconstraints = kIso
54−
55−instance GHasConstraints c f => GHasConstraints c (M1 m meta f) where
90+instance GHasConstraints c s t
91+ => GHasConstraints c (M1 i m s) (M1 i m t) where
5692 gconstraints f (M1 x) = M1 <$> gconstraints @c f x
5793
58−instance GHasConstraints c U1 where
94+instance GHasConstraints c U1 U1 where
5995 gconstraints _ _ = pure U1
6096
97+instance GHasConstraints c V1 V1 where
98+ gconstraints _ = pure
99+
100+instance c a b => GHasConstraints c (Rec0 a) (Rec0 b) where
101+ gconstraints = kIso
102+
61103--------------------------------------------------------------------------------
62104
63105-- | Multi-traversal