generic-lens-2.2.2.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.Product.Positions

Contents

- Lenses

Description

Derive positional product type getters and setters generically.

Synopsis

- class HasPosition (i :: Nat) s t a b | s i -> a, t i -> b, s i b -> t, t i a -> s where
  - position :: Lens s t a b
- class HasPosition' (i :: Nat) s a | s i -> a where
  - position' :: Lens s s a a
- class HasPosition_ (i :: Nat) s t a b where
  - position_ :: Lens s t a b
- class HasPosition0 (i :: Nat) s t a b where
  - position0 :: Lens s t a b
- getPosition :: forall (i :: Nat) s a. HasPosition' i s a => s -> a
- setPosition :: forall (i :: Nat) s a. HasPosition' i s a => a -> s -> s

# Lenses

## Running example:

    >>> :set -XTypeApplications
    >>> :set -XDataKinds
    >>> :set -XDeriveGeneric
    >>> :set -XGADTs
    >>> :set -XFlexibleContexts
    >>> import GHC.Generics
    >>> :m +Data.Generics.Internal.VL.Lens
    >>> :m +Data.Function
    >>> :{
    data Human = Human
      { name    :: String
      , age     :: Int
      , address :: String
      }
      deriving (Generic, Show)
    human :: Human
    human = Human "Tunyasz" 50 "London"
    :}

class HasPosition (i :: Nat) s t a b | s i -> a, t i -> b, s i b -> t, t i a -> s where Source #

Records that have a field at a given position.

Methods

position :: Lens s t a b Source #

A lens that focuses on a field at a given position. Compatible with the lens package's `Lens` type.

    >>> human ^. position @1
    "Tunyasz"
    >>> human & position @3 .~ "Berlin"
    Human {name = "Tunyasz", age = 50, address = "Berlin"}

### Type errors

    >>> human & position @4 .~ "Berlin"
    ...
    ... The type Human does not contain a field at position 4
    ...

#### Instances

Instances details

(Context i s t a b, HasPosition0 i s t a b) => HasPosition i s t a b Source # |
Instance details Defined in Data.Generics.Product.Positions Methods position :: Lens s t a b Source #

HasPosition f (Void1 a) (Void1 b) a b Source #

Uncluttering type signatures (see `Void`)

    >>> :t +d position
    position
      :: (HasPosition i s t a b, Functor f) => (a -> f b) -> s -> f t

Instance details Defined in Data.Generics.Product.Positions Methods position :: Lens (Void1 a) (Void1 b) a b Source #

class HasPosition' (i :: Nat) s a | s i -> a where Source #

Records that have a field at a given position.

The difference between `HasPosition` and `HasPosition_` is similar to the one between `HasField` and `HasField_`. See `HasField_`.

Methods

position' :: Lens s s a a Source #

#### Instances

Instances details

Context' i s a => HasPosition' i s a Source # |
Instance details Defined in Data.Generics.Product.Positions Methods position' :: Lens s s a a Source #

class HasPosition_ (i :: Nat) s t a b where Source #

Methods

position_ :: Lens s t a b Source #

#### Instances

Instances details

(Context_ i s t a b, HasPosition0 i s t a b) => HasPosition_ i s t a b Source # |
Instance details Defined in Data.Generics.Product.Positions Methods position_ :: Lens s t a b Source #
HasPosition_ f (Void1 a) (Void1 b) a b Source # |
Instance details Defined in Data.Generics.Product.Positions Methods position_ :: Lens (Void1 a) (Void1 b) a b Source #

class HasPosition0 (i :: Nat) s t a b where Source #

Records that have a field at a given position.

This class gives the minimal constraints needed to define this lens. For common uses, see `HasPosition`.

Methods

position0 :: Lens s t a b Source #

#### Instances

Instances details

Context0 i s t a b => HasPosition0 i s t a b Source # |
Instance details Defined in Data.Generics.Product.Positions Methods position0 :: Lens s t a b Source #

getPosition :: forall (i :: Nat) s a. HasPosition' i s a => s -> a Source #

    >>> getPosition @2 human
    50

setPosition :: forall (i :: Nat) s a. HasPosition' i s a => a -> s -> s Source #

    >>> setPosition @2 60 human
    Human {name = "Tunyasz", age = 60, address = "London"}