lens-4.15.4: Lenses, Folds and Traversals

Copyright | (C) 2014-2016 Edward Kmett (C) 2014 Eric Mertens
License | BSD-style (see the file LICENSE)
Maintainer | Edward Kmett <ekmett@gmail.com>
Stability | experimental
Portability | non-portable
Safe Haskell | Trustworthy
Language | Haskell98

Control.Lens.Internal.FieldTH

Description

Synopsis

- data LensRules = LensRules {
  - _simpleLenses :: Bool
  - _generateSigs :: Bool
  - _generateClasses :: Bool
  - _allowIsos :: Bool
  - _allowUpdates :: Bool
  - _lazyPatterns :: Bool
  - _fieldToDef :: FieldNamer
  - _classyLenses :: ClassyNamer
  }
- type FieldNamer = Name -> [Name] -> Name -> [DefName]
- data DefName
  - = TopName Name
  - | MethodName Name Name
- type ClassyNamer = Name -> Maybe (Name, Name)
- makeFieldOptics :: LensRules -> Name -> DecsQ
- makeFieldOpticsForDec :: LensRules -> Dec -> DecsQ
- makeFieldOpticsForDec' :: LensRules -> Dec -> HasFieldClasses [Dec]
- type HasFieldClasses = StateT (Set Name) Q

# Documentation

data LensRules Source #

Rules to construct lenses for data fields.

Constructors

LensRules |

Fields

- _simpleLenses :: Bool
- _generateSigs :: Bool
- _generateClasses :: Bool
- _allowIsos :: Bool
- _allowUpdates :: Bool

  Allow LensTraversal (otherwise GetterFold)

- _lazyPatterns :: Bool
- _fieldToDef :: FieldNamer

  Type Name -> Field Names -> Target Field Name -> Definition Names

- _classyLenses :: ClassyNamer

type FieldNamer Source #

Arguments

= Name | Name of the data type that lenses are being generated for.
-> [Name] | Names of all fields (including the field being named) in the data type.
-> Name | Name of the field being named.
-> [DefName] | Name(s) of the lens functions. If empty, no lens is created for that field.

The rule to create function names of lenses for data fields.

Although it's sometimes useful, you won't need the first two arguments most of the time.

data DefName Source #

Name to give to generated field optics.

Constructors

TopName Name | Simple top-level definiton name
MethodName Name Name | makeFields-style class name and method name

Instances

Eq DefName Source # |
Methods (==) :: DefName -> DefName -> Bool # (/=) :: DefName -> DefName -> Bool #
Ord DefName Source # |
Methods compare :: DefName -> DefName -> Ordering # (<) :: DefName -> DefName -> Bool # (<=) :: DefName -> DefName -> Bool # (>) :: DefName -> DefName -> Bool # (>=) :: DefName -> DefName -> Bool # max :: DefName -> DefName -> DefName # min :: DefName -> DefName -> DefName #
Show DefName Source # |
Methods showsPrec :: Int -> DefName -> ShowS # show :: DefName -> String # showList :: [DefName] -> ShowS #

type ClassyNamer Source #

Arguments

= Name | Name of the data type that lenses are being generated for.
-> Maybe (Name, Name) | Names of the class and the main method it generates, respectively.

The optional rule to create a class and method around a monomorphic data type. If this naming convention is provided, it generates a "classy" lens.

makeFieldOptics :: LensRules -> Name -> DecsQ Source #

Compute the field optics for the type identified by the given type name. Lenses will be computed when possible, Traversals otherwise.

makeFieldOpticsForDec :: LensRules -> Dec -> DecsQ Source #

makeFieldOpticsForDec' :: LensRules -> Dec -> HasFieldClasses [Dec] Source #

type HasFieldClasses = StateT (Set Name) Q Source #

Tracks the field class `Name`s that have been created so far. We consult these so that we may avoid creating duplicate classes.