S
- The input object type.T
- The output object type.A
- The input field type.B
- The output field type.public interface Lens<S,T,A,B> extends Optic<Cartesian _,S::A,T::B>
A
from the input object type S
and
to combine the input S
and the transformed field type B
into the output object type T
.
The canonical example for using a lens is to extract and update a field of a struct
type, using the
C meaning of struct
.
In order to be a lawful lens, the implementations of view(Object)
and update(Object, Object)
must satisfy certain requirements. Assume that the object types S
and T
are implicitly convertible
between each other and that the field types A
and B
are similarly convertible. Then the following
rules must hold (==
here represents logical equality and not reference equality).
update(b2, update(b1, s)) == update(b2, s)
- Updating twice is equivalent to updating once.
view(update(b, s)) == b
- Viewing after an update yields the value used to update.
update(view(s), s) == s
- Updating with a viewed value yields the original object.
Lenses that are not lawful are said to be either neutral or chaotic, depending on the degree to which the lens laws are broken.
Modifier and Type | Interface and Description |
---|---|
static class |
Lens.Instance<A2,B2>
|
Modifier and Type | Method and Description |
---|---|
default <P extends K2> |
eval(Cartesian P proofBox)
Evaluates this lens to produce a function that, when given a transformation between field types, produces
a transformation between object types.
|
T |
update(B b,
S s)
Combines a value of the output field type with a value of the input object type to produce a combined value
of the output object type.
|
A |
view(S s)
Extracts a value of the input field type from the input object type.
|
compose, composeUnchecked, upCast
A view(S s)
This method is analogous to a "getter" in traditional object-oriented programming.
update(Object, Object)
, satisfy the lens laws
in order for this lens to be a lawful lens.s
- A value of the input object type.T update(B b, S s)
This method is analogous to a "setter" in traditional object-oriented programming. Note that the given
field b
does not necessarily have to correspond with the straightforward transformation from the
input object to the output object.
view(Object)
, satisfy the lens laws in order
for this lens to be a lawful lens.b
- A value of the output field type with which to update the output object.s
- A value of the input object type to be converted to a value of the output object type.default <P extends K2> (P<A,B>) -> P<S,T> eval(Cartesian P proofBox)
eval
in interface Optic<Cartesian _,S::A,T::B>
P
- The type of transformation.proofBox
- The Cartesian
type class instance for the transformation type.Lens.Instance