@@ -0,0 +1,62 @@
1+{-# LANGUAGE AllowAmbiguousTypes #-}
2+{-# LANGUAGE ConstraintKinds #-}
3+{-# LANGUAGE DataKinds #-}
4+{-# LANGUAGE FlexibleContexts #-}
5+{-# LANGUAGE FlexibleInstances #-}
6+{-# LANGUAGE FunctionalDependencies #-}
7+{-# LANGUAGE GADTs #-}
8+{-# LANGUAGE MultiParamTypeClasses #-}
9+{-# LANGUAGE NoMonomorphismRestriction #-}
10+{-# LANGUAGE Rank2Types #-}
11+{-# LANGUAGE ScopedTypeVariables #-}
12+{-# LANGUAGE TypeApplications #-}
13+{-# LANGUAGE TypeFamilyDependencies #-}
14+{-# LANGUAGE TypeOperators #-}
15+{-# LANGUAGE UndecidableInstances #-}
16+
17+{-# LANGUAGE DeriveGeneric #-}
18+
19+-----------------------------------------------------------------------------
20+-- |
21+-- Module : Data.Generics.Product.Internal.Param
22+-- Copyright : (C) 2017 Csongor Kiss
23+-- License : BSD3
24+-- Maintainer : Csongor Kiss <kiss.csongor.kiss@gmail.com>
25+-- Stability : experimental
26+-- Portability : non-portable
27+--
28+-- Derive traversals of a given type in a product.
29+--
30+-----------------------------------------------------------------------------
31+
32+module Data.Generics.Product.Internal.Param
33+ ( GHasParam (..)
34+ ) where
35+
36+import GHC.Generics
37+import Data.Generics.Internal.VL.Iso
38+import Data.Generics.Internal.Families.Changing
39+
40+class GHasParam (p :: Peano) s t a b | p t a -> s, p s b -> t where
41+ gparam :: forall g x.
42+ Applicative g => (a -> g b) -> s x -> g (t x)
43+
44+instance (GHasParam p l l' a b, GHasParam p r r' a b) => GHasParam p (l :*: r) (l' :*: r') a b where
45+ gparam f (l :*: r) = (:*:) <$> gparam @p f l <*> gparam @p f r
46+
47+instance (GHasParam p l l' a b, GHasParam p r r' a b) => GHasParam p (l :+: r) (l' :+: r') a b where
48+ gparam f (L1 l) = L1 <$> gparam @p f l
49+ gparam f (R1 r) = R1 <$> gparam @p f r
50+
51+instance GHasParam p (K1 R (param p a 'PTag)) (K1 R (param p b 'PTag)) (param p a 'PTag) (param p b 'PTag) where
52+ gparam = kIso
53+
54+instance {-# OVERLAPPABLE #-} (a ~ b) => GHasParam p (K1 R a) (K1 R b) c d where
55+ gparam _ = pure
56+
57+instance GHasParam p s t a b => GHasParam p (M1 m meta s) (M1 m meta t) a b where
58+ gparam f (M1 x) = M1 <$> gparam @p f x
59+
60+instance GHasParam p U1 U1 a b where
61+ gparam _ _ = pure U1
62+