o optics v2.0.0
Docs menu
Concepts Composition

Composition

All optics compose with compose(outer, inner).

import { Lens, compose } from '@fuiste/optics'

const address = Lens<Person>().prop('address')
const city = Lens<Address>().prop('city')

const personCity = compose(address, city)
// Lens<Person, string>

Result Matrix

outer / innerLensPrismIsoTraversalGetterFold
LensLensPrismLensTraversalGetterFold
PrismPrismPrismPrismTraversalFoldFold
IsoLensPrismIsoTraversalGetterFold
TraversalTraversalTraversalTraversalTraversalFoldFold
GetterGetterFoldGetterFoldGetterFold
FoldFoldFoldFoldFoldFoldFold

Rules Of Thumb

  • Fold is contagious.
  • Getter plus partial or multiple focus becomes Fold.
  • Traversal absorbs writable optics into another Traversal.
  • Iso is transparent unless both sides are Iso.
  • Lens plus Lens is still Lens.
  • Anything involving a partial writable path tends toward Prism.

Nested Composition

Composition is binary, so compose longer paths by nesting.

const allEmployeeNames = compose(compose(employees, eachEmployee), name)

Yes, a variadic compose would be cute. No, the type inference gods do not grant wishes for free.