generic-lens-2.2.1.0: Generically derive traversals, lenses and prisms.
Copyright (C) 2020 Csongor Kiss
License BSD3
Maintainer Csongor Kiss <kiss.csongor.kiss@gmail.com>
Stability experimental
Portability non-portable
Safe Haskell None
Language Haskell2010

Data.Generics.Labels

Description

Provides an (orphan) IsLabel instance for field lenses and constructor prisms. Use at your own risk.

Synopsis

Orphan IsLabel Instance

An instance for creating lenses and prisms with #identifiers from the OverloadedLabels extension. Note that since overloaded labels do not support symbols starting with capital letters, all prisms (which come from constructor names, which are capitalized) must be prefixed with an underscore (e.g. #_ConstructorName ).

Morally:

instance (HasField name s t a b) => IsLabel name (Lens s t a b) where ...

and

instance (AsConstructor name s t a b) => IsLabel name (Prism s t a b) where ...

Remember:

type Lens = forall f. Functor f => (a -> f b) -> s -> f t

type Prism s t a b = forall p f. (Choice p, Applicative f) => p a (f b) -> p s (f t)

The orphan instance is unavoidable if we want to work with lenses-as-functions (as opposed to a ReifiedLens -like newtype).

class Field name s t a b | s name -> a, t name -> b, s name b -> t, t name a -> s where Source #

Field is morally the same as HasField , but it is constructed from an incoherent combination of HasField and HasField' . In this way, it can be seamlessly used in the IsLabel instance even when dealing with data types that don't have Field instances (like data instances).

Instances

Instances details
HasField' name s a => Field (name :: Symbol ) s s a a Source #
Instance details

Defined in Data.Generics.Labels

HasField name s t a b => Field (name :: Symbol ) s t a b Source #
Instance details

Defined in Data.Generics.Labels

type Field' name s a = Field name s s a a Source #

class Constructor name s t a b | name s -> a, name t -> b where Source #

Constructor is morally the same as AsConstructor , but it is constructed from an incoherent combination of AsConstructor and AsConstructor' . In this way, it can be seamlessly used in the IsLabel instance even when dealing with data types that don't have Constructor instances (like data instances).

Instances

Instances details
AsConstructor' name s a => Constructor (name :: Symbol ) s s a a Source #
Instance details

Defined in Data.Generics.Labels

AsConstructor name s t a b => Constructor (name :: Symbol ) s t a b Source #
Instance details

Defined in Data.Generics.Labels

type Constructor' name s a = Constructor name s s a a Source #

Orphan instances

(capital ~ BeginsWithCapital name, IsLabelHelper capital name p f s t a b, pafb ~ p a (f b), psft ~ p s (f t)) => IsLabel name (pafb -> psft) Source #
Instance details

Methods

fromLabel :: pafb -> psft Source #