1{-# LANGUAGE CPP #-}
2{-# LANGUAGE FlexibleInstances #-}
3#if defined(__GLASGOW_HASKELL__)
4{-# LANGUAGE Trustworthy #-}
5#endif
6{-# LANGUAGE Rank2Types #-}
7
8#include "lens-common.h"
9
10-----------------------------------------------------------------------------
11-- |
12-- Module      :  Language.Haskell.TH.Lens
13-- Copyright   :  (C) 2012-2016 Edward Kmett
14-- License     :  BSD-style (see the file LICENSE)
15-- Maintainer  :  Edward Kmett <ekmett@gmail.com>
16-- Stability   :  experimental
17-- Portability :  TemplateHaskell
18--
19-- Lenses, Prisms, and Traversals for working with Template Haskell.
20--
21-- Beware that the API offered in this module is subject to change, as it
22-- mirrors the API exposed by the @template-haskell@ package, which
23-- frequently changes between different releases of GHC. An effort is made
24-- to identify the functions in this module which have different type
25-- signatures when compiled with different versions of @template-haskell@.
26----------------------------------------------------------------------------
27module Language.Haskell.TH.Lens
28  (
29  -- * Traversals
30    HasName(..)
31  , HasTypes(..)
32  , HasTypeVars(..)
33  , SubstType(..)
34  , typeVars      -- :: HasTypeVars t => Traversal' t Name
35  , substTypeVars -- :: HasTypeVars t => Map Name Name -> t -> t
36  , conFields
37  , conNamedFields
38  -- * Lenses
39  -- ** Loc Lenses
40  , locFileName
41  , locPackage
42  , locModule
43  , locStart
44  , locEnd
45  -- ** FunDep Lenses
46  , funDepInputs
47  , funDepOutputs
48  -- ** Match Lenses
49  , matchPattern
50  , matchBody
51  , matchDeclarations
52  -- ** Fixity Lenses
53  , fixityPrecedence
54  , fixityDirection
55  -- ** Clause Lenses
56  , clausePattern
57  , clauseBody
58  , clauseDecs
59  -- ** FieldExp Lenses
60  , fieldExpName
61  , fieldExpExpression
62  -- ** FieldPat Lenses
63  , fieldPatName
64  , fieldPatPattern
65  -- ** TySynEqn Lenses
66# if MIN_VERSION_template_haskell(2,15,0)
67  , tySynEqnLHS
68# endif
69  , tySynEqnPatterns
70  , tySynEqnResult
71#if MIN_VERSION_template_haskell(2,11,0)
72  -- ** InjectivityAnn Lenses
73  , injectivityAnnOutput
74  , injectivityAnnInputs
75  -- ** TypeFamilyHead Lenses
76  , typeFamilyHeadName
77  , typeFamilyHeadTyVarBndrs
78  , typeFamilyHeadResultSig
79  , typeFamilyHeadInjectivityAnn
80  -- ** Bang Lenses
81  , bangSourceUnpackedness
82  , bangSourceStrictness
83#endif
84#if MIN_VERSION_template_haskell(2,12,0)
85  -- ** DerivClause Lenses
86  , derivClauseStrategy
87  , derivClauseCxt
88#endif
89  -- * Prisms
90  -- ** Info Prisms
91  , _ClassI
92  , _ClassOpI
93  , _TyConI
94  , _FamilyI
95  , _PrimTyConI
96  , _DataConI
97  , _VarI
98  , _TyVarI
99#if MIN_VERSION_template_haskell(2,12,0)
100  , _PatSynI
101#endif
102  -- ** Dec Prisms
103  , _FunD
104  , _ValD
105  , _DataD
106  , _NewtypeD
107  , _TySynD
108  , _ClassD
109  , _InstanceD
110  , _SigD
111  , _ForeignD
112  , _InfixD
113  , _PragmaD
114  , _DataInstD
115  , _NewtypeInstD
116  , _TySynInstD
117  , _ClosedTypeFamilyD
118  , _RoleAnnotD
119#if MIN_VERSION_template_haskell(2,10,0)
120  , _StandaloneDerivD
121  , _DefaultSigD
122#endif
123#if MIN_VERSION_template_haskell(2,11,0)
124  , _DataFamilyD
125  , _OpenTypeFamilyD
126#else
127  , _FamilyD
128#endif
129#if MIN_VERSION_template_haskell(2,12,0)
130  , _PatSynD
131  , _PatSynSigD
132#endif
133#if MIN_VERSION_template_haskell(2,15,0)
134  , _ImplicitParamBindD
135#endif
136#if MIN_VERSION_template_haskell(2,12,0)
137  -- ** PatSynDir Prisms
138  , _Unidir
139  , _ImplBidir
140  , _ExplBidir
141  -- ** PatSynArgs Prisms
142  , _PrefixPatSyn
143  , _InfixPatSyn
144  , _RecordPatSyn
145#endif
146  -- ** Con Prisms
147  , _NormalC
148  , _RecC
149  , _InfixC
150  , _ForallC
151#if MIN_VERSION_template_haskell(2,11,0)
152  , _GadtC
153  , _RecGadtC
154#endif
155#if MIN_VERSION_template_haskell(2,11,0)
156  -- ** Overlap Prisms
157  ,_Overlappable
158  ,_Overlapping
159  ,_Overlaps
160  ,_Incoherent
161#endif
162#if MIN_VERSION_template_haskell(2,11,0)
163  -- ** SourceUnpackedness Prisms
164  , _NoSourceUnpackedness
165  , _SourceNoUnpack
166  , _SourceUnpack
167  -- ** SourceStrictness Prisms
168  , _NoSourceStrictness
169  , _SourceLazy
170  , _SourceStrict
171  -- ** DecidedStrictness Prisms
172  , _DecidedLazy
173  , _DecidedStrict
174  , _DecidedUnpack
175#else
176  -- ** Strict Prisms
177  , _IsStrict
178  , _NotStrict
179  , _Unpacked
180#endif
181  -- ** Foreign Prisms
182  , _ImportF
183  , _ExportF
184  -- ** Callconv Prisms
185  , _CCall
186  , _StdCall
187#if MIN_VERSION_template_haskell(2,10,0)
188  , _CApi
189  , _Prim
190  , _JavaScript
191#endif
192  -- ** Safety Prisms
193  , _Unsafe
194  , _Safe
195  , _Interruptible
196  -- ** Pragma Prisms
197  , _InlineP
198  , _SpecialiseP
199  , _SpecialiseInstP
200  , _RuleP
201  , _AnnP
202#if MIN_VERSION_template_haskell(2,10,0)
203  , _LineP
204#endif
205#if MIN_VERSION_template_haskell(2,12,0)
206  , _CompleteP
207#endif
208  -- ** Inline Prisms
209  , _NoInline
210  , _Inline
211  , _Inlinable
212  -- ** RuleMatch Prisms
213  , _ConLike
214  , _FunLike
215  -- ** Phases Prisms
216  , _AllPhases
217  , _FromPhase
218  , _BeforePhase
219  -- ** RuleBndr Prisms
220  , _RuleVar
221  , _TypedRuleVar
222  -- ** AnnTarget Prisms
223  , _ModuleAnnotation
224  , _TypeAnnotation
225  , _ValueAnnotation
226  -- ** FunDep Prisms TODO make a lens
227  , _FunDep
228#if !(MIN_VERSION_template_haskell(2,13,0))
229  -- ** FamFlavour Prisms
230  , _TypeFam
231  , _DataFam
232#endif
233  -- ** FixityDirection Prisms
234  , _InfixL
235  , _InfixR
236  , _InfixN
237  -- ** Exp Prisms
238  , _VarE
239  , _ConE
240  , _LitE
241  , _AppE
242#if MIN_VERSION_template_haskell(2,12,0)
243  , _AppTypeE
244#endif
245  , _InfixE
246  , _UInfixE
247  , _ParensE
248  , _LamE
249  , _LamCaseE
250  , _TupE
251  , _UnboxedTupE
252#if MIN_VERSION_template_haskell(2,12,0)
253  , _UnboxedSumE
254#endif
255  , _CondE
256  , _MultiIfE
257  , _LetE
258  , _CaseE
259  , _DoE
260  , _CompE
261  , _ArithSeqE
262  , _ListE
263  , _SigE
264  , _RecConE
265  , _RecUpdE
266#if MIN_VERSION_template_haskell(2,10,0)
267  , _StaticE
268#endif
269#if MIN_VERSION_template_haskell(2,11,0)
270  , _UnboundVarE
271#endif
272#if MIN_VERSION_template_haskell(2,13,0)
273  , _LabelE
274#endif
275#if MIN_VERSION_template_haskell(2,15,0)
276  , _MDoE
277  , _ImplicitParamVarE
278#endif
279  -- ** Body Prisms
280  , _GuardedB
281  , _NormalB
282  -- ** Guard Prisms
283  , _NormalG
284  , _PatG
285  -- ** Stmt Prisms
286  , _BindS
287  , _LetS
288  , _NoBindS
289  , _ParS
290#if MIN_VERSION_template_haskell(2,15,0)
291  , _RecS
292#endif
293  -- ** Range Prisms
294  , _FromR
295  , _FromThenR
296  , _FromToR
297  , _FromThenToR
298  -- ** Lit Prisms
299  , _CharL
300  , _StringL
301  , _IntegerL
302  , _RationalL
303  , _IntPrimL
304  , _WordPrimL
305  , _FloatPrimL
306  , _DoublePrimL
307  , _StringPrimL
308#if MIN_VERSION_template_haskell(2,11,0)
309  , _CharPrimL
310#endif
311#if MIN_VERSION_template_haskell(2,16,0)
312  , _BytesPrimL
313#endif
314  -- ** Pat Prisms
315  , _LitP
316  , _VarP
317  , _TupP
318  , _UnboxedTupP
319#if MIN_VERSION_template_haskell(2,12,0)
320  , _UnboxedSumP
321#endif
322  , _ConP
323  , _InfixP
324  , _UInfixP
325  , _ParensP
326  , _TildeP
327  , _BangP
328  , _AsP
329  , _WildP
330  , _RecP
331  , _ListP
332  , _SigP
333  , _ViewP
334  -- ** Type Prisms
335  , _ForallT
336  , _AppT
337  , _SigT
338  , _VarT
339  , _ConT
340  , _PromotedT
341  , _TupleT
342  , _UnboxedTupleT
343#if MIN_VERSION_template_haskell(2,12,0)
344  , _UnboxedSumT
345#endif
346  , _ArrowT
347#if MIN_VERSION_template_haskell(2,10,0)
348  , _EqualityT
349#endif
350  , _ListT
351  , _PromotedTupleT
352  , _PromotedNilT
353  , _PromotedConsT
354  , _StarT
355  , _ConstraintT
356  , _LitT
357#if MIN_VERSION_template_haskell(2,11,0)
358  , _InfixT
359  , _UInfixT
360  , _ParensT
361  , _WildCardT
362#endif
363#if MIN_VERSION_template_haskell(2,15,0)
364  , _AppKindT
365  , _ImplicitParamT
366#endif
367#if MIN_VERSION_template_haskell(2,16,0)
368  , _ForallVisT
369#endif
370#if MIN_VERSION_template_haskell(2,17,0)
371  , _MulArrowT
372#endif
373#if MIN_VERSION_template_haskell(2,17,0)
374  -- ** Specificity Prisms
375  , _SpecifiedSpec
376  , _InferredSpec
377#endif
378  -- ** TyVarBndr Prisms
379  , _PlainTV
380  , _KindedTV
381#if MIN_VERSION_template_haskell(2,11,0)
382  -- ** FamilyResultSig Prisms
383  , _NoSig
384  , _KindSig
385  , _TyVarSig
386#endif
387  -- ** TyLit Prisms
388  , _NumTyLit
389  , _StrTyLit
390#if !MIN_VERSION_template_haskell(2,10,0)
391  -- ** Pred Prisms
392  , _ClassP
393  , _EqualP
394#endif
395  -- ** Role Prisms
396  , _NominalR
397  , _RepresentationalR
398  , _PhantomR
399  , _InferR
400#if MIN_VERSION_template_haskell(2,12,0)
401  -- ** DerivStrategy Prisms
402  , _StockStrategy
403  , _AnyclassStrategy
404  , _NewtypeStrategy
405#endif
406  ) where
407
408import Control.Applicative
409import Control.Lens.At
410import Control.Lens.Getter
411import Control.Lens.Setter
412import Control.Lens.Fold
413import Control.Lens.Iso (Iso', iso)
414import Control.Lens.Lens
415import Control.Lens.Prism
416import Control.Lens.Tuple
417import Control.Lens.Traversal
418import qualified Data.Map as Map
419import Data.Map (Map)
420import Data.Maybe (fromMaybe)
421import Data.Monoid
422import qualified Data.Set as Set
423import Data.Set (Set)
424import Data.Set.Lens
425import Language.Haskell.TH
426import Language.Haskell.TH.Datatype.TyVarBndr
427import Language.Haskell.TH.Syntax
428import Data.Word
429#if MIN_VERSION_template_haskell(2,15,0)
430import Control.Lens.Internal.TH (unfoldType)
431import Data.Foldable as F (foldl')
432#endif
433import Prelude
434
435-- | Has a 'Name'
436class HasName t where
437  -- | Extract (or modify) the 'Name' of something
438  name :: Lens' t Name
439
440instance HasName (TyVarBndr_ flag) where
441  name = traverseTVName
442
443instance HasName Name where
444  name = id
445
446-- | On @template-haskell-2.11.0.0@ or later, if a 'GadtC' or 'RecGadtC' has
447-- multiple 'Name's, the leftmost 'Name' will be chosen.
448instance HasName Con where
449  name f (NormalC n tys)       = (`NormalC` tys) <$> f n
450  name f (RecC n tys)          = (`RecC` tys) <$> f n
451  name f (InfixC l n r)        = (\n' -> InfixC l n' r) <$> f n
452  name f (ForallC bds ctx con) = ForallC bds ctx <$> name f con
453#if MIN_VERSION_template_haskell(2,11,0)
454  name f (GadtC ns argTys retTy) =
455    (\n -> GadtC [n] argTys retTy) <$> f (head ns)
456  name f (RecGadtC ns argTys retTy) =
457    (\n -> RecGadtC [n] argTys retTy) <$> f (head ns)
458#endif
459
460instance HasName Foreign where
461  name f (ImportF cc saf str n ty) =
462    (\n' -> ImportF cc saf str n' ty) <$> f n
463  name f (ExportF cc str n ty) =
464    (\n' -> ExportF cc str n' ty) <$> f n
465
466instance HasName RuleBndr where
467  name f (RuleVar n) = RuleVar <$> f n
468  name f (TypedRuleVar n ty) = (`TypedRuleVar` ty) <$> f n
469
470#if MIN_VERSION_template_haskell(2,11,0)
471instance HasName TypeFamilyHead where
472  name f (TypeFamilyHead n tvbs frs mia) =
473    (\n' -> TypeFamilyHead n' tvbs frs mia) <$> f n
474
475instance HasName InjectivityAnn where
476  name f (InjectivityAnn n deps) = (`InjectivityAnn` deps) <$> f n
477#endif
478
479-- | Contains some amount of `Type`s inside
480class HasTypes t where
481  -- | Traverse all the types
482  types :: Traversal' t Type
483
484instance HasTypes Type where
485  types = id
486
487instance HasTypes Con where
488  types f (NormalC n t)      = NormalC n <$> traverse (_2 (types f)) t
489  types f (RecC n t)         = RecC n <$> traverse (_3 (types f)) t
490  types f (InfixC t1 n t2) = InfixC <$> _2 (types f) t1
491                                       <*> pure n <*> _2 (types f) t2
492  types f (ForallC vb ctx con)    = ForallC vb ctx <$> types f con
493#if MIN_VERSION_template_haskell(2,11,0)
494  types f (GadtC ns argTys retTy) =
495    GadtC    ns <$> traverse (_2 (types f)) argTys <*> types f retTy
496  types f (RecGadtC ns argTys retTy) =
497    RecGadtC ns <$> traverse (_3 (types f)) argTys <*> types f retTy
498#endif
499
500instance HasTypes Foreign where
501  types f (ImportF cc saf str n t) = ImportF cc saf str n <$> types f t
502  types f (ExportF cc     str n t) = ExportF cc     str n <$> types f t
503
504instance HasTypes TySynEqn where
505#if MIN_VERSION_template_haskell(2,15,0)
506  types f (TySynEqn mtvbs lhs rhs) = TySynEqn <$> traverse (traverse go) mtvbs
507                                              <*> types f lhs
508                                              <*> types f rhs
509    where
510      go = traverseTVKind f
511#else
512  types f (TySynEqn lhss rhs) = TySynEqn <$> traverse (types f) lhss
513                                         <*> types f rhs
514#endif
515
516instance HasTypes t => HasTypes [t] where
517  types = traverse . types
518
519-- | Provides for the extraction of free type variables, and alpha renaming.
520class HasTypeVars t where
521  -- | When performing substitution into this traversal you're not allowed
522  -- to substitute in a name that is bound internally or you'll violate
523  -- the 'Traversal' laws, when in doubt generate your names with 'newName'.
524  typeVarsEx :: Set Name -> Traversal' t Name
525
526instance HasTypeVars (TyVarBndr_ flag) where
527  typeVarsEx s f b
528    | s^.contains (b^.name) = pure b
529    | otherwise             = name f b
530
531instance HasTypeVars Name where
532  typeVarsEx s f n
533    | s^.contains n = pure n
534    | otherwise     = f n
535
536instance HasTypeVars Type where
537  typeVarsEx s f (VarT n)             = VarT <$> typeVarsEx s f n
538  typeVarsEx s f (AppT l r)           = AppT <$> typeVarsEx s f l <*> typeVarsEx s f r
539  typeVarsEx s f (ForallT bs ctx ty)  = ForallT bs <$> typeVarsEx s' f ctx <*> typeVarsEx s' f ty
540       where s' = s `Set.union` setOf typeVars bs
541  typeVarsEx _ _ t@ConT{}             = pure t
542  typeVarsEx _ _ t@TupleT{}           = pure t
543  typeVarsEx _ _ t@ListT{}            = pure t
544  typeVarsEx _ _ t@ArrowT{}           = pure t
545  typeVarsEx _ _ t@UnboxedTupleT{}    = pure t
546  typeVarsEx s f (SigT t k)           = SigT <$> typeVarsEx s f t
547                                             <*> typeVarsEx s f k
548  typeVarsEx _ _ t@PromotedT{}        = pure t
549  typeVarsEx _ _ t@PromotedTupleT{}   = pure t
550  typeVarsEx _ _ t@PromotedNilT{}     = pure t
551  typeVarsEx _ _ t@PromotedConsT{}    = pure t
552  typeVarsEx _ _ t@StarT{}            = pure t
553  typeVarsEx _ _ t@ConstraintT{}      = pure t
554  typeVarsEx _ _ t@LitT{}             = pure t
555#if MIN_VERSION_template_haskell(2,10,0)
556  typeVarsEx _ _ t@EqualityT{}        = pure t
557#endif
558#if MIN_VERSION_template_haskell(2,11,0)
559  typeVarsEx s f (InfixT  t1 n t2)    = InfixT  <$> typeVarsEx s f t1
560                                                <*> pure n
561                                                <*> typeVarsEx s f t2
562  typeVarsEx s f (UInfixT t1 n t2)    = UInfixT <$> typeVarsEx s f t1
563                                                <*> pure n
564                                                <*> typeVarsEx s f t2
565  typeVarsEx s f (ParensT t)          = ParensT <$> typeVarsEx s f t
566  typeVarsEx _ _ t@WildCardT{}        = pure t
567#endif
568#if MIN_VERSION_template_haskell(2,12,0)
569  typeVarsEx _ _ t@UnboxedSumT{}      = pure t
570#endif
571#if MIN_VERSION_template_haskell(2,15,0)
572  typeVarsEx s f (AppKindT t k)       = AppKindT <$> typeVarsEx s f t
573                                                 <*> typeVarsEx s f k
574  typeVarsEx s f (ImplicitParamT n t) = ImplicitParamT n <$> typeVarsEx s f t
575#endif
576#if MIN_VERSION_template_haskell(2,16,0)
577  typeVarsEx s f (ForallVisT bs ty)   = ForallVisT bs <$> typeVarsEx s' f ty
578       where s' = s `Set.union` setOf typeVars bs
579#endif
580#if MIN_VERSION_template_haskell(2,17,0)
581  typeVarsEx _ _ t@MulArrowT{}        = pure t
582#endif
583
584#if !MIN_VERSION_template_haskell(2,10,0)
585instance HasTypeVars Pred where
586  typeVarsEx s f (ClassP n ts) = ClassP n <$> typeVarsEx s f ts
587  typeVarsEx s f (EqualP l r)  = EqualP <$> typeVarsEx s f l <*> typeVarsEx s f r
588#endif
589
590instance HasTypeVars Con where
591  typeVarsEx s f (NormalC n ts) = NormalC n <$> traverseOf (traverse . _2) (typeVarsEx s f) ts
592  typeVarsEx s f (RecC n ts) = RecC n <$> traverseOf (traverse . _3) (typeVarsEx s f) ts
593  typeVarsEx s f (InfixC l n r) = InfixC <$> g l <*> pure n <*> g r
594       where g (i, t) = (,) i <$> typeVarsEx s f t
595  typeVarsEx s f (ForallC bs ctx c) = ForallC bs <$> typeVarsEx s' f ctx <*> typeVarsEx s' f c
596       where s' = s `Set.union` setOf typeVars bs
597#if MIN_VERSION_template_haskell(2,11,0)
598  typeVarsEx s f (GadtC ns argTys retTy) =
599    GadtC ns <$> traverseOf (traverse . _2) (typeVarsEx s f) argTys
600             <*> typeVarsEx s f retTy
601  typeVarsEx s f (RecGadtC ns argTys retTy) =
602    RecGadtC ns <$> traverseOf (traverse . _3) (typeVarsEx s f) argTys
603                <*> typeVarsEx s f retTy
604#endif
605
606instance HasTypeVars t => HasTypeVars [t] where
607  typeVarsEx s = traverse . typeVarsEx s
608
609instance HasTypeVars t => HasTypeVars (Maybe t) where
610  typeVarsEx s = traverse . typeVarsEx s
611
612-- | Traverse /free/ type variables
613typeVars :: HasTypeVars t => Traversal' t Name
614typeVars = typeVarsEx mempty
615
616-- | Substitute using a map of names in for /free/ type variables
617substTypeVars :: HasTypeVars t => Map Name Name -> t -> t
618substTypeVars m = over typeVars $ \n -> fromMaybe n (m^.at n)
619
620-- | Provides substitution for types
621class SubstType t where
622  -- | Perform substitution for types
623  substType :: Map Name Type -> t -> t
624
625instance SubstType Type where
626  substType m t@(VarT n)           = fromMaybe t (m^.at n)
627  substType m (ForallT bs ctx ty)  = ForallT bs (substType m' ctx) (substType m' ty)
628    where m' = foldrOf typeVars Map.delete m bs
629  substType _ t@ConT{}             = t
630  substType _ t@TupleT{}           = t
631  substType _ t@ListT{}            = t
632  substType _ t@ArrowT{}           = t
633  substType _ t@UnboxedTupleT{}    = t
634  substType m (AppT l r)           = AppT (substType m l) (substType m r)
635  substType m (SigT t k)           = SigT (substType m t)
636                                          (substType m k)
637  substType _ t@PromotedT{}        = t
638  substType _ t@PromotedTupleT{}   = t
639  substType _ t@PromotedNilT{}     = t
640  substType _ t@PromotedConsT{}    = t
641  substType _ t@StarT{}            = t
642  substType _ t@ConstraintT{}      = t
643  substType _ t@LitT{}             = t
644#if MIN_VERSION_template_haskell(2,10,0)
645  substType _ t@EqualityT{}        = t
646#endif
647#if MIN_VERSION_template_haskell(2,11,0)
648  substType m (InfixT  t1 n t2)    = InfixT  (substType m t1) n (substType m t2)
649  substType m (UInfixT t1 n t2)    = UInfixT (substType m t1) n (substType m t2)
650  substType m (ParensT t)          = ParensT (substType m t)
651  substType _ t@WildCardT{}        = t
652#endif
653#if MIN_VERSION_template_haskell(2,12,0)
654  substType _ t@UnboxedSumT{}      = t
655#endif
656#if MIN_VERSION_template_haskell(2,15,0)
657  substType m (AppKindT t k)       = AppKindT (substType m t) (substType m k)
658  substType m (ImplicitParamT n t) = ImplicitParamT n (substType m t)
659#endif
660#if MIN_VERSION_template_haskell(2,16,0)
661  substType m (ForallVisT bs ty)   = ForallVisT bs (substType m' ty)
662    where m' = foldrOf typeVars Map.delete m bs
663#endif
664#if MIN_VERSION_template_haskell(2,17,0)
665  substType _ t@MulArrowT{}        = t
666#endif
667
668instance SubstType t => SubstType [t] where
669  substType = map . substType
670
671#if !MIN_VERSION_template_haskell(2,10,0)
672instance SubstType Pred where
673  substType m (ClassP n ts) = ClassP n (substType m ts)
674  substType m (EqualP l r)  = substType m (EqualP l r)
675#endif
676
677-- | Provides a 'Traversal' of the types of each field of a constructor.
678--
679-- @
680-- conFields :: 'Traversal'' 'Con' 'BangType'   -- template-haskell-2.11+
681-- conFields :: 'Traversal'' 'Con' 'StrictType' -- Earlier versions
682-- @
683conFields :: Traversal' Con
684#if MIN_VERSION_template_haskell(2,11,0)
685                            BangType
686#else
687                            StrictType
688#endif
689conFields f (NormalC n fs)      = NormalC n <$> traverse f fs
690conFields f (RecC n fs)         = RecC n <$> traverse (sansVar f) fs
691conFields f (InfixC l n r)      = InfixC <$> f l <*> pure n <*> f r
692conFields f (ForallC bds ctx c) = ForallC bds ctx <$> conFields f c
693#if MIN_VERSION_template_haskell(2,11,0)
694conFields f (GadtC ns argTys retTy) =
695  GadtC ns <$> traverse f argTys <*> pure retTy
696conFields f (RecGadtC ns argTys retTy) =
697  RecGadtC ns <$> traverse (sansVar f) argTys <*> pure retTy
698#endif
699
700-- |
701-- @
702-- sansVar :: 'Traversal'' 'VarBangType'   'BangType'   -- template-haskell-2.11+
703-- sansVar :: 'Traversal'' 'VarStrictType' 'StrictType' -- Earlier versions
704-- @
705#if MIN_VERSION_template_haskell(2,11,0)
706sansVar :: Traversal' VarBangType   BangType
707#else
708sansVar :: Traversal' VarStrictType StrictType
709#endif
710sansVar f (fn,s,t) = (\(s', t') -> (fn,s',t')) <$> f (s, t)
711
712-- | 'Traversal' of the types of the /named/ fields of a constructor.
713--
714-- @
715-- conNamedFields :: 'Traversal'' 'Con' 'VarBangType'   -- template-haskell-2.11+
716-- conNamedFields :: 'Traversal'' 'Con' 'VarStrictType' -- Earlier versions
717-- @
718conNamedFields :: Traversal' Con
719#if MIN_VERSION_template_haskell(2,11,0)
720                                 VarBangType
721#else
722                                 VarStrictType
723#endif
724conNamedFields _ c@NormalC{}      = pure c
725conNamedFields _ c@InfixC{}       = pure c
726conNamedFields f (RecC n fs)      = RecC n <$> traverse f fs
727conNamedFields f (ForallC a b fs) = ForallC a b <$> conNamedFields f fs
728#if MIN_VERSION_template_haskell(2,11,0)
729conNamedFields _ c@GadtC{}        = pure c
730conNamedFields f (RecGadtC ns argTys retTy) =
731  RecGadtC ns <$> traverse f argTys <*> pure retTy
732#endif
733
734-- Lenses and Prisms
735locFileName :: Lens' Loc String
736locFileName = lens loc_filename
737            $ \loc fn -> loc { loc_filename = fn }
738
739locPackage :: Lens' Loc String
740locPackage = lens loc_package
741           $ \loc fn -> loc { loc_package = fn }
742
743locModule :: Lens' Loc String
744locModule = lens loc_module
745          $ \loc fn -> loc { loc_module = fn }
746
747locStart :: Lens' Loc CharPos
748locStart = lens loc_start
749         $ \loc fn -> loc { loc_start = fn }
750
751locEnd :: Lens' Loc CharPos
752locEnd = lens loc_end
753       $ \loc fn -> loc { loc_end = fn }
754
755funDepInputs :: Lens' FunDep [Name]
756funDepInputs = lens g s where
757   g (FunDep xs _)    = xs
758   s (FunDep _ ys) xs = FunDep xs ys
759
760funDepOutputs :: Lens' FunDep [Name]
761funDepOutputs = lens g s where
762   g (FunDep _ xs) = xs
763   s (FunDep ys _) = FunDep ys
764
765fieldExpName :: Lens' FieldExp Name
766fieldExpName = _1
767
768fieldExpExpression :: Lens' FieldExp Exp
769fieldExpExpression = _2
770
771fieldPatName :: Lens' FieldPat Name
772fieldPatName = _1
773
774fieldPatPattern :: Lens' FieldPat Pat
775fieldPatPattern = _2
776
777matchPattern :: Lens' Match Pat
778matchPattern = lens g s where
779   g (Match p _ _)   = p
780   s (Match _ x y) p = Match p x y
781
782matchBody :: Lens' Match Body
783matchBody = lens g s where
784   g (Match _ b _)   = b
785   s (Match x _ y) b = Match x b y
786
787matchDeclarations :: Lens' Match [Dec]
788matchDeclarations = lens g s where
789   g (Match _ _ ds) = ds
790   s (Match x y _ ) = Match x y
791
792fixityPrecedence :: Lens' Fixity Int
793fixityPrecedence = lens g s where
794   g (Fixity i _)   = i
795   s (Fixity _ x) i = Fixity i x
796
797fixityDirection :: Lens' Fixity FixityDirection
798fixityDirection = lens g s where
799   g (Fixity _ d) = d
800   s (Fixity i _) = Fixity i
801
802clausePattern :: Lens' Clause [Pat]
803clausePattern = lens g s where
804   g (Clause ps _ _)    = ps
805   s (Clause _  x y) ps = Clause ps x y
806
807clauseBody :: Lens' Clause Body
808clauseBody = lens g s where
809   g (Clause _ b _)   = b
810   s (Clause x _ y) b = Clause x b y
811
812clauseDecs :: Lens' Clause [Dec]
813clauseDecs = lens g s where
814   g (Clause _ _ ds) = ds
815   s (Clause x y _ ) = Clause x y
816
817#if MIN_VERSION_template_haskell(2,11,0)
818injectivityAnnOutput :: Lens' InjectivityAnn Name
819injectivityAnnOutput = lens g s where
820   g (InjectivityAnn o _)   = o
821   s (InjectivityAnn _ i) o = InjectivityAnn o i
822
823injectivityAnnInputs :: Lens' InjectivityAnn [Name]
824injectivityAnnInputs = lens g s where
825   g (InjectivityAnn _ i) = i
826   s (InjectivityAnn o _) = InjectivityAnn o
827
828typeFamilyHeadName :: Lens' TypeFamilyHead Name
829typeFamilyHeadName = lens g s where
830  g (TypeFamilyHead n _    _  _ )   = n
831  s (TypeFamilyHead _ tvbs rs ia) n = TypeFamilyHead n tvbs rs ia
832
833typeFamilyHeadTyVarBndrs :: Lens' TypeFamilyHead [TyVarBndrUnit]
834typeFamilyHeadTyVarBndrs = lens g s where
835  g (TypeFamilyHead _ tvbs _  _ )      = tvbs
836  s (TypeFamilyHead n _    rs ia) tvbs = TypeFamilyHead n tvbs rs ia
837
838typeFamilyHeadResultSig :: Lens' TypeFamilyHead FamilyResultSig
839typeFamilyHeadResultSig = lens g s where
840  g (TypeFamilyHead _ _    rs _ )    = rs
841  s (TypeFamilyHead n tvbs _  ia) rs = TypeFamilyHead n tvbs rs ia
842
843typeFamilyHeadInjectivityAnn :: Lens' TypeFamilyHead (Maybe InjectivityAnn)
844typeFamilyHeadInjectivityAnn = lens g s where
845  g (TypeFamilyHead _ _    _  ia) = ia
846  s (TypeFamilyHead n tvbs rs _ ) = TypeFamilyHead n tvbs rs
847
848bangSourceUnpackedness :: Lens' Bang SourceUnpackedness
849bangSourceUnpackedness = lens g s where
850  g (Bang su _ )    = su
851  s (Bang _  ss) su = Bang su ss
852
853bangSourceStrictness :: Lens' Bang SourceStrictness
854bangSourceStrictness = lens g s where
855  g (Bang _  su) = su
856  s (Bang ss _ ) = Bang ss
857#endif
858
859#if MIN_VERSION_template_haskell(2,12,0)
860derivClauseStrategy :: Lens' DerivClause (Maybe DerivStrategy)
861derivClauseStrategy = lens g s where
862  g (DerivClause mds _)     = mds
863  s (DerivClause _   c) mds = DerivClause mds c
864
865derivClauseCxt :: Lens' DerivClause Cxt
866derivClauseCxt = lens g s where
867  g (DerivClause _   c) = c
868  s (DerivClause mds _) = DerivClause mds
869#endif
870
871_ClassI :: Prism' Info (Dec, [InstanceDec])
872_ClassI
873  = prism' reviewer remitter
874  where
875      reviewer (x, y) = ClassI x y
876      remitter (ClassI x y) = Just (x, y)
877      remitter _ = Nothing
878
879-- |
880-- @
881-- _ClassOpI :: 'Prism'' 'Info' ('Name', 'Type', 'ParentName')         -- template-haskell-2.11+
882-- _ClassOpI :: 'Prism'' 'Info' ('Name', 'Type', 'ParentName', 'Fixity') -- template-haskell-2.8 through 2.10
883-- _ClassOpI :: 'Prism'' 'Info' ('Name', 'Type', 'Name',       'Fixity') -- Earlier versions
884-- @
885#if MIN_VERSION_template_haskell(2,11,0)
886_ClassOpI :: Prism' Info (Name, Type, ParentName)
887_ClassOpI
888  = prism' reviewer remitter
889  where
890      reviewer (x, y, z) = ClassOpI x y z
891      remitter (ClassOpI x y z) = Just (x, y, z)
892      remitter _ = Nothing
893#else
894_ClassOpI :: Prism' Info (Name, Type, ParentName, Fixity)
895_ClassOpI
896  = prism' reviewer remitter
897  where
898      reviewer (x, y, z, w) = ClassOpI x y z w
899      remitter (ClassOpI x y z w) = Just (x, y, z, w)
900      remitter _ = Nothing
901#endif
902
903_TyConI :: Prism' Info Dec
904_TyConI
905  = prism' reviewer remitter
906  where
907      reviewer = TyConI
908      remitter (TyConI x) = Just x
909      remitter _ = Nothing
910
911#if MIN_VERSION_template_haskell(2,11,0)
912_FamilyI :: Prism' Info (Dec, [InstanceDec])
913#else
914_FamilyI :: Prism' Info (Dec, [Dec])
915#endif
916_FamilyI
917  = prism' reviewer remitter
918  where
919      reviewer (x, y) = FamilyI x y
920      remitter (FamilyI x y) = Just (x, y)
921      remitter _ = Nothing
922
923_PrimTyConI :: Prism' Info (Name, Arity, Unlifted)
924_PrimTyConI
925  = prism' reviewer remitter
926  where
927      reviewer (x, y, z) = PrimTyConI x y z
928      remitter (PrimTyConI x y z) = Just (x, y, z)
929      remitter _ = Nothing
930
931-- |
932-- @
933-- _DataConI :: 'Prism'' 'Info' ('Name', 'Type', 'ParentName')         -- template-haskell-2.11+
934-- _DataConI :: 'Prism'' 'Info' ('Name', 'Type', 'ParentName', 'Fixity') -- template-haskell-2.8 through 2.10
935-- _DataConI :: 'Prism'' 'Info' ('Name', 'Type', 'Name',       'Fixity') -- Earlier versions
936-- @
937#if MIN_VERSION_template_haskell(2,11,0)
938_DataConI :: Prism' Info (Name, Type, ParentName)
939_DataConI
940  = prism' reviewer remitter
941  where
942      reviewer (x, y, z) = DataConI x y z
943      remitter (DataConI x y z) = Just (x, y, z)
944      remitter _ = Nothing
945#else
946_DataConI :: Prism' Info (Name, Type, ParentName, Fixity)
947_DataConI
948  = prism' reviewer remitter
949  where
950      reviewer (x, y, z, w) = DataConI x y z w
951      remitter (DataConI x y z w) = Just (x, y, z, w)
952      remitter _ = Nothing
953#endif
954
955-- |
956-- @
957-- _VarI :: 'Prism'' 'Info' ('Name', 'Type', 'Maybe' 'Dec')         -- template-haskell-2.11+
958-- _VarI :: 'Prism'' 'Info' ('Name', 'Type', 'Maybe' 'Dec', 'Fixity') -- Earlier versions
959-- @
960#if MIN_VERSION_template_haskell(2,11,0)
961_VarI :: Prism' Info (Name, Type, Maybe Dec)
962_VarI
963  = prism' reviewer remitter
964  where
965      reviewer (x, y, z) = VarI x y z
966      remitter (VarI x y z) = Just (x, y, z)
967      remitter _ = Nothing
968#else
969_VarI :: Prism' Info (Name, Type, Maybe Dec, Fixity)
970_VarI
971  = prism' reviewer remitter
972  where
973      reviewer (x, y, z, w) = VarI x y z w
974      remitter (VarI x y z w) = Just (x, y, z, w)
975      remitter _ = Nothing
976#endif
977
978_TyVarI :: Prism' Info (Name, Type)
979_TyVarI
980  = prism' reviewer remitter
981  where
982      reviewer (x, y) = TyVarI x y
983      remitter (TyVarI x y) = Just (x, y)
984      remitter _ = Nothing
985
986#if MIN_VERSION_template_haskell(2,12,0)
987_PatSynI :: Prism' Info (Name, PatSynType)
988_PatSynI
989  = prism' reviewer remitter
990  where
991      reviewer (x, y) = PatSynI x y
992      remitter (PatSynI x y) = Just (x, y)
993      remitter _ = Nothing
994#endif
995
996_FunD :: Prism' Dec (Name, [Clause])
997_FunD
998  = prism' reviewer remitter
999  where
1000      reviewer (x, y) = FunD x y
1001      remitter (FunD x y) = Just (x,y)
1002      remitter _ = Nothing
1003
1004_ValD :: Prism' Dec (Pat, Body, [Dec])
1005_ValD
1006  = prism' reviewer remitter
1007  where
1008      reviewer (x, y, z) = ValD x y z
1009      remitter (ValD x y z) = Just (x, y, z)
1010      remitter _ = Nothing
1011
1012_TySynD :: Prism' Dec (Name, [TyVarBndrUnit], Type)
1013_TySynD
1014  = prism' reviewer remitter
1015  where
1016      reviewer (x, y, z) = TySynD x y z
1017      remitter (TySynD x y z) = Just (x, y, z)
1018      remitter _ = Nothing
1019
1020_ClassD :: Prism' Dec (Cxt, Name, [TyVarBndrUnit], [FunDep], [Dec])
1021_ClassD
1022  = prism' reviewer remitter
1023  where
1024      reviewer (x, y, z, w, u) = ClassD x y z w u
1025      remitter (ClassD x y z w u) = Just (x, y, z, w, u)
1026      remitter _ = Nothing
1027
1028-- |
1029-- @
1030-- _InstanceD :: 'Prism'' 'Dec' ('Maybe' 'Overlap', 'Cxt', 'Type', ['Dec']) -- template-haskell-2.11+
1031-- _InstanceD :: 'Prism'' 'Dec'                ('Cxt', 'Type', ['Dec']) -- Earlier versions
1032-- @
1033#if MIN_VERSION_template_haskell(2,11,0)
1034_InstanceD :: Prism' Dec (Maybe Overlap, Cxt, Type, [Dec])
1035#else
1036_InstanceD :: Prism' Dec (Cxt, Type, [Dec])
1037#endif
1038_InstanceD
1039  = prism' reviewer remitter
1040  where
1041#if MIN_VERSION_template_haskell(2,11,0)
1042      reviewer (x, y, z, w) = InstanceD x y z w
1043      remitter (InstanceD x y z w) = Just (x, y, z, w)
1044#else
1045      reviewer (x, y, z) = InstanceD x y z
1046      remitter (InstanceD x y z) = Just ( x, y, z)
1047#endif
1048      remitter _ = Nothing
1049
1050#if MIN_VERSION_template_haskell(2,11,0)
1051_Overlappable  :: Prism' Overlap  ()
1052_Overlappable  = prism' reviewer remitter
1053  where
1054      reviewer () = Overlappable
1055      remitter Overlappable = Just  ()
1056      remitter _ = Nothing
1057
1058_Overlapping :: Prism' Overlap ()
1059_Overlapping = prism' reviewer remitter
1060  where
1061      reviewer () = Overlapping
1062      remitter Overlapping = Just ()
1063      remitter _ = Nothing
1064
1065_Overlaps ::  Prism' Overlap  ()
1066_Overlaps =  prism' reviewer remitter
1067  where
1068      reviewer () =  Overlaps
1069      remitter Overlaps = Just ()
1070      remitter _ = Nothing
1071
1072_Incoherent  :: Prism' Overlap ()
1073_Incoherent  = prism' reviewer remitter
1074  where
1075      reviewer () = Incoherent
1076      remitter Incoherent = Just ()
1077      remitter _ = Nothing
1078#endif
1079
1080_SigD :: Prism' Dec (Name, Type)
1081_SigD
1082  = prism' reviewer remitter
1083  where
1084      reviewer (x, y) = SigD x y
1085      remitter (SigD x y) = Just (x, y)
1086      remitter _ = Nothing
1087
1088_ForeignD :: Prism' Dec Foreign
1089_ForeignD
1090  = prism' reviewer remitter
1091  where
1092      reviewer = ForeignD
1093      remitter (ForeignD x) = Just x
1094      remitter _ = Nothing
1095
1096_InfixD :: Prism' Dec (Fixity, Name)
1097_InfixD
1098  = prism' reviewer remitter
1099  where
1100      reviewer (x, y) = InfixD x y
1101      remitter (InfixD x y) = Just (x, y)
1102      remitter _ = Nothing
1103
1104_PragmaD :: Prism' Dec Pragma
1105_PragmaD
1106  = prism' reviewer remitter
1107  where
1108      reviewer = PragmaD
1109      remitter (PragmaD x) = Just x
1110      remitter _ = Nothing
1111
1112-- |
1113-- @
1114-- _TySynInstD :: 'Prism'' 'Dec' 'TySynEqn'             -- template-haskell-2.15+
1115-- _TySynInstD :: 'Prism'' 'Dec' ('Name', 'TySynEqn')     -- template-haskell-2.9 through 2.14
1116-- _TySynInstD :: 'Prism'' 'Dec' ('Name', ['Type'], 'Type') -- Earlier versions
1117-- @
1118#if MIN_VERSION_template_haskell(2,15,0)
1119_TySynInstD :: Prism' Dec TySynEqn
1120_TySynInstD
1121  = prism' reviewer remitter
1122  where
1123      reviewer = TySynInstD
1124      remitter (TySynInstD x) = Just x
1125      remitter _ = Nothing
1126#else
1127_TySynInstD :: Prism' Dec (Name, TySynEqn)
1128_TySynInstD
1129  = prism' reviewer remitter
1130  where
1131      reviewer (x, y) = TySynInstD x y
1132      remitter (TySynInstD x y) = Just (x, y)
1133      remitter _ = Nothing
1134#endif
1135
1136_RoleAnnotD :: Prism' Dec (Name, [Role])
1137_RoleAnnotD
1138  = prism' reviewer remitter
1139  where
1140      reviewer (x, y) = RoleAnnotD x y
1141      remitter (RoleAnnotD x y) = Just (x, y)
1142      remitter _ = Nothing
1143
1144-- |
1145-- @
1146-- _StandaloneDerivD :: 'Prism'' 'Dec' ('Maybe' 'DerivStrategy', 'Cxt', 'Type') -- template-haskell-2.12+
1147-- _StandaloneDerivD :: 'Prism'' 'Dec'                      ('Cxt', 'Type') -- Earlier versions
1148-- @
1149#if MIN_VERSION_template_haskell(2,12,0)
1150_StandaloneDerivD :: Prism' Dec (Maybe DerivStrategy, Cxt, Type)
1151_StandaloneDerivD
1152  = prism' reviewer remitter
1153  where
1154      reviewer (x, y, z) = StandaloneDerivD x y z
1155      remitter (StandaloneDerivD x y z) = Just (x, y, z)
1156      remitter _ = Nothing
1157#elif MIN_VERSION_template_haskell(2,10,0)
1158_StandaloneDerivD :: Prism' Dec (Cxt, Type)
1159_StandaloneDerivD
1160  = prism' reviewer remitter
1161  where
1162      reviewer (x, y) = StandaloneDerivD x y
1163      remitter (StandaloneDerivD x y) = Just (x, y)
1164      remitter _ = Nothing
1165#endif
1166
1167#if MIN_VERSION_template_haskell(2,10,0)
1168_DefaultSigD :: Prism' Dec (Name, Type)
1169_DefaultSigD
1170  = prism' reviewer remitter
1171  where
1172      reviewer (x, y) = DefaultSigD x y
1173      remitter (DefaultSigD x y) = Just (x, y)
1174      remitter _ = Nothing
1175#endif
1176
1177# if MIN_VERSION_template_haskell(2,12,0)
1178type DataPrism' tys cons = Prism' Dec (Cxt, Name, tys, Maybe Kind, cons, [DerivClause])
1179# elif MIN_VERSION_template_haskell(2,11,0)
1180type DataPrism' tys cons = Prism' Dec (Cxt, Name, tys, Maybe Kind, cons, Cxt)
1181# endif
1182
1183-- |
1184-- @
1185-- _DataInstD :: 'Prism'' 'Dec' ('Cxt', 'Maybe' ['TyVarBndrUnit'], 'Type', 'Maybe' 'Kind', ['Con'], ['DerivClause']) -- template-haskell-2.15+
1186-- _DataInstD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],                'Maybe' 'Kind', ['Con'], ['DerivClause']) -- template-haskell-2.12 through 2.14
1187-- _DataInstD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],                'Maybe' 'Kind', ['Con'], 'Cxt')           -- template-haskell-2.11
1188-- _DataInstD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],                            ['Con'], ['Name'])        -- Earlier versions
1189-- @
1190#if MIN_VERSION_template_haskell(2,15,0)
1191_DataInstD :: Prism' Dec (Cxt, Maybe [TyVarBndrUnit], Type, Maybe Kind, [Con], [DerivClause])
1192_DataInstD
1193  = prism' reviewer remitter
1194  where
1195      reviewer (x, y, z, w, u, v) = DataInstD x y z w u v
1196      remitter (DataInstD x y z w u v) = Just (x, y, z, w, u, v)
1197      remitter _ = Nothing
1198#elif MIN_VERSION_template_haskell(2,11,0)
1199_DataInstD :: DataPrism' [Type] [Con]
1200_DataInstD
1201  = prism' reviewer remitter
1202  where
1203      reviewer (x, y, z, w, u, v) = DataInstD x y z w u v
1204      remitter (DataInstD x y z w u v) = Just (x, y, z, w, u, v)
1205      remitter _ = Nothing
1206#else
1207_DataInstD :: Prism' Dec (Cxt, Name, [Type], [Con], [Name])
1208_DataInstD
1209  = prism' reviewer remitter
1210  where
1211      reviewer (x, y, z, w, u) = DataInstD x y z w u
1212      remitter (DataInstD x y z w u) = Just (x, y, z, w, u)
1213      remitter _ = Nothing
1214#endif
1215
1216-- |
1217-- @
1218-- _NewtypeInstD :: 'Prism'' 'Dec' ('Cxt', 'Maybe' ['TyVarBndrUnit'], 'Type', 'Maybe' 'Kind', 'Con', ['DerivClause']) -- template-haskell-2.15+
1219-- _NewtypeInstD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],                'Maybe' 'Kind', 'Con', ['DerivClause']) -- template-haskell-2.12 through 2.14
1220-- _NewtypeInstD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],                'Maybe' 'Kind', 'Con', 'Cxt')           -- template-haskell-2.11
1221-- _NewtypeInstD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],                            'Con', ['Name'])        -- Earlier versions
1222-- @
1223#if MIN_VERSION_template_haskell(2,15,0)
1224_NewtypeInstD :: Prism' Dec (Cxt, Maybe [TyVarBndrUnit], Type, Maybe Kind, Con, [DerivClause])
1225_NewtypeInstD
1226  = prism' reviewer remitter
1227  where
1228      reviewer (x, y, z, w, u, v) = NewtypeInstD x y z w u v
1229      remitter (NewtypeInstD x y z w u v) = Just (x, y, z, w, u, v)
1230      remitter _ = Nothing
1231#elif MIN_VERSION_template_haskell(2,11,0)
1232_NewtypeInstD :: DataPrism' [Type] Con
1233_NewtypeInstD
1234  = prism' reviewer remitter
1235  where
1236      reviewer (x, y, z, w, u, v) = NewtypeInstD x y z w u v
1237      remitter (NewtypeInstD x y z w u v) = Just (x, y, z, w, u, v)
1238      remitter _ = Nothing
1239#else
1240_NewtypeInstD :: Prism' Dec (Cxt, Name, [Type], Con, [Name])
1241_NewtypeInstD
1242  = prism' reviewer remitter
1243  where
1244      reviewer (x, y, z, w, u) = NewtypeInstD x y z w u
1245      remitter (NewtypeInstD x y z w u) = Just (x, y, z, w, u)
1246      remitter _ = Nothing
1247#endif
1248
1249#if MIN_VERSION_template_haskell(2,11,0)
1250_ClosedTypeFamilyD :: Prism' Dec (TypeFamilyHead, [TySynEqn])
1251_ClosedTypeFamilyD
1252  = prism' reviewer remitter
1253  where
1254      reviewer (x, y) = ClosedTypeFamilyD x y
1255      remitter (ClosedTypeFamilyD x y) = Just (x, y)
1256      remitter _ = Nothing
1257#else
1258_ClosedTypeFamilyD :: Prism' Dec (Name, [TyVarBndrUnit], Maybe Kind, [TySynEqn])
1259_ClosedTypeFamilyD
1260  = prism' reviewer remitter
1261  where
1262      reviewer (x, y, z, w) = ClosedTypeFamilyD x y z w
1263      remitter (ClosedTypeFamilyD x y z w) = Just (x, y, z, w)
1264      remitter _ = Nothing
1265#endif
1266
1267-- |
1268-- @
1269-- _DataD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['TyVarBndrUnit'], 'Maybe' 'Kind', ['Con'], ['DerivClause']) -- template-haskell-2.12+
1270-- _DataD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],          'Maybe' 'Kind', ['Con'], 'Cxt')           -- template-haskell-2.11
1271-- _DataD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],                      ['Con'], ['Name'])        -- Earlier versions
1272-- @
1273#if MIN_VERSION_template_haskell(2,11,0)
1274_DataD :: DataPrism' [TyVarBndrUnit] [Con]
1275_DataD
1276  = prism' reviewer remitter
1277  where
1278      reviewer (x, y, z, w, u, v) = DataD x y z w u v
1279      remitter (DataD x y z w u v) = Just (x, y, z, w, u, v)
1280      remitter _ = Nothing
1281#else
1282_DataD :: Prism' Dec (Cxt, Name, [TyVarBndrUnit], [Con], [Name])
1283_DataD
1284  = prism' reviewer remitter
1285  where
1286      reviewer (x, y, z, w, u) = DataD x y z w u
1287      remitter (DataD x y z w u) = Just (x, y, z, w, u)
1288      remitter _ = Nothing
1289#endif
1290
1291-- |
1292-- @
1293-- _NewtypeD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['TyVarBndrUnit'], 'Maybe' 'Kind', 'Con', ['DerivClause']) -- template-haskell-2.12+
1294-- _NewtypeD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],          'Maybe' 'Kind', 'Con', 'Cxt')           -- template-haskell-2.11
1295-- _NewtypeD :: 'Prism'' 'Dec' ('Cxt', 'Name', ['Type'],                      'Con', ['Name'])        -- Earlier versions
1296-- @
1297#if MIN_VERSION_template_haskell(2,11,0)
1298_NewtypeD :: DataPrism' [TyVarBndrUnit] Con
1299_NewtypeD
1300  = prism' reviewer remitter
1301  where
1302      reviewer (x, y, z, w, u, v) = NewtypeD x y z w u v
1303      remitter (NewtypeD x y z w u v) = Just (x, y, z, w, u, v)
1304      remitter _ = Nothing
1305#else
1306_NewtypeD :: Prism' Dec (Cxt, Name, [TyVarBndrUnit], Con, [Name])
1307_NewtypeD
1308  = prism' reviewer remitter
1309  where
1310      reviewer (x, y, z, w, u) = NewtypeD x y z w u
1311      remitter (NewtypeD x y z w u) = Just (x, y, z, w, u)
1312      remitter _ = Nothing
1313#endif
1314
1315#if MIN_VERSION_template_haskell(2,11,0)
1316_DataFamilyD :: Prism' Dec (Name, [TyVarBndrUnit], Maybe Kind)
1317_DataFamilyD
1318  = prism' reviewer remitter
1319  where
1320      reviewer (x, y, z) = DataFamilyD x y z
1321      remitter (DataFamilyD x y z) = Just (x, y, z)
1322      remitter _ = Nothing
1323
1324_OpenTypeFamilyD :: Prism' Dec TypeFamilyHead
1325_OpenTypeFamilyD
1326  = prism' reviewer remitter
1327  where
1328      reviewer = OpenTypeFamilyD
1329      remitter (OpenTypeFamilyD x) = Just x
1330      remitter _ = Nothing
1331#else
1332_FamilyD :: Prism' Dec (FamFlavour, Name, [TyVarBndrUnit], Maybe Kind)
1333_FamilyD
1334  = prism' reviewer remitter
1335  where
1336      reviewer (x, y, z, w) = FamilyD x y z w
1337      remitter (FamilyD x y z w) = Just (x, y, z, w)
1338      remitter _ = Nothing
1339#endif
1340
1341#if MIN_VERSION_template_haskell(2,12,0)
1342_PatSynD :: Prism' Dec (Name, PatSynArgs, PatSynDir, Pat)
1343_PatSynD
1344  = prism' reviewer remitter
1345  where
1346      reviewer (x, y, z, w) = PatSynD x y z w
1347      remitter (PatSynD x y z w) = Just (x, y, z, w)
1348      remitter _ = Nothing
1349
1350_PatSynSigD :: Prism' Dec (Name, PatSynType)
1351_PatSynSigD
1352  = prism' reviewer remitter
1353  where
1354      reviewer (x, y) = PatSynSigD x y
1355      remitter (PatSynSigD x y) = Just (x, y)
1356      remitter _ = Nothing
1357#endif
1358
1359#if MIN_VERSION_template_haskell(2,15,0)
1360_ImplicitParamBindD :: Prism' Dec (String, Exp)
1361_ImplicitParamBindD
1362  = prism' reviewer remitter
1363  where
1364      reviewer (x, y) = ImplicitParamBindD x y
1365      remitter (ImplicitParamBindD x y) = Just (x, y)
1366      remitter _ = Nothing
1367#endif
1368
1369#if MIN_VERSION_template_haskell(2,12,0)
1370_Unidir :: Prism' PatSynDir ()
1371_Unidir
1372  = prism' reviewer remitter
1373  where
1374      reviewer () = Unidir
1375      remitter Unidir = Just ()
1376      remitter _ = Nothing
1377
1378_ImplBidir :: Prism' PatSynDir ()
1379_ImplBidir
1380  = prism' reviewer remitter
1381  where
1382      reviewer () = ImplBidir
1383      remitter ImplBidir = Just ()
1384      remitter _ = Nothing
1385
1386_ExplBidir :: Prism' PatSynDir [Clause]
1387_ExplBidir
1388  = prism' reviewer remitter
1389  where
1390      reviewer = ExplBidir
1391      remitter (ExplBidir x) = Just x
1392      remitter _ = Nothing
1393
1394_PrefixPatSyn :: Prism' PatSynArgs [Name]
1395_PrefixPatSyn
1396  = prism' reviewer remitter
1397  where
1398      reviewer = PrefixPatSyn
1399      remitter (PrefixPatSyn x) = Just x
1400      remitter _ = Nothing
1401
1402_InfixPatSyn :: Prism' PatSynArgs (Name, Name)
1403_InfixPatSyn
1404  = prism' reviewer remitter
1405  where
1406      reviewer (x, y) = InfixPatSyn x y
1407      remitter (InfixPatSyn x y) = Just (x, y)
1408      remitter _ = Nothing
1409
1410_RecordPatSyn :: Prism' PatSynArgs [Name]
1411_RecordPatSyn
1412  = prism' reviewer remitter
1413  where
1414      reviewer = RecordPatSyn
1415      remitter (RecordPatSyn x) = Just x
1416      remitter _ = Nothing
1417#endif
1418
1419-- |
1420-- @
1421-- _NormalC :: 'Prism'' 'Con' ('Name', ['BangType'])   -- template-haskell-2.11+
1422-- _NormalC :: 'Prism'' 'Con' ('Name', ['StrictType']) -- Earlier versions
1423-- @
1424_NormalC ::
1425  Prism' Con ( Name
1426#if MIN_VERSION_template_haskell(2,11,0)
1427             , [BangType]
1428#else
1429             , [StrictType]
1430#endif
1431             )
1432_NormalC
1433  = prism' reviewer remitter
1434  where
1435      reviewer (x, y) = NormalC x y
1436      remitter (NormalC x y) = Just (x, y)
1437      remitter _ = Nothing
1438
1439-- |
1440-- @
1441-- _RecC :: 'Prism'' 'Con' ('Name', ['VarBangType'])   -- template-haskell-2.11+
1442-- _RecC :: 'Prism'' 'Con' ('Name', ['VarStrictType']) -- Earlier versions
1443-- @
1444_RecC ::
1445  Prism' Con ( Name
1446#if MIN_VERSION_template_haskell(2,11,0)
1447             , [VarBangType]
1448#else
1449             , [VarStrictType]
1450#endif
1451             )
1452_RecC
1453  = prism' reviewer remitter
1454  where
1455      reviewer (x, y) = RecC x y
1456      remitter (RecC x y) = Just (x, y)
1457      remitter _ = Nothing
1458
1459-- |
1460-- @
1461-- _InfixC :: 'Prism'' 'Con' ('BangType',   'Name', 'BangType')   -- template-haskell-2.11+
1462-- _InfixC :: 'Prism'' 'Con' ('StrictType', 'Name', 'StrictType') -- Earlier versions
1463-- @
1464_InfixC ::
1465  Prism' Con
1466#if MIN_VERSION_template_haskell(2,11,0)
1467             (BangType,   Name, BangType  )
1468#else
1469             (StrictType, Name, StrictType)
1470#endif
1471_InfixC
1472  = prism' reviewer remitter
1473  where
1474      reviewer (x, y, z) = InfixC x y z
1475      remitter (InfixC x y z) = Just (x, y, z)
1476      remitter _ = Nothing
1477
1478_ForallC :: Prism' Con ([TyVarBndrSpec], Cxt, Con)
1479_ForallC
1480  = prism' reviewer remitter
1481  where
1482      reviewer (x, y, z) = ForallC x y z
1483      remitter (ForallC x y z) = Just (x, y, z)
1484      remitter _ = Nothing
1485
1486#if MIN_VERSION_template_haskell(2,11,0)
1487_GadtC :: Prism' Con ([Name], [BangType], Type)
1488_GadtC
1489  = prism' reviewer remitter
1490  where
1491      reviewer (x, y, z) = GadtC x y z
1492      remitter (GadtC x y z) = Just (x, y, z)
1493      remitter _ = Nothing
1494
1495_RecGadtC :: Prism' Con ([Name], [VarBangType], Type)
1496_RecGadtC
1497  = prism' reviewer remitter
1498  where
1499      reviewer (x, y, z) = RecGadtC x y z
1500      remitter (RecGadtC x y z) = Just (x, y, z)
1501      remitter _ = Nothing
1502#endif
1503
1504#if MIN_VERSION_template_haskell(2,11,0)
1505_NoSourceUnpackedness :: Prism' SourceUnpackedness ()
1506_NoSourceUnpackedness
1507  = prism' reviewer remitter
1508  where
1509      reviewer () = NoSourceUnpackedness
1510      remitter NoSourceUnpackedness = Just ()
1511      remitter _ = Nothing
1512
1513_SourceNoUnpack :: Prism' SourceUnpackedness ()
1514_SourceNoUnpack
1515  = prism' reviewer remitter
1516  where
1517      reviewer () = SourceNoUnpack
1518      remitter SourceNoUnpack = Just ()
1519      remitter _ = Nothing
1520
1521_SourceUnpack :: Prism' SourceUnpackedness ()
1522_SourceUnpack
1523  = prism' reviewer remitter
1524  where
1525      reviewer () = SourceUnpack
1526      remitter SourceUnpack = Just ()
1527      remitter _ = Nothing
1528
1529_NoSourceStrictness :: Prism' SourceStrictness ()
1530_NoSourceStrictness
1531  = prism' reviewer remitter
1532  where
1533      reviewer () = NoSourceStrictness
1534      remitter NoSourceStrictness = Just ()
1535      remitter _ = Nothing
1536
1537_SourceLazy :: Prism' SourceStrictness ()
1538_SourceLazy
1539  = prism' reviewer remitter
1540  where
1541      reviewer () = SourceLazy
1542      remitter SourceLazy = Just ()
1543      remitter _ = Nothing
1544
1545_SourceStrict :: Prism' SourceStrictness ()
1546_SourceStrict
1547  = prism' reviewer remitter
1548  where
1549      reviewer () = SourceStrict
1550      remitter SourceStrict = Just ()
1551      remitter _ = Nothing
1552
1553_DecidedLazy :: Prism' DecidedStrictness ()
1554_DecidedLazy
1555  = prism' reviewer remitter
1556  where
1557      reviewer () = DecidedLazy
1558      remitter DecidedLazy = Just ()
1559      remitter _ = Nothing
1560
1561_DecidedStrict :: Prism' DecidedStrictness ()
1562_DecidedStrict
1563  = prism' reviewer remitter
1564  where
1565      reviewer () = DecidedStrict
1566      remitter DecidedStrict = Just ()
1567      remitter _ = Nothing
1568
1569_DecidedUnpack :: Prism' DecidedStrictness ()
1570_DecidedUnpack
1571  = prism' reviewer remitter
1572  where
1573      reviewer () = DecidedUnpack
1574      remitter DecidedUnpack = Just ()
1575      remitter _ = Nothing
1576#else
1577_IsStrict :: Prism' Strict ()
1578_IsStrict
1579  = prism' reviewer remitter
1580  where
1581      reviewer () = IsStrict
1582      remitter IsStrict = Just ()
1583      remitter _ = Nothing
1584
1585_NotStrict :: Prism' Strict ()
1586_NotStrict
1587  = prism' reviewer remitter
1588  where
1589      reviewer () = NotStrict
1590      remitter NotStrict = Just ()
1591      remitter _ = Nothing
1592
1593_Unpacked :: Prism' Strict ()
1594_Unpacked
1595  = prism' reviewer remitter
1596  where
1597      reviewer () = Unpacked
1598      remitter Unpacked = Just ()
1599      remitter _ = Nothing
1600#endif
1601
1602_ImportF :: Prism' Foreign (Callconv, Safety, String, Name, Type)
1603_ImportF
1604  = prism' reviewer remitter
1605  where
1606      reviewer (x, y, z, w, u) = ImportF x y z w u
1607      remitter (ImportF x y z w u) = Just (x,y,z,w,u)
1608      remitter _ = Nothing
1609
1610_ExportF :: Prism' Foreign (Callconv, String, Name, Type)
1611_ExportF
1612  = prism' reviewer remitter
1613  where
1614      reviewer (x, y, z, w) = ExportF x y z w
1615      remitter (ExportF x y z w) = Just (x, y, z, w)
1616      remitter _ = Nothing
1617
1618_CCall :: Prism' Callconv ()
1619_CCall
1620  = prism' reviewer remitter
1621  where
1622      reviewer () = CCall
1623      remitter CCall = Just ()
1624      remitter _ = Nothing
1625
1626_StdCall :: Prism' Callconv ()
1627_StdCall
1628  = prism' reviewer remitter
1629  where
1630      reviewer () = StdCall
1631      remitter StdCall = Just ()
1632      remitter _ = Nothing
1633
1634#if MIN_VERSION_template_haskell(2,10,0)
1635_CApi :: Prism' Callconv ()
1636_CApi
1637  = prism' reviewer remitter
1638  where
1639      reviewer () = CApi
1640      remitter CApi = Just ()
1641      remitter _ = Nothing
1642
1643_Prim :: Prism' Callconv ()
1644_Prim
1645  = prism' reviewer remitter
1646  where
1647      reviewer () = Prim
1648      remitter Prim = Just ()
1649      remitter _ = Nothing
1650
1651_JavaScript :: Prism' Callconv ()
1652_JavaScript
1653  = prism' reviewer remitter
1654  where
1655      reviewer () = JavaScript
1656      remitter JavaScript = Just ()
1657      remitter _ = Nothing
1658#endif
1659
1660_Unsafe :: Prism' Safety ()
1661_Unsafe
1662  = prism' reviewer remitter
1663  where
1664      reviewer () = Unsafe
1665      remitter Unsafe = Just ()
1666      remitter _ = Nothing
1667
1668_Safe :: Prism' Safety ()
1669_Safe
1670  = prism' reviewer remitter
1671  where
1672      reviewer () = Safe
1673      remitter Safe = Just ()
1674      remitter _ = Nothing
1675
1676_Interruptible :: Prism' Safety ()
1677_Interruptible
1678  = prism' reviewer remitter
1679  where
1680      reviewer () = Interruptible
1681      remitter Interruptible = Just ()
1682      remitter _ = Nothing
1683
1684_InlineP :: Prism' Pragma (Name, Inline, RuleMatch, Phases)
1685_InlineP
1686  = prism' reviewer remitter
1687  where
1688      reviewer (x, y, z, w) = InlineP x y z w
1689      remitter (InlineP x y z w) = Just (x, y, z, w)
1690      remitter _ = Nothing
1691
1692_SpecialiseP :: Prism' Pragma (Name, Type, Maybe Inline, Phases)
1693_SpecialiseP
1694  = prism' reviewer remitter
1695  where
1696      reviewer (x, y, z, w) = SpecialiseP x y z w
1697      remitter (SpecialiseP x y z w) = Just (x, y, z, w)
1698      remitter _ = Nothing
1699
1700-- TODO add lenses for InlineSpec
1701
1702_SpecialiseInstP :: Prism' Pragma Type
1703_SpecialiseInstP
1704  = prism' reviewer remitter
1705  where
1706      reviewer = SpecialiseInstP
1707      remitter (SpecialiseInstP x) = Just x
1708      remitter _ = Nothing
1709
1710-- |
1711-- @
1712-- _RuleP :: 'Prism'' 'Pragma' ('String', 'Maybe' ['TyVarBndrUnit'], ['RuleBndr'], 'Exp', 'Exp', 'Phases') -- template-haskell-2.15+
1713-- _RuleP :: 'Prism'' 'Pragma' ('String',                        ['RuleBndr'], 'Exp', 'Exp', 'Phases') -- Earlier versions
1714-- @
1715#if MIN_VERSION_template_haskell(2,15,0)
1716_RuleP :: Prism' Pragma (String, Maybe [TyVarBndrUnit], [RuleBndr], Exp, Exp, Phases)
1717_RuleP
1718  = prism' reviewer remitter
1719  where
1720      reviewer (x, y, z, w, u, v) = RuleP x y z w u v
1721      remitter (RuleP x y z w u v) = Just (x, y, z, w, u, v)
1722      remitter _ = Nothing
1723#else
1724_RuleP :: Prism' Pragma (String, [RuleBndr], Exp, Exp, Phases)
1725_RuleP
1726  = prism' reviewer remitter
1727  where
1728      reviewer (x, y, z, w, u) = RuleP x y z w u
1729      remitter (RuleP x y z w u) = Just (x, y, z, w, u)
1730      remitter _ = Nothing
1731#endif
1732
1733_AnnP :: Prism' Pragma (AnnTarget, Exp)
1734_AnnP
1735  = prism' reviewer remitter
1736  where
1737      reviewer (x, y) = AnnP x y
1738      remitter (AnnP x y) = Just (x, y)
1739      remitter _ = Nothing
1740
1741#if MIN_VERSION_template_haskell(2,10,0)
1742_LineP :: Prism' Pragma (Int, String)
1743_LineP
1744  = prism' reviewer remitter
1745  where
1746      reviewer (x, y) = LineP x y
1747      remitter (LineP x y) = Just (x, y)
1748      remitter _ = Nothing
1749#endif
1750
1751#if MIN_VERSION_template_haskell(2,12,0)
1752_CompleteP :: Prism' Pragma ([Name], Maybe Name)
1753_CompleteP
1754  = prism' reviewer remitter
1755  where
1756      reviewer (x, y) = CompleteP x y
1757      remitter (CompleteP x y) = Just (x, y)
1758      remitter _ = Nothing
1759#endif
1760
1761_NoInline :: Prism' Inline ()
1762_NoInline
1763  = prism' reviewer remitter
1764  where
1765      reviewer () = NoInline
1766      remitter NoInline = Just ()
1767      remitter _ = Nothing
1768
1769_Inline :: Prism' Inline ()
1770_Inline
1771  = prism' reviewer remitter
1772  where
1773      reviewer () = Inline
1774      remitter Inline = Just ()
1775      remitter _ = Nothing
1776
1777_Inlinable :: Prism' Inline ()
1778_Inlinable
1779  = prism' reviewer remitter
1780  where
1781      reviewer () = Inlinable
1782      remitter Inlinable = Just ()
1783      remitter _ = Nothing
1784
1785_ConLike :: Prism' RuleMatch ()
1786_ConLike
1787  = prism' reviewer remitter
1788  where
1789      reviewer () = ConLike
1790      remitter ConLike = Just ()
1791      remitter _ = Nothing
1792
1793_FunLike :: Prism' RuleMatch ()
1794_FunLike
1795  = prism' reviewer remitter
1796  where
1797      reviewer () = FunLike
1798      remitter FunLike = Just ()
1799      remitter _ = Nothing
1800
1801_AllPhases :: Prism' Phases ()
1802_AllPhases
1803  = prism' reviewer remitter
1804  where
1805      reviewer () = AllPhases
1806      remitter AllPhases = Just ()
1807      remitter _ = Nothing
1808
1809_FromPhase :: Prism' Phases Int
1810_FromPhase
1811  = prism' reviewer remitter
1812  where
1813      reviewer = FromPhase
1814      remitter (FromPhase x) = Just x
1815      remitter _ = Nothing
1816
1817_BeforePhase :: Prism' Phases Int
1818_BeforePhase
1819  = prism' reviewer remitter
1820  where
1821      reviewer = BeforePhase
1822      remitter (BeforePhase x) = Just x
1823      remitter _ = Nothing
1824
1825_RuleVar :: Prism' RuleBndr Name
1826_RuleVar
1827  = prism' reviewer remitter
1828  where
1829      reviewer = RuleVar
1830      remitter (RuleVar x) = Just x
1831      remitter _ = Nothing
1832
1833_TypedRuleVar :: Prism' RuleBndr (Name, Type)
1834_TypedRuleVar
1835  = prism' reviewer remitter
1836  where
1837      reviewer (x, y) = TypedRuleVar x y
1838      remitter (TypedRuleVar x y) = Just (x, y)
1839      remitter _ = Nothing
1840
1841_ModuleAnnotation :: Prism' AnnTarget ()
1842_ModuleAnnotation
1843  = prism' reviewer remitter
1844  where
1845      reviewer () = ModuleAnnotation
1846      remitter ModuleAnnotation = Just ()
1847      remitter _ = Nothing
1848
1849_TypeAnnotation :: Prism' AnnTarget Name
1850_TypeAnnotation
1851  = prism' reviewer remitter
1852  where
1853      reviewer = TypeAnnotation
1854      remitter (TypeAnnotation x) = Just x
1855      remitter _ = Nothing
1856
1857_ValueAnnotation :: Prism' AnnTarget Name
1858_ValueAnnotation
1859  = prism' reviewer remitter
1860  where
1861      reviewer = ValueAnnotation
1862      remitter (ValueAnnotation x) = Just x
1863      remitter _ = Nothing
1864
1865_FunDep :: Iso' FunDep ([Name], [Name])
1866_FunDep
1867  = iso remitter reviewer
1868  where
1869      reviewer (x, y) = FunDep x y
1870      remitter (FunDep x y) = (x, y)
1871
1872#if !(MIN_VERSION_template_haskell(2,13,0))
1873_TypeFam :: Prism' FamFlavour ()
1874_TypeFam
1875  = prism' reviewer remitter
1876  where
1877      reviewer () = TypeFam
1878      remitter TypeFam = Just ()
1879      remitter _ = Nothing
1880
1881_DataFam :: Prism' FamFlavour ()
1882_DataFam
1883  = prism' reviewer remitter
1884  where
1885      reviewer () = DataFam
1886      remitter DataFam = Just ()
1887      remitter _ = Nothing
1888#endif
1889
1890#if MIN_VERSION_template_haskell(2,15,0)
1891tySynEqnLHS :: Lens' TySynEqn Type
1892tySynEqnLHS = lens g s where
1893   g (TySynEqn _     lhs _)       = lhs
1894   s (TySynEqn mtvbs _   rhs) lhs = TySynEqn mtvbs lhs rhs
1895
1896tySynEqnPatterns :: Lens' TySynEqn [Type]
1897tySynEqnPatterns = lens g s where
1898   g (TySynEqn _     lhs _) = pats
1899     where (_n, pats) = unfoldType lhs
1900   s (TySynEqn mtvbs lhs rhs) pats = TySynEqn mtvbs (F.foldl' AppT n pats) rhs
1901     where (n, _pats) = unfoldType lhs
1902
1903tySynEqnResult :: Lens' TySynEqn Type
1904tySynEqnResult = lens g s where
1905   g (TySynEqn _     _   rhs) = rhs
1906   s (TySynEqn mtvbs lhs _)   = TySynEqn mtvbs lhs
1907#else
1908tySynEqnPatterns :: Lens' TySynEqn [Type]
1909tySynEqnPatterns = lens g s where
1910   g (TySynEqn xs _)    = xs
1911   s (TySynEqn _  y) xs = TySynEqn xs y
1912
1913tySynEqnResult :: Lens' TySynEqn Type
1914tySynEqnResult = lens g s where
1915   g (TySynEqn _  x) = x
1916   s (TySynEqn xs _) = TySynEqn xs
1917#endif
1918
1919_InfixL :: Prism' FixityDirection ()
1920_InfixL
1921  = prism' reviewer remitter
1922  where
1923      reviewer () = InfixL
1924      remitter InfixL = Just ()
1925      remitter _ = Nothing
1926
1927_InfixR :: Prism' FixityDirection ()
1928_InfixR
1929  = prism' reviewer remitter
1930  where
1931      reviewer () = InfixR
1932      remitter InfixR = Just ()
1933      remitter _ = Nothing
1934
1935_InfixN :: Prism' FixityDirection ()
1936_InfixN
1937  = prism' reviewer remitter
1938  where
1939      reviewer () = InfixN
1940      remitter InfixN = Just ()
1941      remitter _ = Nothing
1942
1943_VarE :: Prism' Exp Name
1944_VarE
1945  = prism' reviewer remitter
1946  where
1947      reviewer = VarE
1948      remitter (VarE x) = Just x
1949      remitter _ = Nothing
1950
1951_ConE :: Prism' Exp Name
1952_ConE
1953  = prism' reviewer remitter
1954  where
1955      reviewer = ConE
1956      remitter (ConE x) = Just x
1957      remitter _ = Nothing
1958
1959_LitE :: Prism' Exp Lit
1960_LitE
1961  = prism' reviewer remitter
1962  where
1963      reviewer = LitE
1964      remitter (LitE x) = Just x
1965      remitter _ = Nothing
1966
1967_AppE :: Prism' Exp (Exp, Exp)
1968_AppE
1969  = prism' reviewer remitter
1970  where
1971      reviewer (x, y) = AppE x y
1972      remitter (AppE x y) = Just (x, y)
1973      remitter _ = Nothing
1974
1975#if MIN_VERSION_template_haskell(2,12,0)
1976_AppTypeE :: Prism' Exp (Exp, Type)
1977_AppTypeE
1978  = prism' reviewer remitter
1979  where
1980      reviewer (x, y) = AppTypeE x y
1981      remitter (AppTypeE x y) = Just (x, y)
1982      remitter _ = Nothing
1983#endif
1984
1985_InfixE :: Prism' Exp (Maybe Exp, Exp, Maybe Exp)
1986_InfixE
1987  = prism' reviewer remitter
1988  where
1989      reviewer (x, y, z) = InfixE x y z
1990      remitter (InfixE x y z) = Just (x, y, z)
1991      remitter _ = Nothing
1992
1993_UInfixE :: Prism' Exp (Exp, Exp, Exp)
1994_UInfixE
1995  = prism' reviewer remitter
1996  where
1997      reviewer (x, y, z) = UInfixE x y z
1998      remitter (UInfixE x y z) = Just (x, y, z)
1999      remitter _ = Nothing
2000
2001_ParensE :: Prism' Exp Exp
2002_ParensE
2003  = prism' reviewer remitter
2004  where
2005      reviewer = ParensE
2006      remitter (ParensE x) = Just x
2007      remitter _ = Nothing
2008
2009_LamE :: Prism' Exp ([Pat], Exp)
2010_LamE
2011  = prism' reviewer remitter
2012  where
2013      reviewer (x, y) = LamE x y
2014      remitter (LamE x y) = Just (x, y)
2015      remitter _ = Nothing
2016
2017_LamCaseE :: Prism' Exp [Match]
2018_LamCaseE
2019  = prism' reviewer remitter
2020  where
2021      reviewer = LamCaseE
2022      remitter (LamCaseE x) = Just x
2023      remitter _ = Nothing
2024
2025-- |
2026-- @
2027-- _TupE :: 'Prism'' 'Exp' ['Maybe' 'Exp'] -- template-haskell-2.16+
2028-- _TupE :: 'Prism'' 'Exp' ['Exp']       -- Earlier versions
2029-- @
2030#if MIN_VERSION_template_haskell(2,16,0)
2031_TupE :: Prism' Exp [Maybe Exp]
2032#else
2033_TupE :: Prism' Exp [Exp]
2034#endif
2035_TupE
2036  = prism' reviewer remitter
2037  where
2038      reviewer = TupE
2039      remitter (TupE x) = Just x
2040      remitter _ = Nothing
2041
2042-- |
2043-- @
2044-- _UnboxedTupE :: 'Prism'' 'Exp' ['Maybe' 'Exp'] -- template-haskell-2.16+
2045-- _UnboxedTupE :: 'Prism'' 'Exp' ['Exp']       -- Earlier versions
2046-- @
2047#if MIN_VERSION_template_haskell(2,16,0)
2048_UnboxedTupE :: Prism' Exp [Maybe Exp]
2049#else
2050_UnboxedTupE :: Prism' Exp [Exp]
2051#endif
2052_UnboxedTupE
2053  = prism' reviewer remitter
2054  where
2055      reviewer = UnboxedTupE
2056      remitter (UnboxedTupE x) = Just x
2057      remitter _ = Nothing
2058
2059#if MIN_VERSION_template_haskell(2,12,0)
2060_UnboxedSumE :: Prism' Exp (Exp, SumAlt, SumArity)
2061_UnboxedSumE
2062  = prism' reviewer remitter
2063  where
2064      reviewer (x, y, z) = UnboxedSumE x y z
2065      remitter (UnboxedSumE x y z) = Just (x, y, z)
2066      remitter _ = Nothing
2067#endif
2068
2069_CondE :: Prism' Exp (Exp, Exp, Exp)
2070_CondE
2071  = prism' reviewer remitter
2072  where
2073      reviewer (x, y, z) = CondE x y z
2074      remitter (CondE x y z) = Just (x, y, z)
2075      remitter _ = Nothing
2076
2077_MultiIfE :: Prism' Exp [(Guard, Exp)]
2078_MultiIfE
2079  = prism' reviewer remitter
2080  where
2081      reviewer = MultiIfE
2082      remitter (MultiIfE x) = Just x
2083      remitter _ = Nothing
2084
2085_LetE :: Prism' Exp ([Dec], Exp)
2086_LetE
2087  = prism' reviewer remitter
2088  where
2089      reviewer (x, y) = LetE x y
2090      remitter (LetE x y) = Just (x, y)
2091      remitter _ = Nothing
2092
2093_CaseE :: Prism' Exp (Exp, [Match])
2094_CaseE
2095  = prism' reviewer remitter
2096  where
2097      reviewer (x, y) = CaseE x y
2098      remitter (CaseE x y) = Just (x, y)
2099      remitter _ = Nothing
2100
2101-- |
2102-- @
2103-- _DoE :: 'Prism'' 'Exp' ('Maybe' 'ModName', ['Stmt']) -- template-haskell-2.17+
2104-- _DoE :: 'Prism'' 'Exp' ['Stmt']                  -- Earlier versions
2105-- @
2106# if MIN_VERSION_template_haskell(2,17,0)
2107_DoE :: Prism' Exp (Maybe ModName, [Stmt])
2108_DoE
2109  = prism' reviewer remitter
2110  where
2111      reviewer (x, y) = DoE x y
2112      remitter (DoE x y) = Just (x, y)
2113      remitter _ = Nothing
2114# else
2115_DoE :: Prism' Exp [Stmt]
2116_DoE
2117  = prism' reviewer remitter
2118  where
2119      reviewer = DoE
2120      remitter (DoE x) = Just x
2121      remitter _ = Nothing
2122# endif
2123
2124_CompE :: Prism' Exp [Stmt]
2125_CompE
2126  = prism' reviewer remitter
2127  where
2128      reviewer = CompE
2129      remitter (CompE x) = Just x
2130      remitter _ = Nothing
2131
2132_ArithSeqE :: Prism' Exp Range
2133_ArithSeqE
2134  = prism' reviewer remitter
2135  where
2136      reviewer = ArithSeqE
2137      remitter (ArithSeqE x) = Just x
2138      remitter _ = Nothing
2139
2140_ListE :: Prism' Exp [Exp]
2141_ListE
2142  = prism' reviewer remitter
2143  where
2144      reviewer = ListE
2145      remitter (ListE x) = Just x
2146      remitter _ = Nothing
2147
2148_SigE :: Prism' Exp (Exp, Type)
2149_SigE
2150  = prism' reviewer remitter
2151  where
2152      reviewer (x, y) = SigE x y
2153      remitter (SigE x y) = Just (x, y)
2154      remitter _ = Nothing
2155
2156_RecConE :: Prism' Exp (Name, [FieldExp])
2157_RecConE
2158  = prism' reviewer remitter
2159  where
2160      reviewer (x, y) = RecConE x y
2161      remitter (RecConE x y) = Just (x, y)
2162      remitter _ = Nothing
2163
2164_RecUpdE :: Prism' Exp (Exp, [FieldExp])
2165_RecUpdE
2166  = prism' reviewer remitter
2167  where
2168      reviewer (x, y) = RecUpdE x y
2169      remitter (RecUpdE x y) = Just (x, y)
2170      remitter _ = Nothing
2171
2172#if MIN_VERSION_template_haskell(2,10,0)
2173_StaticE :: Prism' Exp Exp
2174_StaticE
2175  = prism' reviewer remitter
2176  where
2177      reviewer = StaticE
2178      remitter (StaticE x) = Just x
2179      remitter _ = Nothing
2180#endif
2181
2182#if MIN_VERSION_template_haskell(2,11,0)
2183_UnboundVarE :: Prism' Exp Name
2184_UnboundVarE
2185  = prism' reviewer remitter
2186  where
2187      reviewer = UnboundVarE
2188      remitter (UnboundVarE x) = Just x
2189      remitter _ = Nothing
2190#endif
2191
2192#if MIN_VERSION_template_haskell(2,13,0)
2193_LabelE :: Prism' Exp String
2194_LabelE
2195  = prism' reviewer remitter
2196  where
2197      reviewer = LabelE
2198      remitter (LabelE x) = Just x
2199      remitter _ = Nothing
2200#endif
2201
2202#if MIN_VERSION_template_haskell(2,15,0)
2203-- |
2204-- @
2205-- _MDoE :: 'Prism'' 'Exp' ('Maybe' 'ModName', ['Stmt']) -- template-haskell-2.17+
2206-- _MDoE :: 'Prism'' 'Exp' ['Stmt']                  -- Earlier versions
2207-- @
2208# if MIN_VERSION_template_haskell(2,17,0)
2209_MDoE :: Prism' Exp (Maybe ModName, [Stmt])
2210_MDoE
2211  = prism' reviewer remitter
2212  where
2213      reviewer (x, y) = MDoE x y
2214      remitter (MDoE x y) = Just (x, y)
2215      remitter _ = Nothing
2216# else
2217_MDoE :: Prism' Exp [Stmt]
2218_MDoE
2219  = prism' reviewer remitter
2220  where
2221      reviewer = MDoE
2222      remitter (MDoE x) = Just x
2223      remitter _ = Nothing
2224# endif
2225
2226_ImplicitParamVarE :: Prism' Exp String
2227_ImplicitParamVarE
2228  = prism' reviewer remitter
2229  where
2230      reviewer = ImplicitParamVarE
2231      remitter (ImplicitParamVarE x) = Just x
2232      remitter _ = Nothing
2233#endif
2234
2235_GuardedB :: Prism' Body [(Guard, Exp)]
2236_GuardedB
2237  = prism' reviewer remitter
2238  where
2239      reviewer = GuardedB
2240      remitter (GuardedB x) = Just x
2241      remitter _ = Nothing
2242
2243_NormalB :: Prism' Body Exp
2244_NormalB
2245  = prism' reviewer remitter
2246  where
2247      reviewer = NormalB
2248      remitter (NormalB x) = Just x
2249      remitter _ = Nothing
2250
2251_NormalG :: Prism' Guard Exp
2252_NormalG
2253  = prism' reviewer remitter
2254  where
2255      reviewer = NormalG
2256      remitter (NormalG x) = Just x
2257      remitter _ = Nothing
2258
2259_PatG :: Prism' Guard [Stmt]
2260_PatG
2261  = prism' reviewer remitter
2262  where
2263      reviewer = PatG
2264      remitter (PatG x) = Just x
2265      remitter _ = Nothing
2266
2267_BindS :: Prism' Stmt (Pat, Exp)
2268_BindS
2269  = prism' reviewer remitter
2270  where
2271      reviewer (x, y) = BindS x y
2272      remitter (BindS x y) = Just (x, y)
2273      remitter _ = Nothing
2274
2275_LetS :: Prism' Stmt [Dec]
2276_LetS
2277  = prism' reviewer remitter
2278  where
2279      reviewer = LetS
2280      remitter (LetS x) = Just x
2281      remitter _ = Nothing
2282
2283_NoBindS :: Prism' Stmt Exp
2284_NoBindS
2285  = prism' reviewer remitter
2286  where
2287      reviewer = NoBindS
2288      remitter (NoBindS x) = Just x
2289      remitter _ = Nothing
2290
2291_ParS :: Prism' Stmt [[Stmt]]
2292_ParS
2293  = prism' reviewer remitter
2294  where
2295      reviewer = ParS
2296      remitter (ParS x) = Just x
2297      remitter _ = Nothing
2298
2299#if MIN_VERSION_template_haskell(2,15,0)
2300_RecS :: Prism' Stmt [Stmt]
2301_RecS
2302  = prism' reviewer remitter
2303  where
2304      reviewer = RecS
2305      remitter (RecS x) = Just x
2306      remitter _ = Nothing
2307#endif
2308
2309_FromR :: Prism' Range Exp
2310_FromR
2311  = prism' reviewer remitter
2312  where
2313      reviewer = FromR
2314      remitter (FromR x) = Just x
2315      remitter _ = Nothing
2316
2317_FromThenR :: Prism' Range (Exp, Exp)
2318_FromThenR
2319  = prism' reviewer remitter
2320  where
2321      reviewer (x, y) = FromThenR x y
2322      remitter (FromThenR x y) = Just (x, y)
2323      remitter _ = Nothing
2324
2325_FromToR :: Prism' Range (Exp, Exp)
2326_FromToR
2327  = prism' reviewer remitter
2328  where
2329      reviewer (x, y) = FromToR x y
2330      remitter (FromToR x y) = Just (x, y)
2331      remitter _ = Nothing
2332
2333_FromThenToR :: Prism' Range (Exp, Exp, Exp)
2334_FromThenToR
2335  = prism' reviewer remitter
2336  where
2337      reviewer (x, y, z) = FromThenToR x y z
2338      remitter (FromThenToR x y z) = Just (x, y, z)
2339      remitter _ = Nothing
2340
2341_CharL :: Prism' Lit Char
2342_CharL
2343  = prism' reviewer remitter
2344  where
2345      reviewer = CharL
2346      remitter (CharL x) = Just x
2347      remitter _ = Nothing
2348
2349_StringL :: Prism' Lit String
2350_StringL
2351  = prism' reviewer remitter
2352  where
2353      reviewer = StringL
2354      remitter (StringL x) = Just x
2355      remitter _ = Nothing
2356
2357_IntegerL :: Prism' Lit Integer
2358_IntegerL
2359  = prism' reviewer remitter
2360  where
2361      reviewer = IntegerL
2362      remitter (IntegerL x) = Just x
2363      remitter _ = Nothing
2364
2365_RationalL :: Prism' Lit Rational
2366_RationalL
2367  = prism' reviewer remitter
2368  where
2369      reviewer = RationalL
2370      remitter (RationalL x) = Just x
2371      remitter _ = Nothing
2372
2373_IntPrimL :: Prism' Lit Integer
2374_IntPrimL
2375  = prism' reviewer remitter
2376  where
2377      reviewer = IntPrimL
2378      remitter (IntPrimL x) = Just x
2379      remitter _ = Nothing
2380
2381_WordPrimL :: Prism' Lit Integer
2382_WordPrimL
2383  = prism' reviewer remitter
2384  where
2385      reviewer = WordPrimL
2386      remitter (WordPrimL x) = Just x
2387      remitter _ = Nothing
2388
2389_FloatPrimL :: Prism' Lit Rational
2390_FloatPrimL
2391  = prism' reviewer remitter
2392  where
2393      reviewer = FloatPrimL
2394      remitter (FloatPrimL x) = Just x
2395      remitter _ = Nothing
2396
2397_DoublePrimL :: Prism' Lit Rational
2398_DoublePrimL
2399  = prism' reviewer remitter
2400  where
2401      reviewer = DoublePrimL
2402      remitter (DoublePrimL x) = Just x
2403      remitter _ = Nothing
2404
2405_StringPrimL :: Prism' Lit [Word8]
2406_StringPrimL
2407  = prism' reviewer remitter
2408  where
2409      reviewer = StringPrimL
2410      remitter (StringPrimL x) = Just x
2411      remitter _ = Nothing
2412
2413#if MIN_VERSION_template_haskell(2,11,0)
2414_CharPrimL :: Prism' Lit Char
2415_CharPrimL
2416  = prism' reviewer remitter
2417  where
2418      reviewer = CharPrimL
2419      remitter (CharPrimL x) = Just x
2420      remitter _ = Nothing
2421#endif
2422
2423#if MIN_VERSION_template_haskell(2,16,0)
2424_BytesPrimL :: Prism' Lit Bytes
2425_BytesPrimL
2426  = prism' reviewer remitter
2427  where
2428      reviewer = BytesPrimL
2429      remitter (BytesPrimL x) = Just x
2430      remitter _ = Nothing
2431#endif
2432
2433_LitP :: Prism' Pat Lit
2434_LitP
2435  = prism' reviewer remitter
2436  where
2437      reviewer = LitP
2438      remitter (LitP x) = Just x
2439      remitter _ = Nothing
2440
2441_VarP :: Prism' Pat Name
2442_VarP
2443  = prism' reviewer remitter
2444  where
2445      reviewer = VarP
2446      remitter (VarP x) = Just x
2447      remitter _ = Nothing
2448
2449_TupP :: Prism' Pat [Pat]
2450_TupP
2451  = prism' reviewer remitter
2452  where
2453      reviewer = TupP
2454      remitter (TupP x) = Just x
2455      remitter _ = Nothing
2456
2457_UnboxedTupP :: Prism' Pat [Pat]
2458_UnboxedTupP
2459  = prism' reviewer remitter
2460  where
2461      reviewer = UnboxedTupP
2462      remitter (UnboxedTupP x) = Just x
2463      remitter _ = Nothing
2464
2465#if MIN_VERSION_template_haskell(2,12,0)
2466_UnboxedSumP :: Prism' Pat (Pat, SumAlt, SumArity)
2467_UnboxedSumP
2468  = prism' reviewer remitter
2469  where
2470      reviewer (x, y, z) = UnboxedSumP x y z
2471      remitter (UnboxedSumP x y z) = Just (x, y, z)
2472      remitter _ = Nothing
2473#endif
2474
2475_ConP :: Prism' Pat (Name, [Pat])
2476_ConP
2477  = prism' reviewer remitter
2478  where
2479      reviewer (x, y) = ConP x y
2480      remitter (ConP x y) = Just (x, y)
2481      remitter _ = Nothing
2482
2483_InfixP :: Prism' Pat (Pat, Name, Pat)
2484_InfixP
2485  = prism' reviewer remitter
2486  where
2487      reviewer (x, y, z) = InfixP x y z
2488      remitter (InfixP x y z) = Just (x, y, z)
2489      remitter _ = Nothing
2490
2491_UInfixP :: Prism' Pat (Pat, Name, Pat)
2492_UInfixP
2493  = prism' reviewer remitter
2494  where
2495      reviewer (x, y, z) = UInfixP x y z
2496      remitter (UInfixP x y z) = Just (x, y, z)
2497      remitter _ = Nothing
2498
2499_ParensP :: Prism' Pat Pat
2500_ParensP
2501  = prism' reviewer remitter
2502  where
2503      reviewer = ParensP
2504      remitter (ParensP x) = Just x
2505      remitter _ = Nothing
2506
2507_TildeP :: Prism' Pat Pat
2508_TildeP
2509  = prism' reviewer remitter
2510  where
2511      reviewer = TildeP
2512      remitter (TildeP x) = Just x
2513      remitter _ = Nothing
2514
2515_BangP :: Prism' Pat Pat
2516_BangP
2517  = prism' reviewer remitter
2518  where
2519      reviewer = BangP
2520      remitter (BangP x) = Just x
2521      remitter _ = Nothing
2522
2523_AsP :: Prism' Pat (Name, Pat)
2524_AsP
2525  = prism' reviewer remitter
2526  where
2527      reviewer (x, y) = AsP x y
2528      remitter (AsP x y) = Just (x, y)
2529      remitter _ = Nothing
2530
2531_WildP :: Prism' Pat ()
2532_WildP
2533  = prism' reviewer remitter
2534  where
2535      reviewer () = WildP
2536      remitter WildP = Just ()
2537      remitter _ = Nothing
2538
2539_RecP :: Prism' Pat (Name, [FieldPat])
2540_RecP
2541  = prism' reviewer remitter
2542  where
2543      reviewer (x, y) = RecP x y
2544      remitter (RecP x y) = Just (x, y)
2545      remitter _ = Nothing
2546
2547_ListP :: Prism' Pat [Pat]
2548_ListP
2549  = prism' reviewer remitter
2550  where
2551      reviewer = ListP
2552      remitter (ListP x) = Just x
2553      remitter _ = Nothing
2554
2555_SigP :: Prism' Pat (Pat, Type)
2556_SigP
2557  = prism' reviewer remitter
2558  where
2559      reviewer (x, y) = SigP x y
2560      remitter (SigP x y) = Just (x, y)
2561      remitter _ = Nothing
2562
2563_ViewP :: Prism' Pat (Exp, Pat)
2564_ViewP
2565  = prism' reviewer remitter
2566  where
2567      reviewer (x, y) = ViewP x y
2568      remitter (ViewP x y) = Just (x, y)
2569      remitter _ = Nothing
2570
2571_ForallT :: Prism' Type ([TyVarBndrSpec], Cxt, Type)
2572_ForallT
2573  = prism' reviewer remitter
2574  where
2575      reviewer (x, y, z) = ForallT x y z
2576      remitter (ForallT x y z) = Just (x, y, z)
2577      remitter _ = Nothing
2578
2579_AppT :: Prism' Type (Type, Type)
2580_AppT
2581  = prism' reviewer remitter
2582  where
2583      reviewer (x, y) = AppT x y
2584      remitter (AppT x y) = Just (x, y)
2585      remitter _ = Nothing
2586
2587_SigT :: Prism' Type (Type, Kind)
2588_SigT
2589  = prism' reviewer remitter
2590  where
2591      reviewer (x, y) = SigT x y
2592      remitter (SigT x y) = Just (x, y)
2593      remitter _ = Nothing
2594
2595_VarT :: Prism' Type Name
2596_VarT
2597  = prism' reviewer remitter
2598  where
2599      reviewer = VarT
2600      remitter (VarT x) = Just x
2601      remitter _ = Nothing
2602
2603_ConT :: Prism' Type Name
2604_ConT
2605  = prism' reviewer remitter
2606  where
2607      reviewer = ConT
2608      remitter (ConT x) = Just x
2609      remitter _ = Nothing
2610
2611_PromotedT :: Prism' Type Name
2612_PromotedT
2613  = prism' reviewer remitter
2614  where
2615      reviewer = PromotedT
2616      remitter (PromotedT x) = Just x
2617      remitter _ = Nothing
2618
2619_TupleT :: Prism' Type Int
2620_TupleT
2621  = prism' reviewer remitter
2622  where
2623      reviewer = TupleT
2624      remitter (TupleT x) = Just x
2625      remitter _ = Nothing
2626
2627_UnboxedTupleT :: Prism' Type Int
2628_UnboxedTupleT
2629  = prism' reviewer remitter
2630  where
2631      reviewer = UnboxedTupleT
2632      remitter (UnboxedTupleT x) = Just x
2633      remitter _ = Nothing
2634
2635#if MIN_VERSION_template_haskell(2,12,0)
2636_UnboxedSumT :: Prism' Type SumArity
2637_UnboxedSumT
2638  = prism' reviewer remitter
2639  where
2640      reviewer = UnboxedSumT
2641      remitter (UnboxedSumT x) = Just x
2642      remitter _ = Nothing
2643#endif
2644
2645_ArrowT :: Prism' Type ()
2646_ArrowT
2647  = prism' reviewer remitter
2648  where
2649      reviewer () = ArrowT
2650      remitter ArrowT = Just ()
2651      remitter _ = Nothing
2652
2653#if MIN_VERSION_template_haskell(2,10,0)
2654_EqualityT :: Prism' Type ()
2655_EqualityT
2656  = prism' reviewer remitter
2657  where
2658      reviewer () = EqualityT
2659      remitter EqualityT = Just ()
2660      remitter _ = Nothing
2661#endif
2662
2663_ListT :: Prism' Type ()
2664_ListT
2665  = prism' reviewer remitter
2666  where
2667      reviewer () = ListT
2668      remitter ListT = Just ()
2669      remitter _ = Nothing
2670
2671_PromotedTupleT :: Prism' Type Int
2672_PromotedTupleT
2673  = prism' reviewer remitter
2674  where
2675      reviewer = PromotedTupleT
2676      remitter (PromotedTupleT x) = Just x
2677      remitter _ = Nothing
2678
2679_PromotedNilT :: Prism' Type ()
2680_PromotedNilT
2681  = prism' reviewer remitter
2682  where
2683      reviewer () = PromotedNilT
2684      remitter PromotedNilT = Just ()
2685      remitter _ = Nothing
2686
2687_PromotedConsT :: Prism' Type ()
2688_PromotedConsT
2689  = prism' reviewer remitter
2690  where
2691      reviewer () = PromotedConsT
2692      remitter PromotedConsT = Just ()
2693      remitter _ = Nothing
2694
2695_StarT :: Prism' Type ()
2696_StarT
2697  = prism' reviewer remitter
2698  where
2699      reviewer () = StarT
2700      remitter StarT = Just ()
2701      remitter _ = Nothing
2702
2703_ConstraintT :: Prism' Type ()
2704_ConstraintT
2705  = prism' reviewer remitter
2706  where
2707      reviewer () = ConstraintT
2708      remitter ConstraintT = Just ()
2709      remitter _ = Nothing
2710
2711_LitT :: Prism' Type TyLit
2712_LitT
2713  = prism' reviewer remitter
2714  where
2715      reviewer = LitT
2716      remitter (LitT x) = Just x
2717      remitter _ = Nothing
2718
2719#if MIN_VERSION_template_haskell(2,11,0)
2720_InfixT :: Prism' Type (Type, Name, Type)
2721_InfixT
2722  = prism' reviewer remitter
2723  where
2724      reviewer (x, y, z) = InfixT x y z
2725      remitter (InfixT x y z) = Just (x, y, z)
2726      remitter _ = Nothing
2727
2728_UInfixT :: Prism' Type (Type, Name, Type)
2729_UInfixT
2730  = prism' reviewer remitter
2731  where
2732      reviewer (x, y, z) = UInfixT x y z
2733      remitter (UInfixT x y z) = Just (x, y, z)
2734      remitter _ = Nothing
2735
2736_ParensT :: Prism' Type Type
2737_ParensT
2738  = prism' reviewer remitter
2739  where
2740      reviewer = ParensT
2741      remitter (ParensT x) = Just x
2742      remitter _ = Nothing
2743
2744_WildCardT :: Prism' Type ()
2745_WildCardT
2746  = prism' reviewer remitter
2747  where
2748      reviewer () = WildCardT
2749      remitter WildCardT = Just ()
2750      remitter _ = Nothing
2751#endif
2752
2753#if MIN_VERSION_template_haskell(2,15,0)
2754_AppKindT :: Prism' Type (Type, Kind)
2755_AppKindT
2756  = prism' reviewer remitter
2757  where
2758      reviewer (x, y) = AppKindT x y
2759      remitter (AppKindT x y) = Just (x, y)
2760      remitter _ = Nothing
2761
2762_ImplicitParamT :: Prism' Type (String, Type)
2763_ImplicitParamT
2764  = prism' reviewer remitter
2765  where
2766      reviewer (x, y) = ImplicitParamT x y
2767      remitter (ImplicitParamT x y) = Just (x, y)
2768      remitter _ = Nothing
2769#endif
2770
2771#if MIN_VERSION_template_haskell(2,16,0)
2772_ForallVisT :: Prism' Type ([TyVarBndrUnit], Type)
2773_ForallVisT
2774  = prism' reviewer remitter
2775  where
2776      reviewer (x, y) = ForallVisT x y
2777      remitter (ForallVisT x y) = Just (x, y)
2778      remitter _ = Nothing
2779#endif
2780
2781#if MIN_VERSION_template_haskell(2,17,0)
2782_MulArrowT :: Prism' Type ()
2783_MulArrowT
2784  = prism' reviewer remitter
2785  where
2786      reviewer () = MulArrowT
2787      remitter MulArrowT = Just ()
2788      remitter _ = Nothing
2789#endif
2790
2791#if MIN_VERSION_template_haskell(2,17,0)
2792_SpecifiedSpec :: Prism' Specificity ()
2793_SpecifiedSpec
2794  = prism' reviewer remitter
2795  where
2796      reviewer () = SpecifiedSpec
2797      remitter SpecifiedSpec = Just ()
2798      remitter _ = Nothing
2799
2800_InferredSpec :: Prism' Specificity ()
2801_InferredSpec
2802  = prism' reviewer remitter
2803  where
2804      reviewer () = InferredSpec
2805      remitter InferredSpec = Just ()
2806      remitter _ = Nothing
2807#endif
2808
2809-- |
2810-- @
2811-- _PlainTV :: 'Prism'' ('TyVarBndr' flag) ('Name', flag) -- template-haskell-2.17+
2812-- _PlainTV :: 'Prism''  'TyVarBndr'        'Name'        -- Earlier versions
2813-- @
2814#if MIN_VERSION_template_haskell(2,17,0)
2815_PlainTV :: Prism' (TyVarBndr flag) (Name, flag)
2816_PlainTV
2817  = prism' reviewer remitter
2818  where
2819      reviewer (x, y) = PlainTV x y
2820      remitter (PlainTV x y) = Just (x, y)
2821      remitter _ = Nothing
2822#else
2823_PlainTV :: Prism' TyVarBndr Name
2824_PlainTV
2825  = prism' reviewer remitter
2826  where
2827      reviewer = PlainTV
2828      remitter (PlainTV x) = Just x
2829      remitter _ = Nothing
2830#endif
2831
2832-- |
2833-- @
2834-- _KindedTV :: 'Prism'' ('TyVarBndr' flag) ('Name', flag, 'Kind') -- template-haskell-2.17+
2835-- _KindedTV :: 'Prism''  'TyVarBndr'       ('Name',       'Kind') -- Earlier versions
2836-- @
2837#if MIN_VERSION_template_haskell(2,17,0)
2838_KindedTV :: Prism' (TyVarBndr flag) (Name, flag, Kind)
2839_KindedTV
2840  = prism' reviewer remitter
2841  where
2842      reviewer (x, y, z) = KindedTV x y z
2843      remitter (KindedTV x y z) = Just (x, y, z)
2844      remitter _ = Nothing
2845#else
2846_KindedTV :: Prism' TyVarBndr (Name, Kind)
2847_KindedTV
2848  = prism' reviewer remitter
2849  where
2850      reviewer (x, y) = KindedTV x y
2851      remitter (KindedTV x y) = Just (x, y)
2852      remitter _ = Nothing
2853#endif
2854
2855#if MIN_VERSION_template_haskell(2,11,0)
2856_NoSig :: Prism' FamilyResultSig ()
2857_NoSig
2858  = prism' reviewer remitter
2859  where
2860      reviewer () = NoSig
2861      remitter NoSig = Just ()
2862      remitter _ = Nothing
2863
2864_KindSig :: Prism' FamilyResultSig Kind
2865_KindSig
2866  = prism' reviewer remitter
2867  where
2868      reviewer = KindSig
2869      remitter (KindSig x) = Just x
2870      remitter _ = Nothing
2871
2872_TyVarSig :: Prism' FamilyResultSig TyVarBndrUnit
2873_TyVarSig
2874  = prism' reviewer remitter
2875  where
2876      reviewer = TyVarSig
2877      remitter (TyVarSig x) = Just x
2878      remitter _ = Nothing
2879#endif
2880
2881_NumTyLit :: Prism' TyLit Integer
2882_NumTyLit
2883  = prism' reviewer remitter
2884  where
2885      reviewer = NumTyLit
2886      remitter (NumTyLit x) = Just x
2887      remitter _ = Nothing
2888
2889_StrTyLit :: Prism' TyLit String
2890_StrTyLit
2891  = prism' reviewer remitter
2892  where
2893      reviewer = StrTyLit
2894      remitter (StrTyLit x) = Just x
2895      remitter _ = Nothing
2896
2897#if !MIN_VERSION_template_haskell(2,10,0)
2898_ClassP :: Prism' Pred (Name, [Type])
2899_ClassP
2900  = prism' reviewer remitter
2901  where
2902      reviewer (x, y) = ClassP x y
2903      remitter (ClassP x y) = Just (x, y)
2904      remitter _ = Nothing
2905
2906_EqualP :: Prism' Pred (Type, Type)
2907_EqualP
2908  = prism' reviewer remitter
2909  where
2910      reviewer (x, y) = EqualP x y
2911      remitter (EqualP x y) = Just (x, y)
2912      remitter _ = Nothing
2913#endif
2914
2915_NominalR :: Prism' Role ()
2916_NominalR
2917  = prism' reviewer remitter
2918  where
2919      reviewer () = NominalR
2920      remitter NominalR = Just ()
2921      remitter _ = Nothing
2922
2923_RepresentationalR :: Prism' Role ()
2924_RepresentationalR
2925  = prism' reviewer remitter
2926  where
2927      reviewer () = RepresentationalR
2928      remitter RepresentationalR = Just ()
2929      remitter _ = Nothing
2930
2931_PhantomR :: Prism' Role ()
2932_PhantomR
2933  = prism' reviewer remitter
2934  where
2935      reviewer () = PhantomR
2936      remitter PhantomR = Just ()
2937      remitter _ = Nothing
2938
2939_InferR :: Prism' Role ()
2940_InferR
2941  = prism' reviewer remitter
2942  where
2943      reviewer () = InferR
2944      remitter InferR = Just ()
2945      remitter _ = Nothing
2946
2947#if MIN_VERSION_template_haskell(2,12,0)
2948_StockStrategy :: Prism' DerivStrategy ()
2949_StockStrategy
2950  = prism' reviewer remitter
2951  where
2952      reviewer () = StockStrategy
2953      remitter StockStrategy = Just ()
2954      remitter _ = Nothing
2955
2956_AnyclassStrategy :: Prism' DerivStrategy ()
2957_AnyclassStrategy
2958  = prism' reviewer remitter
2959  where
2960      reviewer () = AnyclassStrategy
2961      remitter AnyclassStrategy = Just ()
2962      remitter _ = Nothing
2963
2964_NewtypeStrategy :: Prism' DerivStrategy ()
2965_NewtypeStrategy
2966  = prism' reviewer remitter
2967  where
2968      reviewer () = NewtypeStrategy
2969      remitter NewtypeStrategy = Just ()
2970      remitter _ = Nothing
2971#endif
2972