MultiFocus
API façade under the carrier's public name. The instances live in MultiFocusK (the opaque anchor's companion, where implicit scope finds them); this re-export keeps MultiFocus.apply / MultiFocus.fromLensF call-shapes and legacy import data.MultiFocus.given working.
Attributes
- Source
- MultiFocus.scala
- Graph
-
- Supertypes
-
class Objecttrait Matchableclass Any
- Self type
-
MultiFocus.type
Members list
Grouped members
Instances
Optional → MultiFocus[F] — mirror of either2multifocus over the Affine miss / hit split.
Optional → MultiFocus[F] — mirror of either2multifocus over the Affine miss / hit split.
Attributes
- Source
- MultiFocus.scala
Prism → MultiFocus[F] — hit becomes a pure singleton, miss becomes Alternative[F].empty.
Prism → MultiFocus[F] — hit becomes a pure singleton, miss becomes Alternative[F].empty.
Attributes
- Source
- MultiFocus.scala
Forget[F] ↪ MultiFocus[F] — a Fold slots into the pair carrier with X = Unit.
Forget[F] ↪ MultiFocus[F] — a Fold slots into the pair carrier with X = Unit.
Attributes
- Source
- MultiFocus.scala
Iso → MultiFocus[F]. Requires Applicative[F] to broadcast the Iso's plain A focus into a singleton F[A]; the write-back picks the singleton out (throws on cardinality ≠ 1).
Iso → MultiFocus[F]. Requires Applicative[F] to broadcast the Iso's plain A focus into a singleton F[A]; the write-back picks the singleton out (throws on cardinality ≠ 1).
Attributes
- Source
- MultiFocus.scala
Same-carrier composition for MultiFocus[F] — traversal.andThen(traversal), F-parametric. Z = (Xo, F[(Xi, Int)]): the outer leftover plus, per outer focus, the inner leftover and its focus count, so composeFrom can carve the flat modified vector back into per-element slices (cursor over an array snapshot). Inners that mix in MultiFocusSingleton (the Lens bridge) take an always-hit fast path that skips the per-element inner fold. Flat focus order is the outer's traversal order, inner order within each element.
Same-carrier composition for MultiFocus[F] — traversal.andThen(traversal), F-parametric. Z = (Xo, F[(Xi, Int)]): the outer leftover plus, per outer focus, the inner leftover and its focus count, so composeFrom can carve the flat modified vector back into per-element slices (cursor over an array snapshot). Inners that mix in MultiFocusSingleton (the Lens bridge) take an always-hit fast path that skips the per-element inner fold. Flat focus order is the outer's traversal order, inner order within each element.
Attributes
- Source
- MultiFocus.scala
PSVec-specialised same-carrier composition. Where the generic mfAssoc body builds two intermediate List accumulators + materialises via fromList, this body writes directly into IntArrBuilder / ObjArrBuilder and stores the existential as parallel arrays in AssocSndZ, sidestepping the per-element (Xi, Int) Tuple2 the generic path pays. Fast paths for MultiFocusSingleton (always-hit, Lens bridge) and MultiFocusPSMaybeHit (Prism / Optional bridges) inners; reassembly hands each inner an O(1) PSVec.slice view. See docs/research/2026-04-29-powerseries-fold-spike.md.
PSVec-specialised same-carrier composition. Where the generic mfAssoc body builds two intermediate List accumulators + materialises via fromList, this body writes directly into IntArrBuilder / ObjArrBuilder and stores the existential as parallel arrays in AssocSndZ, sidestepping the per-element (Xi, Int) Tuple2 the generic path pays. Fast paths for MultiFocusSingleton (always-hit, Lens bridge) and MultiFocusPSMaybeHit (Prism / Optional bridges) inners; reassembly hands each inner an O(1) PSVec.slice view. See docs/research/2026-04-29-powerseries-fold-spike.md.
Attributes
- Source
- MultiFocus.scala
ForgetfulFold[MultiFocus[F]] via Foldable[F] — folds the focus vector, discarding the leftover. Unlocks .foldMap / .headOption / .length / .exists.
ForgetfulFold[MultiFocus[F]] via Foldable[F] — folds the focus vector, discarding the leftover. Unlocks .foldMap / .headOption / .length / .exists.
Attributes
- Source
- MultiFocus.scala
ForgetfulFunctor[MultiFocus[F]] via Functor[F] — maps every focus, leftover untouched. Unlocks .modify / .replace on Traversal-family optics.
ForgetfulFunctor[MultiFocus[F]] via Functor[F] — maps every focus, leftover untouched. Unlocks .modify / .replace on Traversal-family optics.
Attributes
- Source
- MultiFocus.scala
ForgetfulTraverse[MultiFocus[F], Applicative] via Traverse[F] — effectful rewrite of every focus in F's traversal order. Unlocks .modifyA / .all.
ForgetfulTraverse[MultiFocus[F], Applicative] via Traverse[F] — effectful rewrite of every focus in F's traversal order. Unlocks .modifyA / .all.
Attributes
- Source
- MultiFocus.scala
MultiFocus[F] ↪ Forget[F] — read-only escape: discard the structural leftover, keep the focused F[A]. An explicit carrier morph alongside the carrier-wide Optic.foldMap / .headOption / .length / .exists extension methods.
MultiFocus[F] ↪ Forget[F] — read-only escape: discard the structural leftover, keep the focused F[A]. An explicit carrier morph alongside the carrier-wide Optic.foldMap / .headOption / .length / .exists extension methods.
Structurally this is the inverse of forget2multifocus — both Composer directions ship. That's normally banned by the cats-eo Morph resolution invariant (a bidirectional pair makes Morph[Forget[F], MultiFocus[F]] ambiguous because both leftToRight and rightToLeft fire). The Composer ships anyway because:
- The
fromside requiresT = Unit(Forget loses the leftover, so it can't reconstruct a T ≠ Unit). Only T-UnitMultiFocus optics qualify, which the type system enforces at use sites. - Any chain-resolution ambiguity surfaces at
forget.andThen(multifocus)/multifocus.andThen(fold)call sites — the user resolves by routing through the explicitComposer[..].to(o)form rather than.andThen.
Practical Morph fallout: if a user actually hits the ambiguity, they get a clear implicit-not- found message naming both Composers; the workaround is one extra .morph-shaped call.
Attributes
- Source
- MultiFocus.scala
MultiFocus[F] → ModifyF. Uniform Modify widening for any Functor[F].
MultiFocus[F] → ModifyF. Uniform Modify widening for any Functor[F].
Attributes
- Source
- MultiFocus.scala
Lens → MultiFocus[F]. Mixes in MultiFocusSingleton so the mfAssoc fast-path fires.
Lens → MultiFocus[F]. Mixes in MultiFocusSingleton so the mfAssoc fast-path fires.
Attributes
- Source
- MultiFocus.scala
Constructors
Generic factory: X = F[A], focus = fa, rebuild = identity.
Reinterpret a Lens whose focus is already an F[A] as a MultiFocus optic over the elements — the container the Lens reads IS the focus vector; X and the rebuild pass straight through.
Reinterpret a Lens whose focus is already an F[A] as a MultiFocus optic over the elements — the container the Lens reads IS the focus vector; X and the rebuild pass straight through.
Attributes
- Source
- MultiFocus.scala
Polymorphic counterpart to apply — allows focus type change (F[A] => F[B]), the Traversal.pEach analogue at the generic factory. Sound for the same reason: the rebuild is identity on the written-back F[B], so no B ever has to fit an A-shaped hole. This is what un-pins the collect flavours' element type — pApply[F, A, Row].collectWith(...) emits a different row type than it read.
Polymorphic counterpart to apply — allows focus type change (F[A] => F[B]), the Traversal.pEach analogue at the generic factory. Sound for the same reason: the rebuild is identity on the written-back F[B], so no B ever has to fit an A-shaped hole. This is what un-pins the collect flavours' element type — pApply[F, A, Row].collectWith(...) emits a different row type than it read.
Attributes
- Source
- MultiFocus.scala
Value members
Concrete methods
Pair a leftover x with a focus vector fa as the carrier value. Identity at runtime (the opaque type erases to the pair); the unwrap boundary is MultiFocusK.context / MultiFocusK.foci.
Pair a leftover x with a focus vector fa as the carrier value. Identity at runtime (the opaque type erases to the pair); the unwrap boundary is MultiFocusK.context / MultiFocusK.foci.
Attributes
- Source
- MultiFocus.scala
Exports
Defined exports
Attributes
- Source
- MultiFocus.scala
Attributes
- Source
- MultiFocus.scala
Attributes
- Source
- MultiFocus.scala
Attributes
- Source
- MultiFocus.scala