lens-5.2.3: Lenses, Folds and Traversals

Copyright | (C) 2012-16 Edward Kmett
License | BSD-style (see the file LICENSE)
Maintainer | Edward Kmett <ekmett@gmail.com>
Stability | provisional
Portability | Rank2Types
Safe Haskell | Trustworthy
Language | Haskell2010

Control.Lens.Unsound

Description

One commonly asked question is: can we combine two lenses, ``Lens'` a b` and ``Lens'` a c` into ``Lens'` a (b, c)`. This is fair thing to ask, but such operation is unsound in general. See `lensProduct`.

Synopsis

- lensProduct :: ALens' s a -> ALens' s b -> Lens' s (a, b)
- prismSum :: APrism s t a b -> APrism s t c d -> Prism s t (Either a c) (Either b d)
- adjoin :: Traversal' s a -> Traversal' s a -> Traversal' s a

# Documentation

lensProduct :: ALens' s a -> ALens' s b -> Lens' s (a, b) #

A lens product. There is no law-abiding way to do this in general. Result is only a valid `Lens` if the input lenses project disjoint parts of the structure `s`. Otherwise "you get what you put in" law

    view l (set l v s) ≡ v

is violated by

    >>> let badLens :: Lens' (Int, Char) (Int, Int); badLens = lensProduct _1 _1
    >>> view badLens (set badLens (1,2) (3,'x'))
    (2,2)

but we should get `(1,2)`.

Are you looking for `alongside`?

prismSum :: APrism s t a b -> APrism s t c d -> Prism s t (Either a c) (Either b d) #

A dual of `lensProduct`: a prism sum.

The law

    preview l (review l b) ≡ Just b

breaks with

    >>> let badPrism :: Prism' (Maybe Char) (Either Char Char); badPrism = prismSum _Just _Just
    >>> preview badPrism (review badPrism (Right 'x'))
    Just (Left 'x')

We put in `Right` value, but get back `Left`.

Are you looking for `without`?

adjoin :: Traversal' s a -> Traversal' s a -> Traversal' s a #

A generalization of `mappend`ing folds: A union of disjoint traversals.

Traversing the same entry twice is illegal.

Are you looking for `failing`?