Optics

optics/lens

Lens is an optic used to zoom inside a product.

import "github.com/IBM/fp-go/optics/lens"

Lens is an optic used to zoom inside a product.

Functions

func Compose[S, A, B any](ab Lens[A, B]) func(Lens[S, A]) Lens[S, B]

Compose combines two lenses and allows to narrow down the focus to a sub-lens

func ComposeOption[S, B, A any](defaultA A) func(ab Lens[A, B]) func(Lens[S, O.Option[A]]) Lens[S, O.Option[B]]

ComposeOption combines a Lens that returns an optional value with a Lens that returns a definite value the getter returns an Option[B] because the container A could already be an option if the setter is invoked with Some[B] then the value of B will be set, potentially on a default value of A if A did not exist if the setter is invoked with None[B] then the container A is reset to None[A] because this is the only way to remove B

func ComposeOptions[S, B, A any](defaultA A) func(ab Lens[A, O.Option[B]]) func(Lens[S, O.Option[A]]) Lens[S, O.Option[B]]

ComposeOptions combines a Lens that returns an optional value with a Lens that returns another optional value the getter returns None[B] if either A or B is None if the setter is called with Some[B] and A exists, 'A' is updated with B if the setter is called with Some[B] and A does not exist, the default of 'A' is updated with B if the setter is called with None[B] and A does not exist this is the identity operation on 'S' if the setter is called with None[B] and A does exist, 'B' is removed from 'A'

func ComposeRef[S, A, B any](ab Lens[A, B]) func(Lens[*S, A]) Lens[*S, B]

Compose combines two lenses and allows to narrow down the focus to a sub-lens

func FromNillable[S, A any](sa Lens[S, *A]) Lens[S, O.Option[*A]]

FromPredicate returns a Lens for a property accessibly as a getter and setter that can be optional if the optional value is set then the nil value will be set instead

func FromNillableRef[S, A any](sa Lens[*S, *A]) Lens[*S, O.Option[*A]]

FromNillableRef returns a Lens for a property accessibly as a getter and setter that can be optional if the optional value is set then the nil value will be set instead

func FromNullableProp[S, A any](isNullable func(A) O.Option[A], defaultValue A) func(sa Lens[S, A]) Lens[S, A]

FromNullableProp returns a Lens from a property that may be optional. The getter returns a default value for these items

func FromNullablePropRef[S, A any](isNullable func(A) O.Option[A], defaultValue A) func(sa Lens[*S, A]) Lens[*S, A]

FromNullablePropRef returns a Lens from a property that may be optional. The getter returns a default value for these items

func FromOption[S, A any](defaultValue A) func(sa Lens[S, O.Option[A]]) Lens[S, A]

FromFromOption returns a Lens from an option property. The getter returns a default value the setter will always set the some option

func FromOptionRef[S, A any](defaultValue A) func(sa Lens[*S, O.Option[A]]) Lens[*S, A]

FromFromOptionRef returns a Lens from an option property. The getter returns a default value the setter will always set the some option

func FromPredicate[S, A any](pred func(A) bool, nilValue A) func(sa Lens[S, A]) Lens[S, O.Option[A]]

FromPredicate returns a Lens for a property accessibly as a getter and setter that can be optional if the optional value is set then the nil value will be set instead

func FromPredicateRef[S, A any](pred func(A) bool, nilValue A) func(sa Lens[*S, A]) Lens[*S, O.Option[A]]

FromPredicateRef returns a Lens for a property accessibly as a getter and setter that can be optional if the optional value is set then the nil value will be set instead

func IMap[E any, AB ~func(A) B, BA ~func(B) A, A, B any](ab AB, ba BA) func(Lens[E, A]) Lens[E, B]

func Id[S any]() Lens[S, S]

Id returns a [Lens] implementing the identity operation

func IdRef[S any]() Lens[*S, *S]

IdRef returns a [Lens] implementing the identity operation

func MakeLens[GET ~func(S) A, SET ~func(S, A) S, S, A any](get GET, set SET) Lens[S, A]

MakeLens creates a [Lens] based on a getter and a setter function. Make sure that the setter creates a (shallow) copy of the data. This happens automatically if the data is passed by value. For pointers consider to use MakeLensRef and for other kinds of data structures that are copied by reference make sure the setter creates the copy.

func MakeLensCurried[GET ~func(S) A, SET ~func(A) EM.Endomorphism[S], S, A any](get GET, set SET) Lens[S, A]

MakeLensCurried creates a [Lens] based on a getter and a setter function. Make sure that the setter creates a (shallow) copy of the data. This happens automatically if the data is passed by value. For pointers consider to use MakeLensRef and for other kinds of data structures that are copied by reference make sure the setter creates the copy.

func MakeLensRef[GET ~func(*S) A, SET func(*S, A) *S, S, A any](get GET, set SET) Lens[*S, A]

MakeLensRef creates a [Lens] based on a getter and a setter function. The setter passed in does not have to create a shallow copy, the implementation wraps the setter into one that copies the pointer before modifying it

Such a [Lens] assumes that property A of S always exists

func MakeLensRefCurried[S, A any](get func(*S) A, set func(A) EM.Endomorphism[*S]) Lens[*S, A]

MakeLensRefCurried creates a [Lens] based on a getter and a setter function. The setter passed in does not have to create a shallow copy, the implementation wraps the setter into one that copies the pointer before modifying it

Such a [Lens] assumes that property A of S always exists

func Modify[S any, FCT ~func(A) A, A any](f FCT) func(Lens[S, A]) EM.Endomorphism[S]

Modify changes a property of a [Lens] by invoking a transformation function if the transformed property has not changes, the method returns the original state

Types

type Lens

Lens is a reference to a subpart of a data type

type Lens[S, A any] struct {
	Get func(s S) A
	Set func(a A) EM.Endomorphism[S]
}
Fields
  • Get func(s S) A
  • Set func(a A) EM.Endomorphism[S]