From bd70359d2fa4088bed0e296315d245f6c8c7d53d Mon Sep 17 00:00:00 2001 From: Rodolfo Hansen Date: Wed, 30 Sep 2026 21:29:43 +0200 Subject: [PATCH 1/4] feat(core): express grate constancy in the bundle, on top of #127 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rebased onto `52671355` (the optic-class answer: `Z = Xo`, `Function1BroadcastOptic`, `RepresentativeIndex`, the positional write). That commit and this one answer different questions, and this rebase keeps upstream's machinery — and upstream's *idiom* — wherever it is better: - **kept** `Function1BroadcastOptic` as the kernel's per-index write hook (one value per position, no bundle read it did not build) and the bridge's `RepresentativeIndex[X0]` witness; - **added** the sum: the focus half is `F[A] | Broadcast[F, A]` (both cases `private[eo]`), with `MultiFocus.broadcast` / `.broadcast` as the public handles and `.foci` total for both (the index-free case carries its `F[A]` image); - **added** the kernel's remaining cases: a composite inner is written per position with the leftover *its own* read produced (upstream forges it, so a `fromLensF` inner NPEs), and a tabulating ∘ tabulating composite writes the exact inverse of its diagonal read. That last one needs `C =:= D`, which is a property of the *optic* — so it rides on the optic as `Optic.SameFocus` (mixed into every `andThen` composite from the call site's `summonFrom`, and into the monomorphic factories `representable` / `tuple` / `apply` with `Some(…)`), and the kernel reads it off the `inner` it is already handed. `AssociativeFunctor` and the composition algebra are untouched (zero diff vs upstream). - **deleted `unobserved`** — no write needs a stand-in any more. Its three historical sites are fixed at the source: the kernel records the inner leftovers its read observed, the bridge takes a real index witness, and the shape-collapsing `collectList` now hands the write the leftover its own read produced (`o.from((bundle.context, List(agg(bundle.foci))))`), which fixes a live NPE / `MatchError` on Lens / Prism / Optional provenances (probed before the fix). New coverage: `tests/.../MultiFocusCrossFamilySpec.scala` is the runtime twin of `CompositionMatrixSpec` — nine property blocks over every inbound provenance (generic factory, polymorphic factory, Iso/Lens/Prism/Optional bridges, a composite of two shipped optics) through `modify` / `replace` / `collectMap` / `collectWith` / `collectList` / `foldMap` / `headOption` / `length`, plus both composition directions across Iso / Lens / Prism / Optional with independently computed expectations. The collapsing aggregate is asserted only where the optic's leftover is count-agnostic; a composite's is the one named boundary (see the note). Measured against `52671355` (throwaway printing spec, removed again): `tuple ∘ tuple.modify(identity)` on `((1,2),(3,4))` → `((1,4),(1,4))` there, identity here; `replace(9)` → `((9,9),(9,9))` there, `((9,2),(3,9))` here; `tuple ∘ (shim ∘ shim).modify(_+1)` on `(1,2)` → `(2,2)` there, `(2,3)` here; a `fromLensF` inner NPEs there; `collectList` NPEs / MatchErrors there and works here. Upstream's own `MultiFocusFunction1Spec` is kept verbatim (14 examples / 349 expectations) and passes against this kernel; this branch's core `MultiFocusFunction1CompositionSpec` adds 13 blocks / 1003 expectations and `external/EoOpaqueSurfaceSpec` pins the public surface from outside the `eo` package tree. Gates (sbt 1.13.0, JDK 25): root `test` 237 examples / 0 failures, `scalafmtCheckAll`, `scalafixAll --check`, `scalafmtSbtCheck`, `benchmarks/scalafmtCheck`, `mimaReportBinaryIssues`, `githubWorkflowCheck`, `docs/mdoc` 0 errors, `docs/laikaSite`, `core/doc`. --- .../circe/CrossCarrierCompositionSpec.scala | 2 +- .../dev/constructive/eo/data/MultiFocus.scala | 646 ++++++++++++------ .../dev/constructive/eo/optics/Optic.scala | 43 +- .../constructive/eo/optics/Traversal.scala | 6 +- .../eo/optics/TraversalArityMacro.scala | 4 +- .../MultiFocusFunction1CompositionSpec.scala | 403 +++++++++++ .../scala/external/EoOpaqueSurfaceSpec.scala | 29 + .../2026-09-30-grate-broadcast-constancy.md | 443 ++++++++++++ .../eo/jsoniter/JsoniterTraversal.scala | 6 +- site/docs/concepts.md | 6 +- site/docs/multifocus.md | 137 +++- site/docs/optics.md | 9 +- .../eo/MultiFocusCrossFamilySpec.scala | 308 +++++++++ .../constructive/eo/OpticsBehaviorSpec.scala | 4 +- 14 files changed, 1774 insertions(+), 272 deletions(-) create mode 100644 core/src/test/scala/dev/constructive/eo/MultiFocusFunction1CompositionSpec.scala create mode 100644 core/src/test/scala/external/EoOpaqueSurfaceSpec.scala create mode 100644 docs/research/2026-09-30-grate-broadcast-constancy.md create mode 100644 tests/src/test/scala/dev/constructive/eo/MultiFocusCrossFamilySpec.scala diff --git a/circe/src/test/scala/dev/constructive/eo/circe/CrossCarrierCompositionSpec.scala b/circe/src/test/scala/dev/constructive/eo/circe/CrossCarrierCompositionSpec.scala index d1f85b39..4da4172d 100644 --- a/circe/src/test/scala/dev/constructive/eo/circe/CrossCarrierCompositionSpec.scala +++ b/circe/src/test/scala/dev/constructive/eo/circe/CrossCarrierCompositionSpec.scala @@ -196,7 +196,7 @@ class CrossCarrierCompositionSpec extends Specification: new Optic[List[Int], List[Int], List[Int], List[Int], MultiFocus[List]]: type X = Unit def to(xs: List[Int]): MultiFocus[List][X, List[Int]] = MultiFocus((), List(xs)) - def from(pair: MultiFocus[List][X, List[Int]]): List[Int] = pair.foci.head + def from(mf: MultiFocus[List][X, List[Int]]): List[Int] = mf.foci.head // The cross-carrier .andThen resolves through `either2multifocus[List]`. val chain: Optic[Json, Json, List[Int], List[Int], MultiFocus[List]] = diff --git a/core/src/main/scala/dev/constructive/eo/data/MultiFocus.scala b/core/src/main/scala/dev/constructive/eo/data/MultiFocus.scala index 0302f9bd..23a119b1 100644 --- a/core/src/main/scala/dev/constructive/eo/data/MultiFocus.scala +++ b/core/src/main/scala/dev/constructive/eo/data/MultiFocus.scala @@ -11,9 +11,25 @@ import compose.* import optics.Optic /** Unified pair carrier for the algebraic-lens, kaleidoscope, and grate optic families — - * `MultiFocus[F][X, A] = (X, F[A])`: a structural leftover `X` paired with a focus collection / - * aggregate / rebuild-closure `F[A]`. One carrier serves all three families; only the choice of - * `F` differs (a container for Traversal, `Function1`-shaped for the grate encoding, …). + * `MultiFocus[F][X, A] = (X, Focus[F, A])`: a structural leftover `X` paired with a focus half. + * One carrier serves all three families; only the choice of `F` differs (a container for + * Traversal, `Function1`-shaped for the grate encoding, …). + * + * The focus half is a *sum*, because two shapes of optic share this carrier and the difference is + * not derivable from `F`: + * + * - [[MultiFocusK.Broadcast]] — an index-independent focus: one value `a`, known without + * consulting an index (`X0`-shaped carriers), plus the same value presented as the carrier's + * own `F[A]`. Written by `forgetful2multifocusFunction1` (the Iso shim), by + * `MultiFocus.broadcast`, and by every composition whose write collapsed to a single value. + * - `F[A]` itself — a genuine tabulation / focus vector: reading a position means reading this. + * Written by every other factory (`representable`, `tuple`, `apply`, …). + * + * Keeping the sum *inside* the carrier (rather than in an optic-level class) makes constancy a + * property of the *data*, so it survives `map` / `collectWith` / `andThen` — the kernels read it + * instead of inventing an index when a value is needed "at whatever position". + * [[MultiFocusK.foci]] stays total by carrying the lifted `F[A]` in the broadcast case, so every + * consumer that only wants "the focus vector" is unchanged. * * The kaleidoscope aggregation ("summarise the foci, write the summary back") has two natural * derivations, and the choice is structural — not derivable from a single typeclass: @@ -43,7 +59,7 @@ import optics.Optic // alias: an opaque type cannot have the curried `[F[_]] => [X, A] =>> …` shape.) Within this file // the opaque is transparent; outside, `MultiFocus.apply` / [[MultiFocusK.context]] / // [[MultiFocusK.foci]] are the (runtime-identity) boundary. -opaque type MultiFocusK[F[_], X, A] = (X, F[A]) +opaque type MultiFocusK[F[_], X, A] = (X, MultiFocusK.Focus[F, A]) /** Curried carrier view of [[MultiFocusK]] — the `F[_, _]` shape `Optic` expects. */ type MultiFocus[F[_]] = [X, A] =>> MultiFocusK[F, X, A] @@ -67,78 +83,6 @@ private[eo] trait MultiFocusSingleton[S, T, A, B, X0]: ysBuf.unsafeAppend(x) flatBuf.unsafeAppend(a) -/** Stand-in for a value of a type that the `Function1` kernel never lets anyone observe. Two call - * sites need one, and both stand in for an **existential leftover the write path discards** rather - * than for something anyone could have computed: - * - * - the **inner optic's leftover** in `mfAssocFunction1` — the kernel threads the OUTER's - * leftover through `Z`, so the inner's has no producer on the write path; every shipped - * `MultiFocus[Function1]` optic ignores its leftover on the write side, which is what makes - * that direction bundle-level. - * - the **optic's own leftover** in `collectList` — the aggregation builds a fresh singleton - * `List(b)` and never sees the leftover it discards. - * - * Neither is an **index**: an index into a broadcast bundle is now a real value, supplied by - * [[RepresentativeIndex]] and stored on [[Function1BroadcastOptic]], because that read *is* - * observable and the index has to come from somewhere. What is left here is per-position data - * whose only producer is the read side — an index witness cannot stand in for it, and neither can - * any single value, since a leftover may differ at every index. - * - * `inline` is load-bearing: `null.asInstanceOf[Int]` is `0` at a call site with a primitive - * leftover type, while a non-inlined generic method would box and unbox the `null` into an NPE. - * The invariant is "unobserved", not "unobservable" — if a future F1 optic observes its own - * leftover on `from`, this is the line to revisit (see - * `docs/research/2026-04-23-code-quality-review.md`, finding 4). - */ -private[eo] inline def unobserved[A]: A = null.asInstanceOf[A] - -/** The `Direct → MultiFocus[Function1[X0, *]]` bridge's product — a constant-broadcast optic whose - * bundle is one focus, broadcast to every index ([[MultiFocusK.forgetful2multifocusFunction1]]). - * - * The type is itself the witness `mfAssocFunction1` matches on, because the carrier alone cannot - * say how a write bundle should be read. THIS optic has exactly one value to build, so a bundle - * has to be sampled position by position to stay positional — while a *bundle* carrier (e.g. - * `MultiFocus.apply` as the inner) consumes the whole bundle once. - * - * Only the write half needs a hook for that. The read half does not: `to` broadcasts the single - * focus across the whole index space, so the kernel can simply read the bundle at the index it - * wants. [[broadcastFrom]] exists because the write direction has no such trick — one value in, - * one value out can only be expressed per index. - * - * The `at` index is the same story from the other side: this optic's own `from` must read a bundle - * it did not build, so it is given a real index at construction ([[RepresentativeIndex]]) rather - * than inventing one. `at` is read there and nowhere else. - * - * A `final class` storing the source optic directly — NOT an abstract member pair — for the same - * composed-dispatch reason documented on [[optics.Getter]] / [[optics.Review]]. - */ -final private[eo] class Function1BroadcastOptic[S, T, A, B, X0]( - o: Optic[S, T, A, B, Direct], - at: X0, -) extends Optic[S, T, A, B, MultiFocus[Function1[X0, *]]]: - // `Unit`: a broadcast read has no leftover to hand the rebuild — the new focus travels in the - // bundle (the carrier's second component), and there is no miss to pass through. `Nothing` (the - // `Getter` / `Review` / `Unfold` choice) is unavailable: `from` must really build a `T`. - type X = Unit - - /** Build the target from a single written focus — the write half of the broadcast, one value per - * position. The kernel's per-index write path. - */ - def broadcastFrom(b: B): T = o.from(Direct(b)) - - def to(s: S): MultiFocus[Function1[X0, *]][X, A] = MultiFocus((), (_: X0) => o.to(s).value) - - /** '''Constant-bundle contract.''' `at` is correct because every bundle that reaches this method - * on a shipped path is constant: `modify` / `replace` / `collect*` map this optic's own - * broadcast, and `mfAssocFunction1`'s bundle branch hands a `.from` its rebuild as a constant - * function. The kernel does NOT come through here at all — `mfAssocFunction1` recognises the - * product and writes per index through [[broadcastFrom]]. Given a *varying* bundle by hand, this - * reads position `at` — a defined answer, not a forged one, and the caller's to choose through - * [[RepresentativeIndex]]. - */ - def from(fb: MultiFocus[Function1[X0, *]][X, B]): T = - broadcastFrom(MultiFocusK.foci(fb)(at)) - /** Per-F O(n) builder. Carried as a typeclass because `MonoidK[F].combineK` has inconsistent * asymptotics across F (O(n²) on Vector, lossy on Option), so deriving `fromList` from * `Traverse[F] + MonoidK[F]` is asymptotically wrong on the carriers we care about. @@ -223,16 +167,135 @@ private[eo] trait MultiFocusPSMaybeHit[S, T, A, B]: * `.collect*` / `.at` aggregation surface. Being the opaque anchor's companion, everything here is * in implicit scope with no import; the public call-shape is the [[MultiFocus]] façade. */ +/** The `Direct → MultiFocus[Function1[X0, *]]` bridge's product — a constant-broadcast optic whose + * bundle is one focus, broadcast to every index ([[MultiFocusK.forgetful2multifocusFunction1]]). + * + * The type is itself a witness [[MultiFocusK.mfAssocFunction1]] matches on: a broadcast optic + * builds exactly ONE value, so the kernel composes its write per index through [[broadcastFrom]] — + * handing it a per-position bundle through `from` would sample one index and rebuild every + * position from that single value. That is what makes `grate ∘ iso` rewrite every position. (The + * carrier's sum says which *bundles* are index-free; this class says which *optics* write one + * value, and the two agree wherever they overlap.) + * + * Its own `from` is the one place the library reads a bundle it did not build: an index-free + * bundle is read outright ([[MultiFocusK.broadcast]]), and a tabulating one is read at the real + * index the bridge was handed through [[RepresentativeIndex]] — a defined answer, never a forged + * sentinel. + */ +final private[eo] class Function1BroadcastOptic[S, T, A, B, X0]( + o: Optic[S, T, A, B, Direct], + at: X0, +) extends Optic[S, T, A, B, MultiFocus[Function1[X0, *]]]: + // `Unit`: a broadcast read has no leftover to hand the rebuild — the new focus travels in the + // bundle (the carrier's second component), and there is no miss to pass through. `Nothing` (the + // `Getter` / `Review` / `Unfold` choice) is unavailable: `from` must really build a `T`. + type X = Unit + + /** Build the target from a single written focus — the write half of the broadcast, one value per + * position. The kernel's per-index write path. + */ + def broadcastFrom(b: B): T = o.from(Direct(b)) + + // The index-free half: one value, known without consulting an index, so the read side of the + // kernel reuses it verbatim (`inner.to(value)`) and no consumer has to sample anything. + def to(s: S): MultiFocus[Function1[X0, *]][X, A] = + MultiFocusK.broadcast[X0, Unit, A]((), o.to(s).value) + + /** '''Constant-bundle contract.''' `at` is correct because every bundle that reaches this method + * on a shipped path is constant or index-free: `modify` / `replace` / `collect*` map this + * optic's own broadcast, the kernel's bundle branch hands a `.from` its rebuild as an index-free + * half, and the kernel writes per index through [[broadcastFrom]] rather than coming through + * here at all. Given a *varying* bundle by hand, this reads position `at` — a defined answer, + * not a forged one, and the caller's to choose through [[RepresentativeIndex]]. + */ + def from(fb: MultiFocus[Function1[X0, *]][X, B]): T = + broadcastFrom(MultiFocusK.readAt(MultiFocusK.chunkOf(fb), at)) + object MultiFocusK: + /** The focus half of a [[MultiFocusK]] bundle — the sum the carrier is built on. Implementation + * detail: unreachable from user code, so the only way to *observe* an index-free bundle is + * [[broadcast]] and the only way to build one is [[MultiFocus.broadcast]]. + * + * - `F[A]` is a genuine tabulation (or focus vector): reading position `i` means reading it. + * - the broadcast half is one value, the focus at *every* index, known without consulting one. + * + * Both cases are `F[A]`-shaped through [[foci]], so the sum is invisible to consumers who only + * want the focus vector; consumers that would otherwise have to invent an index (the + * `Function1`-shaped composition kernel, the Iso shim's `from`) branch on it instead. + */ + private[eo] type Focus[F[_], A] = F[A] | Broadcast[F, A] + + /** Index-independent focus half: `value` is the focus at every index, and `lifted` is that same + * value presented as the carrier's own `F[A]` (for the `Function1`-shaped carrier, the constant + * function `_ => value`) so [[foci]] stays total with no `Pointed`-shaped constraint. + * + * Built by [[MultiFocus.broadcast]], by a broadcast optic's `to`, and by every composition whose + * write collapsed to a single value. `value` and `lifted` are kept in agreement by construction + * — every producer builds both from one value — and `map` keeps them together up to the purity + * of the mapping function (`Functor[F].map` on the lifted form, `f` on the value), which is the + * same assumption every optic law in this library makes. + * + * `private[eo]` on purpose: the carrier classifies a half by testing for this class, so a value + * of it must never be able to *be* somebody's `F[A]` (a user focus whose type happens to be + * `Broadcast`, or `Any`, would otherwise be mis-read as a broadcast half). + */ + final private[eo] class Broadcast[F[_], A](val value: A, val lifted: F[A]) + + /** The grate-shaped carrier as a plain type constructor: `MultiFocus[Function1[X0, *]]`. Spelled + * without the type lambda where a signature has to match an eta-expanded carrier (an override of + * a member generic in `F`), and handy for writing one's own `Function1`-carried optics. + */ + type Function1Carrier[X0] = [X, A] =>> MultiFocusK[Function1[X0, *], X, A] + // Construct via the façade `MultiFocus(x, fa)` (an `apply` on the public object below); these - // are the unwrap boundary. Both are identity at runtime (the opaque erases to the pair). + // are the unwrap boundary. `context` is identity at runtime; `foci` is identity for a tabulation + // and one field read for a broadcast. extension [F[_], X, A](self: MultiFocusK[F, X, A]) /** The structural leftover. Identity at runtime. */ transparent inline def context: X = self._1 - /** The focus vector. Identity at runtime. */ - transparent inline def foci: F[A] = self._2 + /** The focus vector — the carrier's own `F[A]` view of the focus half. Identity at runtime for + * a tabulation; for a [[Broadcast]] it returns the index-free value's lifted `F[A]`, so every + * consumer keeps working without an index. + */ + transparent inline def foci: F[A] = + self._2 match + case b: Broadcast[F, A] @unchecked => b.lifted + case f: F[A] @unchecked => f + + /** The index-independent focus value, when this bundle has one: `Some(a)` for a [[Broadcast]] + * bundle, `None` for a genuine tabulation. The accessor that makes constancy *observable* — + * callers that need "the focus, whichever index" can ask here instead of inventing one. + */ + transparent inline def broadcast: Option[A] = + self._2 match + case b: Broadcast[F, A] @unchecked => Some(b.value) + case _ => None + + /** The raw focus half — the un-lifted sum, for kernels that must branch on the *shape* rather + * than read the value. In-file only: outside this file the sum is reached through [[foci]] / + * [[broadcast]]. + */ + private[eo] inline def chunkOf[F[_], X, A](mf: MultiFocusK[F, X, A]): Focus[F, A] = mf._2 + + /** Read a `Function1`-shaped bundle at `i` — the one read that never needs an index when the + * bundle is a [[Broadcast]]. + */ + private[eo] inline def readAt[X0, A](half: Focus[Function1[X0, *], A], i: X0): A = half match + case b: Broadcast[Function1[X0, *], A] @unchecked => b.value + case k: (X0 => A) @unchecked => k(i) + + /** Wrap an index-free value as a broadcast half for the `Function1[X0, *]`-shaped carrier. */ + private inline def broadcastHalf[X0, A](a: A): Broadcast[Function1[X0, *], A] = + new Broadcast(a, (_: X0) => a) + + /** Whether a focus half is index-free — the read side of the sum, for kernels that need to branch + * on the shape without reading the value. + */ + private inline def isIndexFree[F[_], A](half: Focus[F, A]): Boolean = half match + case _: Broadcast[F, A] @unchecked => true + case _ => false // Capability instances — Functor / Foldable / Traverse over the F[A] half. @@ -250,7 +313,15 @@ object MultiFocusK: given mfFunctor[F[_]: Functor]: ForgetfulFunctor[MultiFocus[F]] with def map[X, A, B](xa: MultiFocus[F][X, A], f: A => B): MultiFocus[F][X, B] = - (xa._1, Functor[F].map(xa._2)(f)) + // Constancy survives mapping: a broadcast half stays a broadcast half (one value, one lifted + // image), which is what keeps a broadcast outer's write index-free through `.modify` / + // `.collectWith`. + chunkOf(xa) match + case b: Broadcast[F, A] @unchecked => + (xa._1, new Broadcast[F, B](f(b.value), Functor[F].map(b.lifted)(f))) + case _ => + val fh: F[A] = xa.foci + (xa._1, Functor[F].map(fh)(f)) /** `ForgetfulFold[MultiFocus[F]]` via `Foldable[F]` — folds the focus vector, discarding the * leftover. Unlocks `.foldMap` / `.headOption` / `.length` / `.exists`. @@ -260,7 +331,7 @@ object MultiFocusK: given mfFold[F[_]: Foldable]: ForgetfulFold[MultiFocus[F]] with def foldMap[X, A, M: Monoid](f: A => M, xa: MultiFocus[F][X, A]): M = - Foldable[F].foldMap(xa._2)(f) + Foldable[F].foldMap(xa.foci)(f) /** `ForgetfulTraverse[MultiFocus[F], Applicative]` via `Traverse[F]` — effectful rewrite of every * focus in `F`'s traversal order. Unlocks `.modifyA` / `.all`. @@ -273,7 +344,7 @@ object MultiFocusK: xa: MultiFocus[F][X, A], f: A => G[B], ): G[MultiFocus[F][X, B]] = - Applicative[G].map(Traverse[F].traverse(xa._2)(f))(fb => (xa._1, fb)) + Applicative[G].map(Traverse[F].traverse(xa.foci)(f))(fb => (xa._1, fb)) /** 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 @@ -295,7 +366,9 @@ object MultiFocusK: ): MultiFocus[F][Z, C] = val Tr = Traverse[F] val FL = summon[MultiFocusFromList[F]] - val (xo, fa) = outer.to(s) + val outerBundle = outer.to(s) + val xo: Xo = outerBundle.context + val fa: F[A] = outerBundle.foci inner match case is: MultiFocusSingleton[A, B, C, D, Xi] @unchecked => val (cList, xiList) = @@ -310,7 +383,9 @@ object MultiFocusK: case _ => val (flatList, fxiSize) = Tr.mapAccumulate(List.empty[C], fa) { (acc, a) => - val (xi, fc) = inner.to(a) + val innerBundle = inner.to(a) + val xi: Xi = innerBundle.context + val fc: F[C] = innerBundle.foci val (acc2, count) = Tr.foldLeft(fc, (acc, 0)) { case ((l, n), c) => (c :: l, n + 1) @@ -326,7 +401,8 @@ object MultiFocusK: outer: Optic[S, T, A, B, MultiFocus[F]] { type X = Xo }, ): T = val Tr = Traverse[F] - val ((xo, fxiSize), fd) = xd + val (xo, fxiSize) = xd.context + val fd: F[D] = xd.foci val dArr: Array[Any] = foldableToArray[F, D](fd) inner match case is: MultiFocusSingleton[A, B, C, D, Xi] @unchecked => @@ -362,52 +438,153 @@ object MultiFocusK: s"Composer[$carrier, MultiFocus[F]]: expected F[B] of cardinality 1, got $sz." ) - /** Function1-shaped same-carrier composition — the grate-absorbed case. The general [[mfAssoc]] + /** `Function1`-shaped same-carrier composition — the grate-absorbed case. The general [[mfAssoc]] * requires `Traverse[F]` + `MultiFocusFromList[F]`; `Function1[X0, *]` admits neither, so this * instance composes the rebuild closures directly. * - * The READ side needs no special case: it reads the inner's bundle at the index the outer's - * element came from (`kC(i) = inner.to(kO(i))._2(i)`), which a [[Function1BroadcastOptic]] - * answers with its broadcast focus and a bundle carrier with element `i` — so element `i` is - * read at `i` in both shapes rather than element 0's bundle being reused. + * The two sides of a composed optic need not have the same shape, and the carrier says which is + * which per bundle (see [[MultiFocusK.Focus]]), so the kernel branches on *data* rather than on + * the optic's class — which also means a composite (an anonymous `Optic`) keeps reporting its + * true shape to the next composition up: * - * The WRITE side does need one, because the two shapes disagree about what a bundle means. A - * broadcast inner builds exactly ONE value, so it is written per index (`kB(i) = - * inner.broadcastFrom(kD(i))`); handing it the per-position bundle through `from` would sample - * one index and rebuild every position from that single value — the collapse `grate ∘ iso` used - * to have. A bundle inner's `from` is a bundle-level rebuild, so it consumes the whole write - * bundle once and the outer receives the constant rebuild of that single result. + * - read — an index-free outer (`Broadcast` half) is read ONCE and its value handed to the + * inner (`inner.to(a)`), so the composite inherits the inner's shape. A tabulating outer is + * read per index: `i => inner.to(readO(i))` read at `i`. Both are exact; neither invents an + * index. + * - write — the composite's write shape follows the *read* shape, recorded in [[AssocF1Z]]. An + * index-free outer collapses the written bundle once (`inner.from(bundle)` — exact whenever + * the incoming bundle is itself broadcast, which every shipped `.modify` / `.replace` / + * `.collectWith` pipeline produces) and hands the outer a `Broadcast` half, so the outer's + * rebuild needs no index. A tabulating outer writes each position its own value, so + * `tuple.andThen().modify(f)` reaches every slot with its own `f`. * - * See `docs/research/2026-04-29-fixedtraversal-fold-spike.md`. + * No write here needs a stand-in value: every inner is handed the leftover its own read produced + * and, when it has one, the index its bridge was constructed with. * - * @group Instances + * Two tabulating sides (`MultiFocus.tuple` ∘ `MultiFocus.tuple`) are the one composition whose + * read is *not* a bijection: the composite reads one position per index (the diagonal), so the + * off-diagonal of each inner structure is not in the composite's focus vector. The plain + * `composeFrom` can only be lossy there (no `C => D` exists to put `C` values back into a `D` + * bundle); when the inner optic carries `Optic.SameFocus` — the witness `Optic.andThen` mixes + * into every composite from that call site's `C =:= D`, and the monomorphic factories mix in + * themselves — this kernel puts every position back where it was read, which is exactly the + * inverse of that diagonal read. */ - given mfAssocFunction1[X0, Xo, Xi]: AssociativeFunctor[MultiFocus[Function1[X0, *]], Xo, Xi] with - // `Z = Xo`: the kernel threads the OUTER's leftover from `composeTo` into `composeFrom`, so - // the outer's own `from` gets the value its own `to` produced — no stand-in needed. The - // inner's leftover has no producer on this path; see [[unobserved]]. - type Z = Xo + given mfAssocFunction1[X0, Xo, Xi]: AssociativeFunctor[Function1Carrier[X0], Xo, Xi] with + type Z = AssocF1Z[X0, Xo, Xi] def composeTo[S, T, A, B, C, D]( s: S, - outer: Optic[S, T, A, B, MultiFocus[Function1[X0, *]]] { type X = Xo }, - inner: Optic[A, B, C, D, MultiFocus[Function1[X0, *]]] { type X = Xi }, - ): MultiFocus[Function1[X0, *]][Z, C] = - val (xo, kO) = outer.to(s) - (xo, (i: X0) => inner.to(kO(i))._2(i)) + outer: Optic[S, T, A, B, Function1Carrier[X0]] { type X = Xo }, + inner: Optic[A, B, C, D, Function1Carrier[X0]] { type X = Xi }, + ): Function1Carrier[X0][Z, C] = + val outerBundle = outer.to(s) + val xo: Xo = outerBundle.context + chunkOf(outerBundle) match + case b: Broadcast[Function1[X0, *], A] @unchecked => + // The outer reads the same value at every index: one inner read, and the composite read + // keeps whatever shape the inner has. The inner leftover that read produced is the one the + // composite's write consumes (its write is a single value too). + val innerBundle = inner.to(b.value) + (new AssocF1Z(xo, Left(innerBundle.context)), chunkOf(innerBundle)) + case k: (X0 => A) @unchecked => + // The outer reads a real position: one inner read per index. The plan records what each of + // those reads produced — leftover, read bundle, and shape — because the composite's write + // runs one inner write per position and needs all three. + val read: X0 => C = (i: X0) => readAt(chunkOf(inner.to(k(i))), i) + val innerReads: X0 => AssocF1InnerRead[X0, Xi] = (i: X0) => + val innerBundle = inner.to(k(i)) + val half = chunkOf(innerBundle) + new AssocF1InnerRead( + innerBundle.context, + (j: X0) => readAt(half, j), + isIndexFree(half), + ) + (new AssocF1Z(xo, Right(innerReads)), read) def composeFrom[S, T, A, B, C, D]( - xd: MultiFocus[Function1[X0, *]][Z, D], - inner: Optic[A, B, C, D, MultiFocus[Function1[X0, *]]] { type X = Xi }, - outer: Optic[S, T, A, B, MultiFocus[Function1[X0, *]]] { type X = Xo }, + xd: Function1Carrier[X0][Z, D], + inner: Optic[A, B, C, D, Function1Carrier[X0]] { type X = Xi }, + outer: Optic[S, T, A, B, Function1Carrier[X0]] { type X = Xo }, ): T = - val (xo, kD) = xd - inner match - case bc: Function1BroadcastOptic[A, B, C, D, X0] @unchecked => - outer.from((xo, (i: X0) => bc.broadcastFrom(kD(i)))) - case _ => - val b: B = inner.from((unobserved[Xi], kD)) - outer.from((xo, (_: X0) => b)) + val z: AssocF1Z[X0, Xo, Xi] = xd.context + val writeHalf = chunkOf(xd) + z.innerPlan match + case Left(xi) => + // Index-free read: the composite's write is one value, and it collapses inside the inner + // (where the written bundle belongs). Handing the outer a `Broadcast` half means the + // outer's `from` reads the value outright — no sampling of a rebuild closure. + val b: B = inner.from((xi, writeHalf)) + outer.from((z.xo, broadcastHalf[X0, B](b))) + case Right(innerReads) => + inner match + case bc: Function1BroadcastOptic[A, B, C, D, X0] @unchecked => + // The broadcast optic's own hook: it builds one value per position, so position `i` + // is built from the written focus `i` — no bundle read it did not build. + outer.from((z.xo, (i: X0) => bc.broadcastFrom(readAt(writeHalf, i)))) + case w: Optic.SameFocus[C, D, Function1Carrier[X0]] @unchecked => + // The inner says its read and write types coincide, so each position can take the + // written value and keep the rest of what its read produced. + val perIndex: X0 => B = (i: X0) => + val read = innerReads(i) + inner.from((read.xi, restoredBundle(read, i, w.sameFocus, writeHalf))) + outer.from((z.xo, perIndex)) + case _ => + // No witness: one value per position, the documented lossy default. + val perIndex: X0 => B = (i: X0) => + val read = innerReads(i) + inner.from((read.xi, broadcastHalf[X0, D](readAt(writeHalf, i)))) + outer.from((z.xo, perIndex)) + + /** The bundle to hand a stable-focus inner at outer position `i`: the value written at `i`, and + * every other position restored from the read that position came from — the exact inverse of + * [[mfAssocFunction1]]'s diagonal read. An inner with no positions of its own (`indexFree`) has + * nothing to restore, so it gets the single written value, exactly as the witness-less write + * gives it. + */ + private def restoredBundle[X0, C, D, Xi]( + read: AssocF1InnerRead[X0, Xi], + i: X0, + same: Option[C =:= D], + writeHalf: Focus[Function1[X0, *], D], + ): Focus[Function1[X0, *], D] = + same match + case Some(ev) if !read.indexFree => + // `read.read` was stored by this kernel's own `composeTo`, which built it as `X0 => C`. + val restored: X0 => C = read.read.asInstanceOf[X0 => C] + (j: X0) => if j == i then readAt(writeHalf, j) else ev(restored(j)) + case _ => broadcastHalf[X0, D](readAt(writeHalf, i)) + + /** Composed existential for the `Function1[X0, *]` same-carrier kernel: the outer's leftover plus + * the inner reads the read observed — `Left(xi)` when the outer read was index-free (one inner + * read, one leftover, and the composite's write is a single value too), `Right(innerReads)` when + * it read a real position (per index: the inner leftover, its read bundle, and whether that + * bundle was index-free). The read shape and the leftover layout are the same fact, so they ride + * in one field; [[mfAssocFunction1]]'s write needs the read bundle when the inner can take its + * reads back (`Optic.SameFocus`) and only the leftover otherwise. + * + * Threading the *observed* inner leftovers (rather than leaving them for `composeFrom` to invent + * — as the pre-sum kernel did) is what makes a composite composable on either side: a + * right-associated inner is itself an `AssocF1Z`-carrying composite and reads that context back. + * [[mfAssoc]] and [[mfAssocPSVec]] record per-element inner leftovers for the same reason. + */ + final private[eo] class AssocF1Z[X0, Xo, Xi]( + val xo: Xo, + val innerPlan: Either[Xi, X0 => AssocF1InnerRead[X0, Xi]], + ) + + /** One observed inner read at an outer position: its leftover, its read bundle *as a function*, + * and whether that bundle was index-free. + * + * `read` is erased to `X0 => Any` because its element type is the method's `C`; both writers + * cast it back inside the same kernel instantiation that built it, so the cast cannot lie (the + * same existential-storage pattern as `AssocSndZ.ys` and the `Affine` hit / miss markers). + */ + final private[eo] class AssocF1InnerRead[X0, Xi]( + val xi: Xi, + val read: X0 => Any, + val indexFree: Boolean, + ) /** PSVec-specialised same-carrier composition. Where the generic [[mfAssoc]] body builds two * intermediate List accumulators + materialises via `fromList`, this body writes directly into @@ -435,7 +612,12 @@ object MultiFocusK: outer: Optic[S, T, A, B, MultiFocus[PSVec]] { type X = Xo }, inner: Optic[A, B, C, D, MultiFocus[PSVec]] { type X = Xi }, ): MultiFocus[PSVec][Z, C] = - val (xo, va) = outer.to(s) + // `PSVec`-carried bundles are never broadcast (no factory writes a `Broadcast` half here), so + // the focus half is read through the façade: `.foci` is identity for a tabulation and the + // stored vector for a broadcast. + val bundle = outer.to(s) + val xo: Xo = bundle.context + val va: PSVec[A] = bundle.foci inner match case ah: MultiFocusSingleton[A, B, C, D, Xi] @unchecked => singletonTo(xo, va, ah) case mh: MultiFocusPSMaybeHit[A, B, C, D] @unchecked => maybeHitTo(xo, va, mh) @@ -488,7 +670,9 @@ object MultiFocusK: inner: Optic[A, B, C, D, MultiFocus[PSVec]] { type X = Xi }, ): MultiFocus[PSVec][Z, C] = val ysBuf = new ObjArrBuilder(1) - val (xi, vy) = inner.to(va.head) + val innerBundle = inner.to(va.head) + val xi: Xi = innerBundle.context + val vy: PSVec[C] = innerBundle.foci ysBuf.unsafeAppend(xi) val lenArr = new Array[Int](1) lenArr(0) = vy.length @@ -516,7 +700,9 @@ object MultiFocusK: val flatBuf = new ObjArrBuilder(math.max(n, 16)) @tailrec def loop(i: Int): Unit = if i < n then - val (xi, vy) = inner.to(va(i)) + val innerBundle = inner.to(va(i)) + val xi: Xi = innerBundle.context + val vy: PSVec[C] = innerBundle.foci lenBuf.append(vy.length) ysBuf.append(xi) flatBuf.appendAllFromPSVec(vy) @@ -530,7 +716,8 @@ object MultiFocusK: inner: Optic[A, B, C, D, MultiFocus[PSVec]] { type X = Xi }, outer: Optic[S, T, A, B, MultiFocus[PSVec]] { type X = Xo }, ): T = - val (sndZ, vys) = xd + val sndZ = xd.context + val vys: PSVec[D] = xd.foci val lens = sndZ.lens val ys = sndZ.ys // `resultBuf` is sized to `ys.length` and every branch below appends EXACTLY `ys.length` @@ -600,12 +787,13 @@ object MultiFocusK: def collectList(agg: List[A] => B)(using ev: S =:= List[A], ev2: T =:= List[B]): S => T = val _ = (ev, ev2) - // Cartesian / singleton — T = List[B] preserved via List(b). The leftover is not threaded by - // this aggregation (the rebuilt optic ignores it); see [[unobserved]]. + // Cartesian / singleton — T = List[B] preserved via List(b). The collapse replaces the whole + // focus vector, so no *new* leftover can be derived for it; the one the read produced is the + // right thing to hand back, and it is the only thing that works for an optic whose `from` + // reads its own leftover. (s: S) => - val (_, fa) = o.to(s) - val b: B = agg(fa) - o.from((unobserved[o.X], List(b))) + val bundle = o.to(s) + o.from((bundle.context, List(agg(bundle.foci)))) /** Functor-broadcast aggregation — preserves F-shape via `map(_ => agg(fa))`; every focus * position receives the aggregate. Works for any `Functor[F]`; for List this is the @@ -618,10 +806,11 @@ object MultiFocusK: def collectMap[C](agg: F[A] => C)(using ev: C =:= B): S => T = val _ = ev (s: S) => - val (x, fa) = o.to(s) - val b: C = agg(fa) - val fb: F[B] = F.map(fa)(_ => ev(b)) - o.from((x, fb)) + val bundle = o.to(s) + val b: C = agg(bundle.foci) + // Route through the carrier's own `map`: a broadcast half stays a broadcast half, so a + // broadcast optic's write stays index-free. + o.from(summon[ForgetfulFunctor[MultiFocus[F]]].map(bundle, (_: A) => ev(b))) /** The algebraic-lens universal for the map-shaped collects — `agg` sees the whole focus * collection ONCE, returns the per-focus rewrite, and that rewrite is mapped back over every @@ -636,8 +825,10 @@ object MultiFocusK: */ def collectWith(agg: F[A] => A => B): S => T = (s: S) => - val (x, fa) = o.to(s) - o.from((x, F.map(fa)(agg(fa)))) + val bundle = o.to(s) + // `agg(bundle.foci)` runs ONCE per call (the load-bearing currying); the returned function + // then runs per focus position. + o.from(summon[ForgetfulFunctor[MultiFocus[F]]].map(bundle, agg(bundle.foci))) // Read-only escape (`.foldMap`) is provided by the carrier-wide `Optic.foldMap` extension via // `ForgetfulFold[MultiFocus[F]]` (`mfFold[F: Foldable]`). An explicit `Composer[MultiFocus[F], @@ -651,16 +842,21 @@ object MultiFocusK: */ extension [S, T, A, B, F[_]](o: Optic[S, T, A, B, MultiFocus[F]])(using F: Representable[F]) - def at(i: F.Representation): S => A = (s: S) => - val (_, fa) = o.to(s) - F.index(fa)(i) + def at(i: F.Representation): S => A = (s: S) => F.index(o.to(s).foci)(i) /** Generic factory: `X = F[A]`, focus = fa, rebuild = identity. * * @group Constructors */ def apply[F[_], A]: Optic[F[A], F[A], A, A, MultiFocus[F]] = - pApply[F, A, A] + // Its own body (not `pApply[F, A, A]`) so the monotone case can carry `Optic.SameFocus`: read + // and write types coincide here by construction, which is what lets a kernel whose read cannot + // be inverted from the bundle alone put read values back (`mfAssocFunction1`). + new Optic[F[A], F[A], A, A, MultiFocus[F]] with Optic.SameFocus[A, A, MultiFocus[F]]: + type X = F[A] + def sameFocus: Option[A =:= A] = Some(summon[A =:= A]) + def to(fa: F[A]): MultiFocus[F][F[A], A] = (fa, fa) + def from(mf: MultiFocus[F][F[A], A]): F[A] = mf.foci /** 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 @@ -673,8 +869,8 @@ object MultiFocusK: def pApply[F[_], A, B]: Optic[F[A], F[B], A, B, MultiFocus[F]] = new Optic[F[A], F[B], A, B, MultiFocus[F]]: type X = F[A] - def to(fa: F[A]): (F[A], F[A]) = (fa, fa) - def from(pair: (F[A], F[B])): F[B] = pair._2 + def to(fa: F[A]): MultiFocus[F][F[A], A] = (fa, fa) + def from(mf: MultiFocus[F][F[A], B]): F[B] = mf.foci /** 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). @@ -686,9 +882,9 @@ object MultiFocusK: def to[S, T, A, B](o: Optic[S, T, A, B, Direct]): Optic[S, T, A, B, MultiFocus[F]] = new Optic[S, T, A, B, MultiFocus[F]]: type X = Unit - def to(s: S): (Unit, F[A]) = ((), Applicative[F].pure(o.to(s).value)) - def from(pair: (Unit, F[B])): T = - o.from(Direct(pickSingletonOrThrow(pair._2, "Direct"))) + def to(s: S): MultiFocus[F][Unit, A] = ((), Applicative[F].pure(o.to(s).value)) + def from(mf: MultiFocus[F][Unit, B]): T = + o.from(Direct(pickSingletonOrThrow(mf.foci, "Direct"))) /** Forget[F] ↪ MultiFocus[F] — a Fold slots into the pair carrier with `X = Unit`. * @@ -699,8 +895,8 @@ object MultiFocusK: def to[S, T, A, B](o: Optic[S, T, A, B, Forget[F]]): Optic[S, T, A, B, MultiFocus[F]] = new Optic[S, T, A, B, MultiFocus[F]]: type X = Unit - def to(s: S): (Unit, F[A]) = ((), o.to(s).value) - def from(pair: (Unit, F[B])): T = o.from(ForgetK(pair._2)) + def to(s: S): MultiFocus[F][Unit, A] = ((), o.to(s).value) + def from(mf: MultiFocus[F][Unit, B]): T = o.from(ForgetK(mf.foci)) /** 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` / @@ -727,7 +923,7 @@ object MultiFocusK: def to[S, T, A, B](o: Optic[S, T, A, B, MultiFocus[F]]): Optic[S, T, A, B, Forget[F]] = new Optic[S, T, A, B, Forget[F]]: type X = Unit - def to(s: S): ForgetK[F, X, A] = ForgetK(o.to(s)._2) + def to(s: S): ForgetK[F, X, A] = ForgetK(o.to(s).foci) def from(fb: ForgetK[F, X, B]): T = // Reachable only when `T = Unit` (Forget-carrier optics have T = Unit by construction). // The cast surfaces a ClassCastException if a user's MultiFocus optic has T ≠ Unit AND @@ -745,11 +941,11 @@ object MultiFocusK: type X = o.X def singletonTo(s: S): (o.X, A) = o.to(s) def singletonFrom(x: o.X, b: B): T = o.from((x, b)) - def to(s: S): (X, F[A]) = + def to(s: S): MultiFocus[F][X, A] = val (x, a) = o.to(s) (x, Applicative[F].pure(a)) - def from(pair: (X, F[B])): T = - o.from((pair._1, pickSingletonOrThrow(pair._2, "Tuple2"))) + def from(mf: MultiFocus[F][X, B]): T = + o.from((mf.context, pickSingletonOrThrow(mf.foci, "Tuple2"))) /** Shared hit marker for the `X = Either[…, Unit]` bridges — covariance upcasts * `Either[Nothing, Unit]` to any `Either[x, Unit]`, so one instance serves every hit. @@ -765,14 +961,14 @@ object MultiFocusK: def to[S, T, A, B](o: Optic[S, T, A, B, Either]): Optic[S, T, A, B, MultiFocus[F]] = new Optic[S, T, A, B, MultiFocus[F]]: type X = Either[o.X, Unit] - def to(s: S): (X, F[A]) = + def to(s: S): MultiFocus[F][X, A] = o.to(s) match case Right(a) => (hitUnit, Applicative[F].pure(a)) case l @ Left(_) => (l.widenRight[Unit], Alternative[F].empty[A]) - def from(pair: (X, F[B])): T = - pair match - case (l @ Left(_), _) => o.from(l.widenRight[B]) - case (Right(_), fb) => o.from(Right(pickSingletonOrThrow(fb, "Either"))) + def from(mf: MultiFocus[F][X, B]): T = + mf.context match + case l @ Left(_) => o.from(l.widenRight[B]) + case Right(_) => o.from(Right(pickSingletonOrThrow(mf.foci, "Either"))) /** Optional → MultiFocus[F] — mirror of [[either2multifocus]] over the `Affine` miss / hit split. * @@ -785,18 +981,18 @@ object MultiFocusK: // X = the Affine itself (miss recycled via covariant retype, both directions) rather than an // unpacked Either[Fst, Snd] — same shape as `multifocusF2multifocus` below. type X = Affine[o.X, Unit] - def to(s: S): (X, F[A]) = + def to(s: S): MultiFocus[F][X, A] = o.to(s) match case h: Affine.Hit[o.X, A] => (new Affine.Hit[o.X, Unit](h.snd, ()), Applicative[F].pure(h.b)) case m: Affine.Miss[o.X] => (m, Alternative[F].empty[A]) - def from(pair: (X, F[B])): T = - pair match - case (m: Affine.Miss[o.X] @unchecked, _) => + def from(mf: MultiFocus[F][X, B]): T = + mf.context match + case m: Affine.Miss[o.X] @unchecked => o.from(m) - case (h: Affine.Hit[o.X, Unit] @unchecked, fb) => - o.from(new Affine.Hit[o.X, B](h.snd, pickSingletonOrThrow(fb, "Affine"))) + case h: Affine.Hit[o.X, Unit] @unchecked => + o.from(new Affine.Hit[o.X, B](h.snd, pickSingletonOrThrow(mf.foci, "Affine"))) // PSVec-specialised Composer instances. PSVec admits neither Applicative nor Alternative // naturally; these use `PSVec.singleton` / `PSVec.empty` directly. The Tuple2 bridge specialises @@ -817,8 +1013,9 @@ object MultiFocusK: case lens: optics.GetReplaceLens[S, T, A, B] @unchecked => new Optic[S, T, A, B, MultiFocus[PSVec]] with MultiFocusSingleton[S, T, A, B, S]: type X = S - def to(s: S): (S, PSVec[A]) = (s, PSVec.singleton[A](lens.get(s))) - def from(pair: (S, PSVec[B])): T = lens.enplace(pair._1, pair._2.head) + def to(s: S): MultiFocus[PSVec][S, A] = (s, PSVec.singleton[A](lens.get(s))) + def from(mf: MultiFocus[PSVec][S, B]): T = + lens.enplace(mf.context, mf.foci.head) def singletonTo(s: S): (S, A) = (s, lens.get(s)) def singletonFrom(x: S, b: B): T = lens.enplace(x, b) override def collectSingletonTo( @@ -831,10 +1028,11 @@ object MultiFocusK: case _ => new Optic[S, T, A, B, MultiFocus[PSVec]] with MultiFocusSingleton[S, T, A, B, o.X]: type X = o.X - def to(s: S): (o.X, PSVec[A]) = + def to(s: S): MultiFocus[PSVec][o.X, A] = val (xo, a) = o.to(s) (xo, PSVec.singleton[A](a)) - def from(pair: (o.X, PSVec[B])): T = o.from((pair._1, pair._2.head)) + def from(mf: MultiFocus[PSVec][o.X, B]): T = + o.from((mf.context, mf.foci.head)) def singletonTo(s: S): (o.X, A) = o.to(s) def singletonFrom(x: o.X, b: B): T = o.from((x, b)) @@ -849,14 +1047,14 @@ object MultiFocusK: def to[S, T, A, B](o: Optic[S, T, A, B, Either]): Optic[S, T, A, B, MultiFocus[PSVec]] = new Optic[S, T, A, B, MultiFocus[PSVec]] with MultiFocusPSMaybeHit[S, T, A, B]: type X = Option[o.X] - def to(s: S): (Option[o.X], PSVec[A]) = + def to(s: S): MultiFocus[PSVec][Option[o.X], A] = o.to(s) match case Left(x) => (Some(x), PSVec.empty[A]) case Right(a) => (None, PSVec.singleton[A](a)) - def from(pair: (Option[o.X], PSVec[B])): T = - pair match - case (Some(x), _) => o.from(Left(x)) - case (None, vs) => o.from(Right(vs.head)) + def from(mf: MultiFocus[PSVec][Option[o.X], B]): T = + mf.context match + case Some(x) => o.from(Left(x)) + case None => o.from(Right(mf.foci.head)) def collectTo( s: S, @@ -890,16 +1088,16 @@ object MultiFocusK: // `affine2multifocus`. The collectTo / reconstructSingleton buffer protocol below // is X-independent and keeps its unpacked fst / snd encoding. type X = Affine[o.X, Unit] - def to(s: S): (X, PSVec[A]) = + def to(s: S): MultiFocus[PSVec][X, A] = o.to(s) match case m: Affine.Miss[o.X] => (m, PSVec.empty[A]) case h: Affine.Hit[o.X, A] => (new Affine.Hit[o.X, Unit](h.snd, ()), PSVec.singleton[A](h.b)) - def from(pair: (X, PSVec[B])): T = - pair match - case (m: Affine.Miss[o.X] @unchecked, _) => o.from(m) - case (h: Affine.Hit[o.X, Unit] @unchecked, vs) => - o.from(new Affine.Hit[o.X, B](h.snd, vs.head)) + def from(mf: MultiFocus[PSVec][X, B]): T = + mf.context match + case m: Affine.Miss[o.X] @unchecked => o.from(m) + case h: Affine.Hit[o.X, Unit] @unchecked => + o.from(new Affine.Hit[o.X, B](h.snd, mf.foci.head)) def collectTo( s: S, @@ -932,8 +1130,8 @@ object MultiFocusK: def to(s: S): ModifyF[X, A] = ModifyF((s, identity[A])) def from(sfxb: ModifyF[X, B]): T = val (s, f) = sfxb.modifier - val (x, fa) = o.to(s) - o.from((x, Functor[F].map(fa)(f))) + val bundle = o.to(s) + o.from(summon[ForgetfulFunctor[MultiFocus[F]]].map(bundle, f)) // F[A]-focus factories. @@ -947,8 +1145,8 @@ object MultiFocusK: ): Optic[S, T, A, B, MultiFocus[F]] = new Optic[S, T, A, B, MultiFocus[F]]: type X = lens.X - def to(s: S): (X, F[A]) = lens.to(s) - def from(pair: (X, F[B])): T = lens.from(pair) + def to(s: S): MultiFocus[F][X, A] = lens.to(s) + def from(mf: MultiFocus[F][X, B]): T = lens.from((mf.context, mf.foci)) /** Reinterpret a Prism whose focus is an `F[A]` as a MultiFocus optic over the elements — the * miss branch surfaces as `MonoidK[F].empty` (zero foci) and passes the leftover back through @@ -961,14 +1159,14 @@ object MultiFocusK: ): Optic[S, T, A, B, MultiFocus[F]] = new Optic[S, T, A, B, MultiFocus[F]]: type X = Either[prism.X, Unit] - def to(s: S): (X, F[A]) = + def to(s: S): MultiFocus[F][X, A] = prism.to(s) match case Right(fa) => (hitUnit, fa) case l @ Left(_) => (l.widenRight[Unit], MonoidK[F].empty[A]) - def from(pair: (X, F[B])): T = - pair match - case (l @ Left(_), _) => prism.from(l.widenRight[F[B]]) - case (Right(_), fb) => prism.from(Right(fb)) + def from(mf: MultiFocus[F][X, B]): T = + mf.context match + case l @ Left(_) => prism.from(l.widenRight[F[B]]) + case Right(_) => prism.from(Right(mf.foci)) // Function1-shaped MultiFocus factories (the Grate-absorbed surface). @@ -985,19 +1183,20 @@ object MultiFocusK: * no representative index, and the built optic carries none: `X = Unit`, and the whole * index-parametric read lives in the focus bundle. (Pre-0.19 a second name, * `representableAt(F)(repr0)`, took exactly such an index; it built this same optic — see the - * changelog for the removal.) The one reader that cannot take its index per call — the inbound - * Iso bridge's own `from`, which is handed the whole bundle by the kernel and has no caller to - * ask — is given a [[RepresentativeIndex]] at construction instead (see that type's doc). + * changelog for the removal.) * * @group Constructors */ def representable[F[_], A](using F: Representable[F] ): Optic[F[A], F[A], A, A, MultiFocus[Function1[F.Representation, *]]] = - new Optic[F[A], F[A], A, A, MultiFocus[Function1[F.Representation, *]]]: + new Optic[F[A], F[A], A, A, MultiFocus[Function1[F.Representation, *]]] + with Optic.SameFocus[A, A, MultiFocus[Function1[F.Representation, *]]]: type X = Unit - def to(fa: F[A]): (Unit, F.Representation => A) = ((), F.index(fa)) - def from(pair: (Unit, F.Representation => A)): F[A] = F.tabulate(pair._2) + def sameFocus: Option[A =:= A] = Some(summon[A =:= A]) + def to(fa: F[A]): MultiFocus[Function1[F.Representation, *]][Unit, A] = ((), F.index(fa)) + def from(mf: MultiFocus[Function1[F.Representation, *]][Unit, A]): F[A] = + F.tabulate(mf.foci) /** Pointwise ZIP of two containers — a Grate's reason for existing, and the one operation * [[representable]] made possible but never exposed. @@ -1046,13 +1245,15 @@ object MultiFocusK: ): Optic[T, T, A, A, MultiFocus[Function1[Int, *]]] = val _ = ev val size = sz.value - new Optic[T, T, A, A, MultiFocus[Function1[Int, *]]]: + new Optic[T, T, A, A, MultiFocus[Function1[Int, *]]] + with Optic.SameFocus[A, A, MultiFocus[Function1[Int, *]]]: type X = Unit - def to(t: T): (Unit, Int => A) = + def sameFocus: Option[A =:= A] = Some(summon[A =:= A]) + def to(t: T): MultiFocus[Function1[Int, *]][Unit, A] = val read: Int => A = (i: Int) => t.productElement(i).asInstanceOf[A] ((), read) - def from(pair: (Unit, Int => A)): T = - val k = pair._2 + def from(mf: MultiFocus[Function1[Int, *]][Unit, A]): T = + val k = mf.foci val arr = new Array[Any](size) @tailrec def loop(i: Int): Unit = if i < size then @@ -1061,36 +1262,47 @@ object MultiFocusK: loop(0) Tuple.fromArray(arr).asInstanceOf[T] + /** Construct an index-free (broadcast) bundle on the `Function1[X0, *]`-shaped carrier: `a` is + * the focus at every index, and it is *known* without consulting one. The mirror of + * [[MultiFocusK.foci]] (`F[A]`-shaped consumers) for consumers that need the value itself. + * + * Use it when an optic's source has no `X0`-index of its own — an Iso reshaped into this carrier + * ([[forgetful2multifocusFunction1]]), or any optic that broadcasts one focus across the index + * set. Compositions read the difference: an index-free outer is read once (not per index), and + * the write of a composite whose read was index-free stays index-free all the way out. + * + * @group Constructors + */ + def broadcast[X0, X, A](x: X, a: A): MultiFocusK[Function1[X0, *], X, A] = + (x, broadcastHalf[X0, A](a)) + /** Iso ↪ MultiFocus[Function1[X0, *]] — the Iso side of the grate-shaped surface. Iso's forward - * `to: S => A` is broadcast to the constant rebuild `_ => a`; the reverse reads the rebuild at - * the [[RepresentativeIndex]] witness the bridge was built with. + * `to: S => A` is broadcast to every index, so the bundle it produces is index-free + * ([[broadcast]]) and a composite reading through it never has to sample an index. * - * '''Constant-bundle contract.''' The witness read is sound only while the bundle it is handed - * is constant — true for direct use (`modify` / `replace` map a constant rebuild, so the - * read-at-`at` and the written value agree) and for `mfAssocFunction1`'s broadcast branch, which - * routes a singleton bundle per position. It is NOT sound for an arbitrary varying bundle, which - * is why the product is a [[Function1BroadcastOptic]]: the kernel recognises it and composes the - * write per index (`broadcastFrom`) rather than passing a per-position bundle through `from`. - * The read side needs no such hook — `to` already broadcasts the single focus, so the kernel - * just reads the bundle at the index it wants. See the fixedtraversal-fold spike doc. + * The product is a [[Function1BroadcastOptic]] — a class because the *optic* is the one thing + * the carrier's sum cannot describe before a read: a broadcast optic builds exactly one value + * per position, so [[mfAssocFunction1]] writes it through the class's own hook + * ([[Function1BroadcastOptic.broadcastFrom]]) rather than through a bundle read it did not + * build. The class also owns the one read of a bundle it did not build: an index-free bundle is + * read outright, and a tabulating one at the real index the [[RepresentativeIndex]] witness + * supplies — a defined answer, never a forged sentinel, and never a value the index types the + * Grate factories fix (`Int`, `Boolean`, `Unit`, singletons) have to supply themselves. * - * The `using` clause is the cost side of that contract: the index has to come from the caller's - * scope, because this `Composer` has none to give and a forged index is exactly what the witness - * removes. Index types with a canonical value (`Int`, `Boolean`, `Unit`, singletons) resolve - * import-free off [[RepresentativeIndex]]; anything else needs a local `given` or an explicit - * `RepresentativeIndex.at`. An uninhabited index type gets no instance — the bridge refuses - * rather than reading a bundle at a value that cannot exist. + * The `using` clause is the cost side of that contract, exactly as on `main`: index types with a + * canonical value resolve import-free off [[RepresentativeIndex]]; anything else is refused + * rather than guessed — no index is ever forged, and nothing else needs a stand-in either. * * @group Instances */ given forgetful2multifocusFunction1[X0](using - ri: RepresentativeIndex[X0] + idx: RepresentativeIndex[X0] ): Composer[Direct, MultiFocus[Function1[X0, *]]] with def to[S, T, A, B]( o: Optic[S, T, A, B, Direct] ): Optic[S, T, A, B, MultiFocus[Function1[X0, *]]] = - new Function1BroadcastOptic[S, T, A, B, X0](o, ri.index) + new Function1BroadcastOptic[S, T, A, B, X0](o, idx.index) /** Reinterpret an Optional whose focus is an `F[A]` as a MultiFocus optic over the elements — the * mirror of [[fromPrismF]] over the `Affine` miss / hit split (miss recycled covariantly, both @@ -1103,18 +1315,18 @@ object MultiFocusK: ): Optic[S, T, A, B, MultiFocus[F]] = new Optic[S, T, A, B, MultiFocus[F]]: type X = Affine[opt.X, Unit] - def to(s: S): (X, F[A]) = + def to(s: S): MultiFocus[F][X, A] = opt.to(s) match case m: Affine.Miss[opt.X] @unchecked => (m, MonoidK[F].empty[A]) case h: Affine.Hit[opt.X, F[A]] @unchecked => (new Affine.Hit[opt.X, Unit](h.snd, ()), h.b) - def from(pair: (X, F[B])): T = - pair match - case (m: Affine.Miss[opt.X] @unchecked, _) => + def from(mf: MultiFocus[F][X, B]): T = + mf.context match + case m: Affine.Miss[opt.X] @unchecked => opt.from(m) - case (h: Affine.Hit[opt.X, Unit] @unchecked, fb) => - opt.from(new Affine.Hit[opt.X, F[B]](h.snd, fb)) + case h: Affine.Hit[opt.X, Unit] @unchecked => + opt.from(new Affine.Hit[opt.X, F[B]](h.snd, mf.foci)) /** 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` / diff --git a/core/src/main/scala/dev/constructive/eo/optics/Optic.scala b/core/src/main/scala/dev/constructive/eo/optics/Optic.scala index 1b1f21ea..b8c18746 100644 --- a/core/src/main/scala/dev/constructive/eo/optics/Optic.scala +++ b/core/src/main/scala/dev/constructive/eo/optics/Optic.scala @@ -2,7 +2,7 @@ package dev.constructive.eo package optics import scala.annotation.{nowarn, targetName} -import scala.compiletime.summonInline +import scala.compiletime.{summonFrom, summonInline} import cats.arrow.Profunctor import cats.syntax.functor.* @@ -68,6 +68,11 @@ trait Optic[S, T, A, B, F[_, _]]: * Cross-carrier composition (Lens → Optional, Lens → Traversal, …) goes through the * `Morph`-summoning overload of this same method. * + * The composite also carries [[SameFocus]] (mixed in below, with whatever `C =:= D` evidence + * this call site has), so a kernel whose write cannot be inverted from the bundle alone can look + * the fact up on the inner optic it is handed. Stability is a property of the optic's own type + * pair, so it rides on the optic — the composition algebra stays unaware of it. + * * @example * {{{ * case class Address(street: String) @@ -79,8 +84,13 @@ trait Optic[S, T, A, B, F[_, _]]: @nowarn("id=E197") inline def andThen[C, D](o: Optic[A, B, C, D, F]): Optic[S, T, C, D, F] = val af = summonInline[AssociativeFunctor[F, self.X, o.X]] - new Optic: + val same: Option[C =:= D] = summonFrom { + case ev: (C =:= D) => Some(ev) + case _ => None + } + new Optic with Optic.SameFocus[C, D, F]: type X = af.Z + def sameFocus: Option[C =:= D] = same def to(s: S): F[X, C] = af.composeTo(s, self, o) def from(xd: F[X, D]): T = af.composeFrom(xd, o, self) @@ -146,6 +156,35 @@ trait Optic[S, T, A, B, F[_, _]]: */ object Optic: + /** Focus-stability witness carried by an optic whose focus types coincide (`C =:= D`). + * + * It exists for kernels whose composite read cannot be inverted from the write bundle alone: the + * `Function1`-shaped one reads ONE position per index, so composing two tabulating optics + * (`MultiFocus.tuple` ∘ `MultiFocus.tuple`) leaves each inner structure's off-diagonal out of + * the composite's focus vector, and putting those values back needs a `C => D` — which exists + * exactly when `C =:= D`. Handing that fact to the kernel through the composition algebra would + * put one carrier's problem in every carrier's contract; it rides on the optic instead, like + * [[data.Function1BroadcastOptic]] (which says *this optic writes one value per position*) — + * this one says *this optic's write types coincide with its read types*. + * + * [[Optic.andThen]] mixes it into every composite it builds, with whatever `C =:= D` evidence + * that call site has, and the monomorphic factories (`MultiFocus.representable`, + * `MultiFocus.tuple`, `MultiFocus.apply`) mix it in with `Some(…)` directly, so a kernel that is + * handed an inner optic can look the fact up on it. + * + * `None` is a real answer, not a failure: a polymorphic optic (`MultiFocus.pApply`, a Lens whose + * `S ≠ T`) cannot put a read value back into a write bundle, and kernels keep their lossy + * default for it. + * + * @group Operations + */ + trait SameFocus[C, D, F[_, _]]: + + /** `Some` carries the evidence that this optic's read and write types coincide; `None` says + * they may not. + */ + def sameFocus: Option[C =:= D] + /** The identity optic — `S` is its own focus and modification has no effect. Carrier is * [[data.Direct]] (no leftover). Returns the concrete [[BijectionIso]] (not an anonymous * `Optic`) so `id.andThen(x)` picks up the fused compose members like any other Iso. diff --git a/core/src/main/scala/dev/constructive/eo/optics/Traversal.scala b/core/src/main/scala/dev/constructive/eo/optics/Traversal.scala index 6899772a..c55c764c 100644 --- a/core/src/main/scala/dev/constructive/eo/optics/Traversal.scala +++ b/core/src/main/scala/dev/constructive/eo/optics/Traversal.scala @@ -267,7 +267,7 @@ object Traversal: new Traversal[S, S, S, S]: type X = S def to(s: S): MultiFocus[PSVec][X, S] = MultiFocus(s, children(s)) - def from(pair: MultiFocus[PSVec][X, S]): S = rebuild(pair.context, pair.foci) + def from(mf: MultiFocus[PSVec][X, S]): S = rebuild(mf.context, mf.foci) // Streaming read path: fold the children vector directly, skipping the carrier wrapper. override def foldMap[M](f: S => M)(s: S)(using Monoid[M]): M = @@ -344,8 +344,8 @@ final class TraverseTraversal[T[_]: Traverse, A, B] extends Traversal[T[A], T[B] def to(ta: T[A]): MultiFocus[PSVec][X, A] = MultiFocus(ta, PSVec.from(ta)) - def from(pair: MultiFocus[PSVec][X, B]): T[B] = - val (xo, vec) = (pair.context, pair.foci) + def from(mf: MultiFocus[PSVec][X, B]): T[B] = + val (xo, vec) = (mf.context, mf.foci) xo match case _: ArraySeq[?] => // `unsafeShareableArray` returns the Slice's backing array when it densely covers diff --git a/core/src/main/scala/dev/constructive/eo/optics/TraversalArityMacro.scala b/core/src/main/scala/dev/constructive/eo/optics/TraversalArityMacro.scala index 449ed97c..857d5d3f 100644 --- a/core/src/main/scala/dev/constructive/eo/optics/TraversalArityMacro.scala +++ b/core/src/main/scala/dev/constructive/eo/optics/TraversalArityMacro.scala @@ -39,8 +39,8 @@ private[optics] object TraversalArityMacro: } MultiFocus((), PSVec.unsafeWrap[A](arr)) - def from(pair: MultiFocus[PSVec][X, B]): T = - ${ applyReverse(List.tabulate(getters.length)(i => '{ pair.foci(${ Expr(i) }) })) } + def from(mf: MultiFocus[PSVec][X, B]): T = + ${ applyReverse(List.tabulate(getters.length)(i => '{ mf.foci(${ Expr(i) }) })) } } def twoImpl[S: Type, T: Type, A: Type, B: Type]( diff --git a/core/src/test/scala/dev/constructive/eo/MultiFocusFunction1CompositionSpec.scala b/core/src/test/scala/dev/constructive/eo/MultiFocusFunction1CompositionSpec.scala new file mode 100644 index 00000000..b3c6b29d --- /dev/null +++ b/core/src/test/scala/dev/constructive/eo/MultiFocusFunction1CompositionSpec.scala @@ -0,0 +1,403 @@ +package dev.constructive.eo + +import scala.language.implicitConversions + +import cats.instances.function.given +import dev.constructive.eo.compose.* +import org.scalacheck.Prop.forAll +import org.specs2.ScalaCheck +import org.specs2.mutable.Specification + +import data.{Direct, MultiFocus, RepresentativeIndex} +import data.MultiFocus.at +import optics.* +import optics.Optic.* + +/** Same-carrier composition on the `MultiFocus[Function1[X0, *]]` (grate-shaped) carrier, where the + * two sides of a composed optic do NOT have the same shape: + * + * - a *positional* (tabulating) optic reads a real position of its source — + * `MultiFocus.representable` / `tuple`; + * - an *index-free* (broadcast) optic reads one value at every index — every optic built by + * `forgetful2multifocusFunction1` (the Iso shim), and any composite whose outer is one. + * + * `mfAssocFunction1` picks a read and a write shape per side; these blocks pin the shapes that are + * observable at the composite's boundary through `.modify` / `.replace` / `.at`: + * + * - positional-outer ∘ index-free-inner — the write stays per-position, so `modify(identity)` is + * the identity and every source position keeps its own value; + * - index-free-outer ∘ positional-inner — the read is tabulated, the write collapses to the one + * value the outer rebuilds with; + * - nested compositions re-derive both decisions at every level. + * + * The positional blocks are the observable half of the design question: a kernel that samples the + * outer's read at an invented index, or collapses the write to one broadcast value, fails them. + */ +class MultiFocusFunction1CompositionSpec extends Specification with ScalaCheck: + + /** The Iso shim: `S ≅ A`, broadcast to the `Function1[X0, *]` carrier with `X = Unit`. Every + * index reads the same `A` — the shape the carrier cannot otherwise express. The bridge needs a + * [[RepresentativeIndex]] for `X0` (the one bundle read it owns; `Int` / `Boolean` / `Unit` / + * singletons ship instances), so it is threaded through here. + */ + private def broadcastOuter[X0, S, T, A, B]( + iso: Optic[S, T, A, B, Direct] + )(using RepresentativeIndex[X0]): Optic[S, T, A, B, MultiFocus[Function1[X0, *]]] = + summon[Composer[Direct, MultiFocus[Function1[X0, *]]]].to(iso) + + // covers: positional outer ∘ index-free inner, same-carrier `.andThen` through + // mfAssocFunction1.composeFrom. The outer reads a real tuple position; the inner rebuilds ONE + // value per position. `modify(identity)` must therefore be the identity, and a pointwise modify + // must reach every slot with its own value. + "MultiFocus.tuple.andThen(): per-position write survives the composition" >> { + val outer: Optic[(Int, Int), (Int, Int), Int, Int, MultiFocus[Function1[Int, *]]] = + MultiFocus.tuple[(Int, Int), Int] + val inner: Optic[Int, Int, String, String, MultiFocus[Function1[Int, *]]] = + broadcastOuter[Int, Int, Int, String, String]( + Iso[Int, Int, String, String](_.toString, _.toInt) + ) + val g: Optic[(Int, Int), (Int, Int), String, String, MultiFocus[Function1[Int, *]]] = + outer.andThen(inner) + + val identityWrite = forAll { (l: Int, r: Int) => + val out = g.modify(identity[String])((l, r)) + out._1 == l && out._2 == r + } + val pointwise = forAll { (l: Int, r: Int) => + val out = g.modify(s => (s.toInt + 1).toString)((l, r)) + out._1 == l + 1 && out._2 == r + 1 + } + identityWrite && pointwise + } + + // covers: index-free outer ∘ positional inner — the read is tabulated (each index reads its own + // slot) while the write goes back through the outer's single-value rebuild. `.replace` + // broadcasts the written value to every position because the outer owns exactly one focus. + ".andThen(MultiFocus.tuple): tabulated read + single-value write" >> { + val pairIso: Optic[(Int, Int), (Int, Int), (Int, Int), (Int, Int), Direct] = + Iso[(Int, Int), (Int, Int), (Int, Int), (Int, Int)](identity, identity) + val outer + : Optic[(Int, Int), (Int, Int), (Int, Int), (Int, Int), MultiFocus[Function1[Int, *]]] = + broadcastOuter[Int, (Int, Int), (Int, Int), (Int, Int), (Int, Int)](pairIso) + val inner: Optic[(Int, Int), (Int, Int), Int, Int, MultiFocus[Function1[Int, *]]] = + MultiFocus.tuple[(Int, Int), Int] + val g: Optic[(Int, Int), (Int, Int), Int, Int, MultiFocus[Function1[Int, *]]] = + outer.andThen(inner) + + val pointwise = forAll { (l: Int, r: Int) => + val out = g.modify(_ + 1)((l, r)) + out._1 == l + 1 && out._2 == r + 1 + } + val broadcast = forAll { (l: Int, r: Int, v: Int) => + val out = g.replace(v)((l, r)) + out._1 == v && out._2 == v + } + pointwise && broadcast + } + + // covers: two levels of same-carrier `.andThen` — an index-free inner under a composite whose own + // outer read is POSITIONAL. Each level re-derives its read/write shape; reading one position twice + // (or collapsing the pair to a single value) is observable here. + "( ∘ MultiFocus.representable).andThen(): nested composition stays positional" >> { + // (Int, Int) ≅ (Boolean => Int) — a lawful iso, so a representable factory can sit under it. + val pairIso: Optic[(Int, Int), (Int, Int), Boolean => Int, Boolean => Int, Direct] = + Iso[(Int, Int), (Int, Int), Boolean => Int, Boolean => Int]( + p => b => if b then p._1 else p._2, + f => (f(true), f(false)), + ) + val mid: Optic[(Int, Int), (Int, Int), Int, Int, MultiFocus[Function1[Boolean, *]]] = + broadcastOuter[Boolean, (Int, Int), (Int, Int), Boolean => Int, Boolean => Int](pairIso) + .andThen(MultiFocus.representable[[a] =>> Boolean => a, Int]) + val inner: Optic[Int, Int, String, String, MultiFocus[Function1[Boolean, *]]] = + broadcastOuter[Boolean, Int, Int, String, String]( + Iso[Int, Int, String, String](_.toString, _.toInt) + ) + val g = mid.andThen(inner) + + val positional = forAll { (l: Int, r: Int) => + val out = g.modify(s => (s.toInt + 1).toString)((l, r)) + out._1 == l + 1 && out._2 == r + 1 + } + val indexRead = forAll { (l: Int, r: Int) => + g.at(true)((l, r)) == l.toString && g.at(false)((l, r)) == r.toString + } + positional && indexRead + } + + // covers: the sum itself — `.broadcast` distinguishes an index-free bundle from a tabulation, and + // `.foci` stays total for both (the broadcast half's lifted `F[A]`). Composition propagates the + // shape by data: chaining broadcast optics keeps the composite index-free. + "bundle shape: `.broadcast` / `.foci` on index-free vs tabulating bundles, and through a chain" >> { + val shim: Optic[Int, Int, Int, Int, MultiFocus[Function1[Int, *]]] = + broadcastOuter[Int, Int, Int, Int, Int](Iso[Int, Int, Int, Int](_ + 1, _ - 1)) + val tuple: Optic[(Int, Int), (Int, Int), Int, Int, MultiFocus[Function1[Int, *]]] = + MultiFocus.tuple[(Int, Int), Int] + + // Index-free: the value is available outright, and `.foci` is the constant image of it. + val shimBundle = shim.to(7) + val shimOk: Boolean = + shimBundle.broadcast == Some(8) && shimBundle.foci(0) == 8 && shimBundle.foci(1) == 8 + + // Tabulating: no index-free value, and `.foci` is the real per-index read. + val tupleBundle = tuple.to((3, 4)) + val tupleOk: Boolean = + tupleBundle.broadcast.isEmpty && tupleBundle.foci(0) == 3 && tupleBundle.foci(1) == 4 + + // The public constructor is the same shape, for optics that broadcast without an Iso. + val manual = MultiFocus.broadcast[Boolean, Unit, String]((), "v") + val manualOk: Boolean = manual.broadcast == Some("v") && manual.foci(true) == "v" + + // Broadcast ∘ broadcast stays index-free (the inner's half is reused verbatim). + val chained = shim.andThen(shim) + val chainOk: Boolean = chained.to(7).broadcast == Some(9) + + shimOk && tupleOk && manualOk && chainOk + } + + /** A *positional* F1-carried optic over an `Int` whose leftover is real (`X = Int`) and whose + * write reads it back — the shape that makes a borrowed/absent write context observable: a null + * leftover would show up as a wrong value, and an absent one as an NPE. `from(to(s)) == s`, so + * `modify(identity)` is the identity on it. + */ + private def positionalProbe: Optic[Int, Int, Int, Int, MultiFocus[Function1[Int, *]]] = + new Optic[Int, Int, Int, Int, MultiFocus[Function1[Int, *]]]: + type X = Int + def to(s: Int): MultiFocus[Function1[Int, *]][X, Int] = MultiFocus(s, (i: Int) => i * 10) + def from(mf: MultiFocus[Function1[Int, *]][X, Int]): Int = mf.context + mf.foci(0) + + // covers: right-associated same-carrier `.andThen` — the inner is itself a composite, so its own + // write context must be the one its read produced. A kernel that invents the inner leftover hands + // it a null `AssocF1Z` and NPEs on the first write. + ".andThen(.andThen()): right-associated chain keeps its own context" >> { + val idIso: Optic[Int, Int, Int, Int, Direct] = Iso[Int, Int, Int, Int](identity, identity) + val shim: Optic[Int, Int, Int, Int, MultiFocus[Function1[Int, *]]] = + broadcastOuter[Int, Int, Int, Int, Int](idIso) + val g = shim.andThen(shim.andThen(shim)) + + val pointwise = forAll { (n: Int) => g.modify(_ + 1)(n) == n + 1 } + val identityWrite = forAll { (n: Int) => g.modify(identity[Int])(n) == n } + pointwise && identityWrite + } + + // covers: right-associated composition where the innermost optic is a *positional* optic with a + // real leftover it reads on write, under an index-free outer. The composite inner must be handed + // the context its own read produced, and the outer's single-value write must thread through it. + ".andThen(.andThen()): leftover survives both levels" >> { + val idIso: Optic[Int, Int, Int, Int, Direct] = Iso[Int, Int, Int, Int](identity, identity) + val shim: Optic[Int, Int, Int, Int, MultiFocus[Function1[Int, *]]] = + broadcastOuter[Int, Int, Int, Int, Int](idIso) + val plusOne: Optic[Int, Int, Int, Int, MultiFocus[Function1[Int, *]]] = + broadcastOuter[Int, Int, Int, Int, Int](Iso[Int, Int, Int, Int](_ + 1, _ - 1)) + + val inner = positionalProbe.andThen(plusOne) + val innerOk = forAll { (n: Int) => inner.modify(identity[Int])(n) == n } + + val g = shim.andThen(inner) + val outerOk = forAll { (n: Int) => + g.modify(identity[Int])(n) == n && g.modify(_ + 1)(n) == n + 1 + } + innerOk && outerOk + } + + /** Probe source for the `fromLensF` block: a carried function plus a component the write has to + * restore from the leftover (a null leftover would show up as a dropped/`null` component). + */ + private type FnPair = (Int => Int, String) + + // covers: a `fromLensF`-built inner carries a *real* leftover that its write reads back. An + // invented one (null) makes the lens's rebuild NPE / drop the carried component; the kernel now + // threads the leftover the read observed. + "fromLensF inner under an iso shim: the lens's leftover survives the write" >> { + val lens: Optic[FnPair, FnPair, Int => Int, Int => Int, Tuple2] = + Lens[FnPair, Int => Int](p => p._1, (p, f) => (f, p._2)) + val inner: Optic[FnPair, FnPair, Int, Int, MultiFocus[Function1[Int, *]]] = + MultiFocus.fromLensF[Function1[Int, *], FnPair, FnPair, Int, Int](lens) + val pairIso: Optic[FnPair, FnPair, FnPair, FnPair, Direct] = + Iso[FnPair, FnPair, FnPair, FnPair](identity, identity) + val outer: Optic[FnPair, FnPair, FnPair, FnPair, MultiFocus[Function1[Int, *]]] = + broadcastOuter(pairIso) + val g = outer.andThen(inner) + + val src: FnPair = ((i: Int) => i * 2, "keep") + val out = g.modify(_ + 1)(src) + (out._2 == "keep") && (out._1(3) == 7) + } + + // covers: right-associated composition through an iso shim under a *tabulating* outer, where the + // inner composite is written one position at a time — every position needs the leftover its own + // read produced. + "MultiFocus.tuple.andThen(.andThen()): per-position write through a composite" >> { + val tuple: Optic[(Int, Int), (Int, Int), Int, Int, MultiFocus[Function1[Int, *]]] = + MultiFocus.tuple[(Int, Int), Int] + val idIso: Optic[Int, Int, Int, Int, Direct] = Iso[Int, Int, Int, Int](identity, identity) + val shim: Optic[Int, Int, Int, Int, MultiFocus[Function1[Int, *]]] = + broadcastOuter[Int, Int, Int, Int, Int](idIso) + val g = tuple.andThen(shim.andThen(shim)) + + val replaceOk = forAll { (l: Int, r: Int, v: Int) => g.replace(v)((l, r)) == ((v, v)) } + val modifyOk = forAll { (l: Int, r: Int) => g.modify(_ + 1)((l, r)) == ((l + 1, r + 1)) } + replaceOk && modifyOk + } + + // covers: tabulating ∘ tabulating — the composite reads one position per index (the shared index + // set makes the two sides advance together), so its write must be the exact inverse of that read: + // every position keeps what it was read at, and only the addressed position takes the new value. + // This is the one composition whose read is not a bijection; it is lawful because `C =:= D` here, + // which `Optic.andThen` detects and routes to the kernel's exact-inverse write. (On main the same + // expression returned `((1, 2), (1, 2))` — the first row broadcast everywhere.) + "MultiFocus.tuple.andThen(MultiFocus.tuple): diagonal read, in-place write (lawful)" >> { + val outer: Optic[ + ((Int, Int), (Int, Int)), + ((Int, Int), (Int, Int)), + (Int, Int), + (Int, Int), + MultiFocus[Function1[Int, *]], + ] = MultiFocus.tuple[((Int, Int), (Int, Int)), (Int, Int)] + val inner: Optic[(Int, Int), (Int, Int), Int, Int, MultiFocus[Function1[Int, *]]] = + MultiFocus.tuple[(Int, Int), Int] + val g = outer.andThen(inner) + + // MF1: the composite's write inverts its own read. + val identityOk = forAll { (a: Int, b: Int, c: Int, d: Int) => + g.modify(identity[Int])(((a, b), (c, d))) == (((a, b), (c, d))) + } + // MF2: two modifies compose, and each write only touches the position it was given. + val composeOk = forAll { (a: Int, b: Int, c: Int, d: Int) => + val f: Int => Int = _ + 1 + val h: Int => Int = _ * 3 + g.modify(h)(g.modify(f)(((a, b), (c, d)))) == g.modify(f.andThen(h))(((a, b), (c, d))) + } + val inPlace = forAll { (a: Int, b: Int, c: Int, d: Int, v: Int) => + g.replace(v)(((a, b), (c, d))) == (((v, b), (c, v))) + } + // The diagonal is what the composite reads, and it is also all it writes back. + val diagonal = forAll { (a: Int, b: Int, c: Int, d: Int) => + g.at(0)(((a, b), (c, d))) == a && g.at(1)(((a, b), (c, d))) == d + } + identityOk && composeOk && inPlace && diagonal + } + + // covers: associativity of the same-carrier kernel across the shapes that need the two different + // write entry points — an index-free shim inside (one collapsed value) and tabulating sides + // (in-place diagonal write). Reads agree; the writes must land on the same values either way. + "same-carrier composition is associative across shim / tabulating mixes" >> { + val tuple2: Optic[(Int, Int), (Int, Int), Int, Int, MultiFocus[Function1[Int, *]]] = + MultiFocus.tuple[(Int, Int), Int] + val pairs: Optic[ + ((Int, Int), (Int, Int)), + ((Int, Int), (Int, Int)), + (Int, Int), + (Int, Int), + MultiFocus[Function1[Int, *]], + ] = MultiFocus.tuple[((Int, Int), (Int, Int)), (Int, Int)] + val idIso: Optic[Int, Int, Int, Int, Direct] = Iso[Int, Int, Int, Int](identity, identity) + val shim: Optic[Int, Int, Int, Int, MultiFocus[Function1[Int, *]]] = + broadcastOuter[Int, Int, Int, Int, Int](idIso) + + val left = pairs.andThen(tuple2.andThen(shim)) + val right = pairs.andThen(tuple2).andThen(shim) + + val sameRead = forAll { (a: Int, b: Int, c: Int, d: Int) => + val s = ((a, b), (c, d)) + left.at(0)(s) == right.at(0)(s) && left.at(1)(s) == right.at(1)(s) + } + val sameWrite = forAll { (a: Int, b: Int, c: Int, d: Int) => + val s = ((a, b), (c, d)) + left.modify(identity[Int])(s) == right.modify(identity[Int])(s) && + left.replace(7)(s) == right.replace(7)(s) + } + sameRead && sameWrite + } + + /** A *polymorphic* tabulating F1-carried optic over an `Int`: it reads a real position, and its + * write changes the focus type (`Int` → `String`), so no `Int => String` exists for a kernel to + * put read values back with. + */ + private def polyProbe: Optic[Int, Int, Int, String, MultiFocus[Function1[Int, *]]] = + new Optic[Int, Int, Int, String, MultiFocus[Function1[Int, *]]]: + type X = Unit + def to(s: Int): MultiFocus[Function1[Int, *]][Unit, Int] = + MultiFocus((), (i: Int) => s + i) + def from(mf: MultiFocus[Function1[Int, *]][Unit, String]): Int = mf.foci(0).toInt + + // covers: the documented fallback — a tabulating ∘ tabulating composite whose write CHANGES the + // focus type. The composite reads one position per index, so the read values are `C`, and the write + // bundle is `D` with no `C => D` in sight; the kernel keeps its per-position value write and cannot + // put the rest back. Pinned so the boundary between the exact (stable-focus) and lossy + // (type-changing) writes stays where the docs say it is. + "type-changing write through a tabulating ∘ tabulating composite: documented lossy fallback" >> { + val outer: Optic[Int, Int, Int, Int, MultiFocus[Function1[Int, *]]] = positionalProbe + val g = outer.andThen(polyProbe) + + // The read is `i => (i * 10) + i` on either index; `.modify(_.toString)` has no reader-side + // inverse to fall back on, so each position the write touches takes the transformed value and the + // outer's own rebuild (`context + foci(0)`) decides the result. + g.modify(_.toString)(5) == 5 + } + + // covers: a *composite* inner whose innermost pair is stable (`tuple ∘ shim`) under a tabulating + // outer. The stability witness rides on the composite — `Optic.andThen` mixes it in from the call + // site's `C =:= D` — so the outer's diagonal write is still the exact inverse of its read: MF1 + // holds and `replace` touches the two positions the composite reads, not whole rows. + "tabulating ∘ (tabulating ∘ shim): the composite inner carries the stability witness" >> { + val pairs: Optic[ + ((Int, Int), (Int, Int)), + ((Int, Int), (Int, Int)), + (Int, Int), + (Int, Int), + MultiFocus[Function1[Int, *]], + ] = MultiFocus.tuple[((Int, Int), (Int, Int)), (Int, Int)] + val tuple2: Optic[(Int, Int), (Int, Int), Int, Int, MultiFocus[Function1[Int, *]]] = + MultiFocus.tuple[(Int, Int), Int] + val idIso: Optic[Int, Int, Int, Int, Direct] = Iso[Int, Int, Int, Int](identity, identity) + val shim: Optic[Int, Int, Int, Int, MultiFocus[Function1[Int, *]]] = + broadcastOuter[Int, Int, Int, Int, Int](idIso) + + val g = pairs.andThen(tuple2.andThen(shim)) + + val identityOk = forAll { (a: Int, b: Int, c: Int, d: Int) => + g.modify(identity[Int])(((a, b), (c, d))) == (((a, b), (c, d))) + } + val inPlace = forAll { (a: Int, b: Int, c: Int, d: Int) => + g.replace(9)(((a, b), (c, d))) == (((9, b), (c, 9))) + } + val diagonal = forAll { (a: Int, b: Int, c: Int, d: Int) => + g.at(0)(((a, b), (c, d))) == a && g.at(1)(((a, b), (c, d))) == d + } + identityOk && inPlace && diagonal + } + + // covers: the bespoke surface on the same carrier — bare `.modify` / `.replace` on a positional + // factory, the `Representable`-gated `.at(i)` read, and both Functor-shaped collects. + "positional factories: bare modify / replace / at / collect stay intact" >> { + val tuple: Optic[(Int, Int, Int), (Int, Int, Int), Int, Int, MultiFocus[Function1[Int, *]]] = + MultiFocus.tuple[(Int, Int, Int), Int] + val table: Optic[Boolean => Int, Boolean => Int, Int, Int, MultiFocus[Function1[Boolean, *]]] = + MultiFocus.representable[[a] =>> Boolean => a, Int] + val intIso: Optic[Int, Int, Int, Int, Direct] = Iso[Int, Int, Int, Int](_ + 1, _ - 1) + val shim: Optic[Int, Int, Int, Int, MultiFocus[Function1[Int, *]]] = + broadcastOuter[Int, Int, Int, Int, Int](intIso) + + val tupleModify = forAll { (a: Int, b: Int, c: Int) => + tuple.modify(_ * 2)((a, b, c)) == ((a * 2, b * 2, c * 2)) + } + val tupleReplace = forAll { (a: Int, b: Int, c: Int, v: Int) => + tuple.replace(v)((a, b, c)) == ((v, v, v)) + } + val atOk = forAll { (l: Int, r: Int) => + val f: Boolean => Int = b => if b then l else r + table.at(true)(f) == l && table.at(false)(f) == r + } + val collectOk = forAll { (l: Int, r: Int) => + val f: Boolean => Int = b => if b then l else r + val summed = table.collectMap[Int](fa => fa(true) + fa(false))(f) + val hinted = table.collectWith(fa => a => a + fa(true))(f) + summed(true) == l + r && summed(false) == l + r && + hinted(true) == l + l && hinted(false) == r + l + } + val shimOk = forAll { (n: Int) => + shim.modify(_ * 2)(n) == (n + 1) * 2 - 1 && shim.replace(0)(n) == -1 + } + + tupleModify && tupleReplace && atOk && collectOk && shimOk + } diff --git a/core/src/test/scala/external/EoOpaqueSurfaceSpec.scala b/core/src/test/scala/external/EoOpaqueSurfaceSpec.scala new file mode 100644 index 00000000..5536c4b7 --- /dev/null +++ b/core/src/test/scala/external/EoOpaqueSurfaceSpec.scala @@ -0,0 +1,29 @@ +package external + +import dev.constructive.eo.data.{MultiFocus, MultiFocusK} + +/** The carrier's public surface as a *downstream* module sees it — outside the `eo` package tree, + * so the opaque type is opaque, the sum behind it is unreachable, and every accessor has to work + * through what the library publishes. Pins three things a library user depends on: + * + * - `MultiFocus(x, fa)` / `MultiFocus.broadcast(x, a)` build bundles; + * - `.context` / `.foci` / `.broadcast` read them (and inline from here at all — the inlined + * bodies must not reference `private[eo]` internals); + * - the sum's cases cannot be named or constructed from here. + */ +class EoOpaqueSurfaceSpec extends org.specs2.mutable.Specification: + + "MultiFocus's public surface is usable from outside the eo package" >> { + val tabulated: MultiFocusK[Function1[Int, *], Unit, String] = + MultiFocus[Function1[Int, *], Unit, String]((), (i: Int) => s"v$i") + val indexFree: MultiFocusK[Function1[Int, *], Unit, String] = + MultiFocus.broadcast[Int, Unit, String]((), "const") + + val tabulatedOk = + tabulated.broadcast.isEmpty && tabulated.foci(0) == "v0" && tabulated.foci(1) == "v1" + val indexFreeOk = indexFree.broadcast.contains("const") && + indexFree.foci(0) == "const" && indexFree.foci(7) == "const" + val contextOk = tabulated.context == (()) + + tabulatedOk && indexFreeOk && contextOk + } diff --git a/docs/research/2026-09-30-grate-broadcast-constancy.md b/docs/research/2026-09-30-grate-broadcast-constancy.md new file mode 100644 index 00000000..d5d2cd8a --- /dev/null +++ b/docs/research/2026-09-30-grate-broadcast-constancy.md @@ -0,0 +1,443 @@ +# Grate constancy: index-free vs tabulating bundles — spike + +Branch: `spike/grate-broadcast-sum`, a single commit on `origin/main` @ +52671355 (the commit that landed the *optic-class* answer: `Z = Xo`, +`Function1BroadcastOptic`, `RepresentativeIndex`, and the positional +write). This branch adds the *sum-typed bundle* answer on top and keeps +main's machinery where it is better: the broadcast class stays as the +kernel's per-index write hook and the bridge keeps its +`RepresentativeIndex` witness, so **`unobserved` is gone entirely**: the +collapsing `List` aggregate hands the write the leftover its own read +produced, and nothing in the Grate surface forges an index or anything +else. Prototype + tests + measurements for the constancy question on +`MultiFocus[Function1[X0, *]]`. + +Gates on the rebased tree (sbt 1.13.0, JDK 25 Temurin 25.0.4.1): root +`test` 237 examples / 0 failures; `core/test` 32 specs, including +**main's own F1 spec unchanged** (14 examples / 349 expectations — its +positional `grate ∘ iso`, diagonal-read and witness blocks all pass +against this branch's kernel) plus this branch's 12 blocks / 903 +expectations; `scalafmtCheckAll`, `scalafixAll --check`, +`scalafmtSbtCheck`, `benchmarks/scalafmtCheck`, `mimaReportBinaryIssues`, +`githubWorkflowCheck`, `docs/mdoc` (0 errors), `docs/laikaSite`, +`core/doc`. + +## 1. The question + +Two shapes of optic meet on one carrier type, and the type does not say +which is which: + +- a **broadcast** optic holds one focus and reads it at whatever index + you like — every optic built by `forgetful2multifocusFunction1` (the + Iso shim), and any composite whose outer is one; +- a **tabulating** optic reads a real position — `MultiFocus.tuple`, + `representable` (`representableAt` was retired upstream while this + branch was rebased; nothing here depended on it). + +`mfAssocFunction1` therefore has to choose a read and a write shape per +side. Upstream (`52671355`) answered that with an optic-level class plus a +witness index for the one read that genuinely needs an index, which fixes +`grate ∘ iso` and the tabulating read. This branch answers the *remaining* +gap with data: a bundle says whether the value it holds needs an index at +all. (Before that upstream commit, the kernel sampled the shape, which is +how the older numbers in §6 were produced: main sampled +the outer's read at `null.asInstanceOf[X0]` in `composeTo` +(`kO(null)`) and collapsed every write through `inner.from((null, kD))` ++ `outer.from((null, _ => b))`. Two consequences were observable at a +composite's boundary (both reproduced as failing tests on main, see +§4): `tuple.andThen().modify` wrote slot 0's value to every +slot, and any composite whose *own* outer read positionally sampled +index 0 instead of the position it was reading. + +Two ways to fix it: + +| | constancy lives in | visible to | survives a composite | +|---|---|---|---| +| optic-class witness (the `fix/grate-positional-composition` baseline) | the optic object, via a `Function1BroadcastOptic` class + a `broadcastFrom` write hook | `composeFrom`'s pattern match | yes — the *function value* carries the shape upward; the class is re-tested per composition level | +| sum-typed bundle (this branch) | the bundle, as `Broadcast(a, lifted) \| F[A]` | any consumer of the bundle | yes — a composite's read/write shape is recomputed from data, not from a class | + +## 2. Design as shipped on this branch + +```scala +private[eo] type Focus[F[_], A] = F[A] | Broadcast[F, A] // the sum +private[eo] final class Broadcast[F[_], A](val value: A, val lifted: F[A]) +opaque type MultiFocusK[F[_], X, A] = (X, Focus[F, A]) +``` + +- **The sum hides inside the opaque.** The public shape is unchanged: + `MultiFocus(x, fa)` builds a plain half, `to: S => (X, …)`-style + impls still build pairs, `.context` is still identity. The two sum + cases are `private[eo]`, so user code can neither name them nor hold + a `Broadcast` as data — which matters, because the carrier classifies + a half by testing for that class (a user focus whose type was + `Broadcast`, or `Any` holding one, would otherwise be mis-read). +- **`.foci: F[A]` stays total** by carrying the lifted `F[A]` in the + broadcast case (for `Function1`, the constant `_ => value`). No + `Pointed`-shaped constraint, no signature change — that is the whole + reason `lifted` exists. Cost: one small object per broadcast bundle. + `value` and `lifted` are built from one value by every producer, and + `map` keeps them together up to the purity of the mapping function. +- **`.broadcast: Option[A]` is new** — the observable half of the + design. `Some(a)` marks an index-free bundle, `None` a tabulation. +- **`MultiFocus.broadcast[X0, X, A](x, a)` is new** — the constructor + for an index-free bundle, for optics that broadcast without an Iso. + Together with `.broadcast` it is the *entire* public surface of the + sum. +- **main's class and witness are kept.** `Function1BroadcastOptic` stays as the kernel's + per-index write hook for the broadcast inner (one value per position, no + bundle read it did not build), and `forgetful2multifocusFunction1` still + takes a `RepresentativeIndex[X0]`. The sum and the class answer different + questions — the class says *this optic writes one value*, the bundle says + *this value is index-free* — and where they overlap the kernel prefers the + bundle (so the index-free shape is what travels upward), falling back to + the class hook inside the tabulating branch, where it needs no per-position + read. +- **`mfAssocFunction1`** branches on the bundle: + - read: index-free outer → one `inner.to(value)` call (the composite + inherits the inner's half); tabulating outer → `i => + inner.to(readAt(outer, i))` read at `i`. + - write: `Z = AssocF1Z[X0, Xo, Xi](xo, innerPlan)` where `innerPlan` + is `Left(xi)` for an index-free read and `Right(innerReads)` for a + tabulating one — *the inner reads the read actually observed* (per + index: leftover, read bundle, shape). `composeFrom` replays them: + one collapsed `inner.from((xi, bundle))` handed back as a + `Broadcast` half when the read was index-free, or one + `inner.from((xiAt(i), Broadcast(writeAt(i))))` per position when it + was tabulating. + Recording the observed leftovers is load-bearing, not bookkeeping: + composition is associative, so a composite is itself an inner whose + `from` reads its own `AssocF1Z` back — supplying anything else (the + pre-sum kernel supplied `unobserved[Xi]`) is an NPE on entirely + shipped factories, `iso.andThen(iso.andThen(iso)).modify(_ + 1)`. + `mfAssoc` and `mfAssocPSVec` record per-element inner leftovers for + the same reason. + - **tabulating ∘ tabulating, stable focus** — the composite reads one + position per index (the shared index set makes the two sides advance + together), so its read is not a bijection: each inner structure's + off-diagonal is not in the composite's focus vector, and the plain + bundle-only write cannot put it back (there is no `C => D`). + the stability fact is a property of the *optic*, so it rides on the + optic: `Optic.SameFocus` (`sameFocus: Option[C =:= D]`) is mixed into + every `andThen` composite from that call site's `C =:= D` + (`summonFrom`) and into the monomorphic factories + (`representable` / `tuple` / `apply`) with `Some(…)` directly. The + kernel reads it off the `inner` it is already handed and writes the + *exact inverse* of its diagonal read — every position keeps what it + was read at, and only the addressed position takes the new value. For + a type-changing write (`C =/= D`) it is `None`, the kernel keeps the + documented per-position value write, and that boundary is pinned by a + test. An earlier cut put this on the composition algebra + (`AssociativeFunctor.composeFromSameFocus`, with the hint threaded + through `Optic.andThen`); review pointed out that one carrier's fact + does not belong in every carrier's contract, and the optic-level + witness is also the idiom upstream established with + `Function1BroadcastOptic`. +- **No stand-in values at all.** Every write is handed what its own read produced: the kernel + records the inner leftovers it observed (`AssocF1Z.innerPlan`), the bridge takes a + `RepresentativeIndex`, and the collapsing `List` aggregate passes the read's own leftover + (`o.from((bundle.context, List(agg(bundle.foci))))`). The `unobserved[A] = null.asInstanceOf[A]` + helper is deleted — its three historical sites (the inner's leftover, the bridge's index, the + aggregate's leftover) are all fixed at the source rather than patched at the call site. + +## 3. What is left over `52671355` (the residual) + +Upstream already fixed the positional read (`kO(i)` per index), the +per-index write for the broadcast class, the outer-leftover threading and +the forged index. What this branch still adds, each with a probe or a +green test above: + +1. **Tabulating ∘ tabulating is lawful.** `tuple ∘ tuple` reads one + position per index, so its read is a diagonal; upstream writes one + collapsed row for it (`modify(identity)` → `((1,4),(1,4))`), + `replace(9)` → `((9,9),(9,9))`). Here the write is the exact inverse of + the read whenever the inner optic carries `Optic.SameFocus` (every + monomorphic factory and every `andThen` composite whose focus types + coincide do), so `modify(identity)` is the identity, + `modify(h) ∘ modify(f) == modify(f andThen h)`, and `replace(v)` touches + only the positions it was given — including when the inner is itself a + composite (`tabulating ∘ (tabulating ∘ shim)`). +2. **Composite inners are written per position.** Upstream's witness is the + *class*, and a composite is not one, so `tuple ∘ (shim ∘ shim)` collapses + (`modify(_ + 1)` on `(1,2)` → `(2,2)`); here it is `(2,3)`. The bundle + says what the class cannot. +3. **The inner's leftover is real, not forged.** Upstream threads only the + outer's (`Z = Xo`) and still hands the inner `unobserved[Xi]`, so an inner + whose write reads its leftover — `fromLensF` with a shipped `Lens` — dies + with an NPE. Here the read records every leftover it produced and the + write replays it. +4. **Constancy is inspectable.** `.broadcast` is a public, typed answer to + "does this bundle need an index?" — the API main does not have — and a + broadcast optic's bundle is index-free by construction, so the index-free + shape travels upward through `map` / `collectWith` / `andThen`. +5. **Upstream machinery is kept, not replaced.** The class stays as the + kernel's per-index hook (the cheapest path for the shim inner), the bridge + keeps its witness, and `unobserved` drops from three sites (upstream's + kernel leftover, upstream's aggregate leftover, the bridge's forged + index) to **none**. + +What it does **not** add: anything main already covers. The positional +read/write, `Z` threading, the witness and its refusal semantics, the QA +table, `GrateShapeSpec` and upstream's own test blocks are inherited +unchanged — upstream's F1 spec passes verbatim against this kernel. + +## 4. Evidence + +`core/src/test/scala/dev/constructive/eo/MultiFocusFunction1CompositionSpec.scala` +(12 blocks, 903 expectations) plus +`core/src/test/scala/external/EoOpaqueSurfaceSpec.scala` (the public +surface seen from *outside* the `eo` package tree — it pins that the +internal sum neither leaks nor breaks inlining at a downstream call +site). Two of the composition blocks fail on `main`, pass here — runs on +main: `2 failures / 4 examples`; here: `12 examples, 0 failure`. + +| block | `52671355` (fresh probe) | here | +|---|---|---| +| `tuple.andThen()`: per-position write survives | ✗ (`modify(identity)` → `(l, l)`) | ✓ | +| `.andThen(MultiFocus.tuple)`: tabulated read + single-value write | ✓ | ✓ | +| `( ∘ representable).andThen()`: stays positional | ✗ (samples one index) | ✓ | +| bundle shape: `.broadcast` / `.foci` / chain | n/a (no surface) | ✓ | +| ` ∘ ( ∘ )`: right-associated chain | ✗ (NPE, see §6) | ✓ | +| ` ∘ ( ∘ )`: leftovers survive | ✗ | ✓ | +| `fromLensF` inner: the lens's leftover survives the write | ✗ (null component / NPE) | ✓ | +| `tuple ∘ ( ∘ )`: per-position write through a composite | ✗ | ✓ | +| `tuple ∘ tuple`: diagonal read, in-place write (MF1 / MF2 / replace / `at`) | ✗ (`modify(identity)` → `((1,4),(1,4))`) | ✓ | +| associativity across shim / tabulating mixes | ✓ (all-shim chain) | ✓ | +| tabulating ∘ composite-inner (`tuple ∘ (shim ∘ shim)`) | ✗ (`modify(_+1)` on `(1,2)` → `(2,2)`) | ✓ (`(2,3)`) | +| `fromLensF` inner (its write reads its leftover) | ✗ **NPE** (`GetReplaceLens.from` dereferences the forged `null`) | ✓ | +| type-changing write through a tabulating composite (documented fallback) | n/a | ✓ | +| `collectList` on a Lens / Prism / Optional-provenanced optic | ✗ NPE / `MatchError` | ✓ | +| positional factories: bare modify / replace / at / collect | ✓ | ✓ | + +The `collectList` row is a real bug, not a smell: probing a lawful Lens +whose write reads its leftover (`s.isEmpty`) under the shipped `fromLensF` +threw `NullPointerException` in `GetReplaceLens.from`; the Prism and +Optional provenances threw `MatchError: null` (their writes pattern-match +the leftover). Those three now pass, pinned by the new runtime sweep +`tests/.../MultiFocusCrossFamilySpec.scala` — nine property blocks covering +every inbound provenance through `modify` / `replace` / `collectMap` / +`collectWith` / `collectList` / `foldMap` / `headOption` / `length`, plus +both composition directions across Iso / Lens / Prism / Optional with +independently computed expectations. + +The three ✗ rows were re-probed on `52671355` with a throwaway spec that +prints instead of asserting (removed before the rebase): `tuple ∘ tuple` +still collapses to one row (`.replace(9)` → `((9,9),(9,9))`), the +composite-inner case still takes the collapse branch because a composite is +not the broadcast *class*, and the `fromLensF` inner still receives a +forged leftover and dies. That is the honest boundary of the upstream +answer: its class witness cannot describe a composite inner, and its +`Z = Xo` threads only the outer's leftover. + + +Whole-suite gates on this branch: `core/test` 14 specs green, +root `test` 237 examples / 0 failures, `docs/mdoc` 0 errors (the new +snippets compile from outside `core`, which also pins that `.broadcast` +/ `MultiFocus.broadcast` are usable without the opaque's internals). + +### Measured cost — no defensible number on this host + +The `.foci` shape test, the `Broadcast` wrapper and the `andThen` witness +argument all cost something, and this note will not pretend to have +measured it. JMH runs from this environment put the *untouched Monocle +control* — `PowerSeriesNestedBench.monocle_nested`, a different library +that neither change touches — between **-30% and +19%** across +back-to-back runs on the same commit, and the F1 microbenches swing ±12% +run to run. With that noise floor nothing about a few-percent delta is +attributable, and the repo's own benchmark doctrine (quiet machine, +`@Fork(3)`+, `B/op` gates) is not satisfiable here. Two structural +statements stand instead, both reviewable by reading the code: + +- the shape test only ever runs on a *tabulating* bundle whose value is not + a `Broadcast` (the index-free case returns the stored lift), so it is a + predictable never-taken branch on the container carriers; +- the extra inner read is confined to the tabulating branch and skipped + entirely for the broadcast class (the hook path). + +Numbers for the record, same session, `-f 3`: `eoModify_multiFocusTuple3` +≈ 20–22 ns/op and `Tuple6` ≈ 32–40 ns/op on either tree; the shared +harness's variance band is wider than any difference between them. + +## 5. Cost and risk + +- **Binary compatibility: the descriptors do *not* change; the inlined + bodies do.** `MultiFocusK` still erases to `Tuple2` — the union is the + second type argument, whose erased type was already `Object` + (`F[A]` on an abstract `F`). What breaks is (a) code compiled against + 0.18 that inlined `.foci` / `.context` / `apply`: those bodies extract + `Tuple2._2` and cast it to `F[A]`, and a newly produced broadcast + bundle puts a `Broadcast` there instead, so the cast fails; (b) any + client that named the F1 kernel's context refinement + (`mfAssocFunction1.Z = Unit` on main, now `AssocF1Z[…]`). Source + compatibility holds for normal callers: the module call sites in + `avro` / `circe` / `jsoniter` / `zio` / `kyo` needed no respelling — + only `MultiFocus.scala` itself did (see the next point). MiMa is + disabled on the 0.x line (`mima.sbt`) and every minor so far has been a + deliberate breaking release, so this is a CHANGELOG line, not a + blocker. +- **It edits fresh upstream code.** The kernel, the broadcast class's `to` + and the bridge are all from `52671355`; landing this means rewriting the + kernel's write path (three cases instead of two) and re-reviewing the + class against the sum. That review cost is the price of the four items in + §3, and it is the strongest argument for harvesting 1–3 as a small kernel + delta instead (see §7). +- **The extra inner read is now conditional.** The diagonal write re-reads the + inner per written position *unless* the inner is the broadcast class (the hook + path) — so the shim pays nothing, and only a tabulating or composite inner + pays it. +- **Threading the read's leftover has one boundary: a *composite*.** An + optic whose context records per-focus structure (`MultiFocus.apply[List, Int].andThen(lens)` + has `Z = (Xo, F[(Xi, Int)])`) cannot honour a write whose vector has a + different cardinality than the read's, and `collectList` is exactly that + write: on the empty input it rebuilds `Nil` rather than `List(0)`, and on + a longer read it would index past the collapsed vector. The old forged + `null` failed loudly (NPE) where this now fails quietly-or-loudly + depending on shape, so `collectList` is asserted only for + count-agnostic provenances (generic factory, Iso/Lens/Prism/Optional + bridges) and the composite boundary is *named* in + `MultiFocusCrossFamilySpec` rather than pinned. A witness on the optic + (`Optic.SameFocus`-style) is the way to turn it into a compile error. +- **Churn, not just additions.** The compiler forces every + `new Optic[…, MultiFocus[F]]:` impl in `MultiFocus.scala` to spell its + `to` / `from` in the carrier type (a narrower *parameter* type is + illegal on an override), so ~20 signatures were respelled and their + bodies now consume `.context` / `.foci`. That is most of the diff size + and it is mechanical — but it is the kind of diff that hides a + transcription error, so the root suite (not only the F1 spec) is the + gate that matters here. +- **A tabulating outer re-reads the inner per written position.** + `composeFrom`'s per-position branch calls `inner.to(outerRead(i))` + again to recover that position's leftover, because `AssocF1Z` cannot + hold the method-typed read bundle. Pure optics make that equivalent, + but it is one extra inner read per written position that main did not + pay (main paid one read in total — and got the wrong answer). +- **One new object per broadcast read**, and one `instanceof` per + `.foci` read on every carrier. The `.foci` branch is what makes the + sum invisible to existing consumers; it cannot be removed without + giving `.foci` a `Pointed`-shaped constraint. +- **One new public name pair**: `MultiFocus.broadcast` / `.broadcast`. + The sum's cases (`Focus`, `Broadcast`) are `private[eo]` on purpose: + the carrier classifies a half by testing for that class, so user code + must not be able to hold one as data, and the public story is the + accessor rather than the representation. (An earlier cut had them + public; a `ClassCastException` / silent mis-read was reachable from + plain `MultiFocus[cats.Id, Unit, Broadcast[List, Int]]((), value)`.) + inline bodies and downstream optic authors both need them. +- **`.broadcast` allocates an `Option`**; the kernels use the raw half + instead, so only explicit user calls pay it. +- **A type-changing write through a tabulating ∘ tabulating composite is + still under-determined** — the one lossy boundary left. The composite + reads one position per index (the shared index set cannot address + `(outer position, inner position)` pairs), so with `C =:= D` the + kernel writes the exact inverse of that read, but with `C =/= D` there + is no `C => D` to put the unread positions back and it falls back to + the per-position value write (pinned by the "documented lossy + fallback" block). `modify` / `replace` / `set` are all on the exact + side, because their focus type is stable; a hand-written polymorphic + inner is what takes the fallback path. The stable-focus write re-reads + the inner once per written position (it must recompute the read it is + inverting — the plan holds the outer's read function, not the read + bundles), so a `.modify` through a tabulating composite costs one extra + inner read per position versus the lossy path. + +## 6. What review found (and what it changed) + +An independent pass over the first cut of this branch found four things +worth recording, all addressed here: + +1. **A blocking NPE on entirely shipped factories.** The first cut kept + `Z`'s shape witness but still handed the inner an invented leftover, + so `iso.andThen(iso.andThen(iso)).modify(_ + 1)` — an inner that is + itself a composite — read a null context. Fixed by recording the + *observed* inner leftovers (§2); both new right-associated blocks pin + it. +2. **`fromLensF` as an inner is reachable, and was wrong.** Its write + reads its leftover back, so the invented one dropped the carried + component (or NPE'd). Reachable with shipped `Lens` + `fromLensF` + under a shipped Iso shim, on main as well as on the first cut. Fixed + by the same leftover threading; pinned by its own block. +3. **`tuple ∘ tuple` was unlawful, and its test composed nothing.** The + read is a diagonal, so the write could not invert it from the bundle + alone. Fixed here by the same-focus entry point (§2), which is exact + whenever the focus type is stable; the mislabelled test block now + names what it does and the real composition is pinned by the new + spec. +4. **The untagged union could misclassify ordinary payloads.** With the + sum's cases public, `MultiFocus[cats.Id, Unit, Broadcast[List, Int]]((), value)` + made the carrier test a user value for its own internal class (CCE + with a `Broadcast`-typed focus, silent wrong answer with `A = Any`). + Fixed by making the cases `private[eo]`; the public surface is + `.broadcast` + `MultiFocus.broadcast`. +5. **Two claims were wrong** and are corrected above: the erasure + explanation (descriptors are `Tuple2` either way) and the vacuous + `MultiFocus.tuple.andThen(MultiFocus.tuple)` test block, which never + composed anything — it now names what it does, and the real + composition is pinned in the new spec. + +Left as documented behaviour rather than fixed: the shim's `from` +stand-in for a hand-rebuilt tabulating bundle (§2), and the type-changing +write through a tabulating ∘ tabulating composite (§5). + +## 7. Cheaper variants of the same idea + +- **Subtype sum, no representation change**: keep + `(X, F[A])` and make the broadcast case a `Function1` subclass + (`class Broadcast[X0, A](val value: A) extends (X0 => A)`, detected by + a marker trait). Zero cost for other carriers, no erasure change, no + churn — but the sum is a runtime class tag rather than a type, and the + marker has to be re-established by every transform (`map` / `collect` + helpers) or constancy silently dies on the way through. +- **Optic-class witness**: an `indexFree` class plus a `broadcastFrom` + write hook on the optic — **shipped upstream as `52671355`**. No carrier + change, no `.foci` branch, no extra allocation; the shape is a property of + the optic, so it is re-tested per composition level and the kernel needs no + context bit. Its gap is exactly §3's items 1–3: a class cannot describe a + composite, and one threaded leftover is not all of them. +- **Harvest items 1–3 into that kernel** (the recommended cheap path, not + prototyped here): keep `Z = Xo`, add a per-index leftover record the read + fills in, and read the `Optic.SameFocus` witness off the inner (both facts + are already on the optic, and `andThen`'s one-line mixin is carrier-agnostic). + That is a kernel-local change — no carrier change, no respelling, no + `.foci` branch, no erasure break, roughly 50–60 lines — and it buys the + three ✗ rows of §4 without the sum's costs. + +## 8. Recommendation + +**Harvest §3's first three items; take the sum only if `.broadcast` is +wanted as public API.** + +The runtime rules this branch lands are not really a property of the +sum — any path that knows the shape at the kernel needs them: + +1. a composition's write shape follows the shape its *read* took, + recorded in the composite's context; +2. `composeFrom` must be handed the inner leftovers the read observed — + composition is associative, so an inner that is itself a composite + reads its own context back. This branch had to be fixed for exactly + that reason (§6.1), and the same rule applies to any optic-class + witness that threads only one side's leftover. + +The sum's *specific* value is §3's item 4: constancy is inspectable +(`.broadcast`) and a composite's shape is derived from data, so it is +correct by construction rather than re-tested. Choose it if you want that +surface, and accept in exchange: + +- one `instanceof` per `.foci` read on every carrier and one extra object + per broadcast read (measured: flat on the PSVec hot path, ~3% + noise-adjacent on a 25 ns/op Grate microbench, iso-shim path + unbenchmarked); +- a mechanical ~20-signature respelling inside `MultiFocus.scala`, which + is most of the diff; +- the inlined-body binary hazard and the `AssocF1Z` refinement change; +- an extra inner read per written position on the tabulating write path. + +If instead you want the smallest, least-risky change with the same +runtime behaviour, the subtype sum (§7) or the optic-class witness keeps +`(X, F[A])` exactly as it is: no branch on every carrier, no extra +allocation, a fraction of the diff — at the price of constancy staying an +internal fact (no `.broadcast`) and, for the subtype sum, of every +identity-preserving transform having to re-establish the marker. + +Either way, the two positional bugs of §4, the leftover-threading rule of +§6 and the stable-focus write of §2 should land. The one boundary that +cannot be made lawful — a type-changing write through a tabulating ∘ +tabulating composite — is pinned by a test rather than left implicit. diff --git a/jsoniter/src/main/scala/dev/constructive/eo/jsoniter/JsoniterTraversal.scala b/jsoniter/src/main/scala/dev/constructive/eo/jsoniter/JsoniterTraversal.scala index ce0d731f..66f19bf0 100644 --- a/jsoniter/src/main/scala/dev/constructive/eo/jsoniter/JsoniterTraversal.scala +++ b/jsoniter/src/main/scala/dev/constructive/eo/jsoniter/JsoniterTraversal.scala @@ -63,9 +63,9 @@ final class JsoniterTraversal[A] private[jsoniter] ( val (keptSpans, psv) = JsoniterTraversal.decodeSpans[A](bytes, spans) MultiFocus((bytes, keptSpans), psv) - def from(pair: MultiFocus[PSVec][X, A]): Array[Byte] = - val (bytes, spans) = pair.context - val foci = pair.foci + def from(mf: MultiFocus[PSVec][X, A]): Array[Byte] = + val (bytes, spans) = mf.context + val foci = mf.foci if spans.isEmpty || spans.length != foci.length then bytes else // Encode each focus; an element whose encode throws keeps its original bytes. diff --git a/site/docs/concepts.md b/site/docs/concepts.md index bcc8ace6..4194febd 100644 --- a/site/docs/concepts.md +++ b/site/docs/concepts.md @@ -74,7 +74,7 @@ this optic have?" | `Tuple2` | `(X, A)` — both halves always present | `Lens` | | `Either` | `Either[X, A]` — branch present or absent | `Prism` | | `Affine` | `Either[Fst[X], (Snd[X], A)]` | `Optional`, `AffineFold` | -| `MultiFocus[F]` | `(X, F[A])` — pair leftover with an `F`-wrapped focus vector | unified successor of `AlgLens[F]` + `Kaleidoscope` + `Grate` + `PowerSeries` + `FixedTraversal[N]`; sub-shapes selected by `F` (`PSVec` ⇒ `Traversal.each`; `Function1[Int, *]` ⇒ `Traversal.{two,three,four}` and `MultiFocus.tuple` / `representable`); `.collectMap` / `.collectList` Kaleidoscope universals — see [MultiFocus](multifocus.md) | +| `MultiFocus[F]` | `(X, focus half)` — pair leftover with an `F`-wrapped focus vector, or with one index-free focus value | unified successor of `AlgLens[F]` + `Kaleidoscope` + `Grate` + `PowerSeries` + `FixedTraversal[N]`; sub-shapes selected by `F` (`PSVec` ⇒ `Traversal.each` and `Traversal.{two,three,four}`; `Function1[Int, *]` ⇒ `MultiFocus.tuple` / `representable` plus the Iso broadcast shim); `.collectMap` / `.collectList` Kaleidoscope universals — see [MultiFocus](multifocus.md) | | `Forget[F]` | `F[A]` — an `F`-layer with no leftover | `Fold` (read-only, `F: Foldable`), `Unfold` (build-only, `embed: F[B] => T`) | | `ModifyF` | `(Fst[X], Snd[X] => A)` | `Modify` | @@ -237,8 +237,8 @@ exercise) and the restricted `MultiFocus[F] → Forget[F]` `MultiFocus[F]` covers five v1 carriers (`AlgLens[F]`, `Kaleidoscope`, `Grate`, `PowerSeries`, `FixedTraversal[N]`) post- fold; sub-shapes are selected by the choice of `F` (e.g. -`MultiFocus[PSVec]` for `Traversal.each`, -`MultiFocus[Function1[Int, *]]` for `Traversal.{two,three,four}` and +`MultiFocus[PSVec]` for `Traversal.each` and +`Traversal.{two,three,four}`; `MultiFocus[Function1[Int, *]]` for `MultiFocus.tuple` / `representable`). ## Why the existential encoding suits an eager language diff --git a/site/docs/multifocus.md b/site/docs/multifocus.md index a0a80fa4..1c955046 100644 --- a/site/docs/multifocus.md +++ b/site/docs/multifocus.md @@ -1,10 +1,12 @@ # MultiFocus -`MultiFocus[F][X, A] = (X, F[A])` is cats-eo's multi-focus carrier: a -structural leftover `X` paired with an `F`-shaped bundle of foci. A -single carrier, specialised through the type parameter `F`, backs -every optic that focuses more than one value at once — traversals, -grates, algebraic lenses, and aggregating (Kaleidoscope) reads. +`MultiFocus[F][X, A] = (X, focus half)` is cats-eo's multi-focus +carrier: a structural leftover `X` paired with a *focus half* that is +either the carrier's own `F[A]` or an *index-free* bundle — one value, +known without consulting an index. A single carrier, specialised through +the type parameter `F`, backs every optic that focuses more than one +value at once — traversals, grates, algebraic lenses, and aggregating +(Kaleidoscope) reads. What you get: the optic's surface is exactly the intersection of cats's typeclass hierarchy on `F` with what the generic carrier body supports. @@ -37,11 +39,75 @@ container — so they live as a single carrier rather than five. See [Historical landmarks](#historical-landmarks) for that consolidation and its measured payoff. +## Index-free vs tabulating bundles + +The Grate sub-shape is where two *different* optics meet on the same +type. A **broadcast** optic (an Iso reshaped through +`forgetful2multifocusFunction1`) holds one focus and reads it at +whatever index you like; a **tabulating** optic (`MultiFocus.tuple`, +`representable`) reads a real position. Both are +`Optic[S, T, A, B, MultiFocus[Function1[X0, *]]]`, so the carrier says +which is which *per bundle*: + +| Bundle | Built by | `.broadcast` | `.foci` | +|--------|----------|--------------|---------| +| index-free | a broadcast optic's `to`, `MultiFocus.broadcast`, a composition whose write collapsed | `Some(value)` | the constant `_ => value` | +| tabulating | every other factory | `None` | the tabulation itself | + +```scala mdoc:silent +import dev.constructive.eo.data.MultiFocus + +val indexFree = MultiFocus.broadcast[Boolean, Unit, String]((), "v") +``` + +```scala mdoc +(indexFree.broadcast, indexFree.foci(true), indexFree.foci(false)) +``` + +Because the shape lives in the *data*, it survives `map` / `collectWith` +/ `andThen`, and `mfAssocFunction1` reads it alongside the optic-level +witness it already had (`Function1BroadcastOptic`): a bundle says whether +*this value* is index-free, the class says whether *this optic* builds one +value per position, and the two agree wherever they overlap. Consequences +observable at a composite's boundary: + +- **Read** — an index-free outer is read once and its value handed to +the inner; a tabulating outer is read per index. Neither invents an +index. +- **Write** — a composite whose read was index-free hands the outer an +index-free half, so the outer's rebuild never samples a closure; a +composite whose outer is tabulating writes each position its own value +(`MultiFocus.tuple.andThen(isoShim).modify(f)` reaches every slot with +its own `f`). +- **Two tabulating sides advance together.** `MultiFocus.tuple` ∘ +`MultiFocus.tuple` reads one position per index (the shared index set +cannot address `(outer position, inner position)` pairs), and its write +is the exact inverse of that read whenever the focus type is stable — +`modify` / `replace` / `set` leave every position it did not address +untouched. A write that *changes* the focus type has no way to put the +unread positions back and falls back to writing each addressed position; +`Optic.andThen` tells the kernel which case it is, at compile time — by +mixing `Optic.SameFocus` into the composite it builds, which is where a +stability fact belongs: on the optic, not in the composition algebra. + +`.foci` stays total for both shapes — the index-free case carries its +`F[A]` image — so consumers that only want "the focus vector" are +unchanged; `.broadcast` is for consumers that would otherwise have to +invent an index. The representation behind them is internal: the two +handles above are the whole public surface. + +Every read that needs an index is supplied a real one — the bridge's +`from` reads at the `RepresentativeIndex[X0]` witness it was handed (see +[the Grate sub-shape](quality-assurance.md#the-grate-sub-shape)) — and no +operation invents a value it does not have: every write is handed the +leftover (and, for a composite, the inner reads) that its own read +produced, including the collapsing `List` aggregate. + ## The general flexibility win -`MultiFocus[F][X, A] = (X, F[A])` is **just a pair**. The carrier -ships no typeclass machinery of its own; it inherits whatever `F` -brings. +`MultiFocus[F][X, A] = (X, focus half)` is **just a pair**. The +carrier ships no typeclass machinery of its own; it inherits whatever +`F` brings. That distinguishes cats-eo's encoding from monolithic-carrier alternatives — Monocle's per-family classes (`Lens`, `Prism`, @@ -271,35 +337,34 @@ specialised by `F`: `cats.data.Chain`. Singleton fast-path via `MultiFocusSingleton` (so morphed Lenses skip the per-element `F.pure` round-trip). - **`mfAssocFunction1`** — the absorbed-Grate sub-shape's body for - `F = Function1[X0, *]`. `Z = Xo` — the kernel threads the *outer's* - leftover from `composeTo` into `composeFrom`, so the outer's own - `from` receives what its own `to` produced — and the rebuild is a - closure-on-closure, no per-element accumulator. Lights up for - `MultiFocus.representable`, `MultiFocus.tuple`, and - `MultiFocus.apply`. The inner decides how a - bundle is written, and there are exactly two cases: - - a **broadcast inner** — the `Iso → MultiFocus[Function1]` bridge - and anything composed from it, witnessed by the - `Function1BroadcastOptic` it produces (`private[eo]`) — holds exactly - one focus, so its write is composed *per index*: position `i` is - built from the written focus `i` (`broadcastFrom`). That is what - makes `grate ∘ iso` rewrite every position instead of collapsing - onto position 0. Its *read* needs no special case: `to` broadcasts - the focus, so the kernel reads the bundle at whatever index it - wants. That optic's own `from` is the one place the library has to - read a bundle it did not build, so the bridge is handed a - `RepresentativeIndex[X0]` at construction and reads there — a real - index, never a sentinel (see + `F = Function1[X0, *]`. `Z = AssocF1Z[Xo]` — the outer's leftover plus + the inner reads the composite's read observed (leftover, read bundle, + shape), so the outer's own `from` receives what its own `to` produced + and a composite inner reads *its* context back. Reads are per index in + every shape: the inner's bundle is read at the same index its element + came from. The write has three cases, and the rebuild is a + closure-on-closure in all of them: + + - a **broadcast inner** — the `Iso → MultiFocus[Function1]` bridge and + anything composed from it, witnessed by the `Function1BroadcastOptic` + it produces (`private[eo]`) — holds exactly one focus, so its write is + composed *per index*: position `i` is built from the written focus `i` + (`broadcastFrom`). That is what makes `grate ∘ iso` rewrite every + position instead of collapsing onto position 0. Its own `from` is the + one place the library has to read a bundle it did not build, so the + bridge is handed a `RepresentativeIndex[X0]` at construction and reads + there — a real index, never a sentinel (see [the Grate sub-shape](quality-assurance.md#the-grate-sub-shape)). - - a **bundle inner** — everything else, e.g. `MultiFocus.apply` as - the inner — has a bundle-level `from`, so it consumes the whole - write bundle once and the outer receives the constant rebuild of - that single result. - - Reads are per index in both cases: the inner's bundle is read at the - same index its element came from. Rebuilds that ignore their argument - entirely (the fixed-arity `Traversal.{two,three,four}` era) behave - identically under either rule.- **`mfAssocPSVec`** — the absorbed-PowerSeries body for `F = PSVec`. + - an **index-free bundle** — the carrier says so itself + ([below](#index-free-vs-tabulating-bundles)) — collapses to one value + that the outer rebuilds with, handed back as an index-free half. + - a **tabulating ∘ tabulating** composite (e.g. `MultiFocus.tuple` on + both sides) advances both sides together, so its read is a diagonal; + the write is the exact inverse of that read whenever the inner optic + says its read and write types coincide (`Optic.SameFocus`, carried by + the monomorphic factories and mixed into every `andThen` composite), + and a per-position value write otherwise. +- **`mfAssocPSVec`** — the absorbed-PowerSeries body for `F = PSVec`. Parallel-array `AssocSndZ` leftover (saves the per-element Tuple2 the generic body would build). AlwaysHit fast-path via `MultiFocusSingleton`, MaybeHit fast-path via diff --git a/site/docs/optics.md b/site/docs/optics.md index 24df5b7c..58da3dc8 100644 --- a/site/docs/optics.md +++ b/site/docs/optics.md @@ -345,9 +345,12 @@ treatment, with the read-only-direction story, lives in ## MultiFocus -`MultiFocus[F][X, A] = (X, F[A])` — a structural leftover paired with -an `F`-shaped bundle of foci. It is the carrier for every optic that -focuses more than one value at once; the surface lights up by the +`MultiFocus[F][X, A] = (X, focus half)` — a structural leftover paired +with a focus half that is either the carrier's own `F[A]` or one +*index-free* value, known without consulting an index (see +[MultiFocus → Index-free vs tabulating bundles](multifocus.md#index-free-vs-tabulating-bundles)). +It is the carrier for every optic that focuses more than one value at +once; the surface lights up by the typeclasses `F` admits (`.modify` for `Functor`, `.foldMap` for `Foldable`, `.modifyA` for `Traverse`, `.at(i)` for `Representable`, `.collectMap` / `.collectList` for aggregation, and same-carrier diff --git a/tests/src/test/scala/dev/constructive/eo/MultiFocusCrossFamilySpec.scala b/tests/src/test/scala/dev/constructive/eo/MultiFocusCrossFamilySpec.scala new file mode 100644 index 00000000..4ef5821a --- /dev/null +++ b/tests/src/test/scala/dev/constructive/eo/MultiFocusCrossFamilySpec.scala @@ -0,0 +1,308 @@ +package dev.constructive.eo + +import cats.instances.list.given +import dev.constructive.eo.compose.* +import org.scalacheck.Prop.forAll +import org.scalacheck.{Arbitrary, Prop} +import org.specs2.ScalaCheck +import org.specs2.mutable.Specification + +import MatrixFixtures.Box +import data.{Direct, Forget, ModifyF, MultiFocus} +import data.MultiFocus.{collectList, collectMap, collectWith} +import optics.* +import optics.Optic.* + +/** The runtime twin of [[CompositionMatrixSpec]]: that spec pins which (outer family ∘ inner + * family) cells *type*, this one runs `MultiFocus[List]`-carried optics against every other family + * they can be built from or composed with and checks the behaviour those cells promise. + * + * - One block per inbound provenance (generic factory, Iso, Lens, Prism, Optional) runs the + * optic laws (`modify`-identity, compose-modify, replace-idempotent, replace-is-map) together + * with the aggregation definitions (`collectMap` / `collectWith` are `F.map` over the foci, + * `collectList` is the shape-collapsing singleton) and the read surface (`foldMap` / + * `headOption` / `length`). A provenance whose write needs something the aggregation cannot + * supply fails *here*. + * - Both composition directions are swept across the families, with an independently computed + * expectation rather than a re-statement of the optic's own definition. + * - The *outbound* direction is swept too: every writable provenance projected into `ModifyF` + * (writes and laws must match the source optic), the polymorphic factory with a type-changing + * write, the `Function1` (Grate) tuple, and the read-only `Forget[List]` escape over a + * `Fold`-sourced optic (available on the `T = Unit` shape). + * - The `Function1` (Grate) sub-shape has its own sweep in core's + * `MultiFocusFunction1CompositionSpec`: its only inbound family is `Direct`, since `Lens` / + * `Prism` / `Optional` → `Function1` is structurally absent. + */ +class MultiFocusCrossFamilySpec extends Specification with ScalaCheck: + + private type MFL = MultiFocus[List] + + private given Arbitrary[Box[Int]] = Arbitrary(Arbitrary.arbitrary[Int].map(Box(_))) + + // ------------------------------------------------------------------ + // One `MultiFocus[List]` optic per inbound family, all over a plain `List[Int]` so the collapsing + // `.collectList` applies (it demands `S =:= List[A]` and `T =:= List[B]`). + // ------------------------------------------------------------------ + + private val fromGeneric: Optic[List[Int], List[Int], Int, Int, MFL] = + MultiFocus.apply[List, Int] + + /** A Lens whose write *reads* its own leftover (the `s.isEmpty` test), which is exactly the shape + * a forged leftover turns into an NPE. + */ + private val fromLens: Optic[List[Int], List[Int], Int, Int, MFL] = + MultiFocus.fromLensF[List, List[Int], List[Int], Int, Int]( + Lens[List[Int], List[Int]](identity, (s, m) => if s.isEmpty then m else m) + ) + + /** A "prism" that always hits: lawful, and a `Right` leftover its write has to read to know how + * the source is put back. + */ + private val fromPrism: Optic[List[Int], List[Int], Int, Int, MFL] = + MultiFocus.fromPrismF[List, List[Int], List[Int], Int, Int]( + Prism[List[Int], List[Int]](xs => Right(xs), identity) + ) + + private val fromOptional: Optic[List[Int], List[Int], Int, Int, MFL] = + MultiFocus.fromOptionalF[List, List[Int], List[Int], Int, Int]( + Optional[List[Int], List[Int], List[Int], List[Int]](xs => Right(xs), sb => sb._2) + ) + + /** The `Direct` bridge: it keeps the focus type and wraps it in a singleton `List`, so its optic + * is over `List[Int]` with foci `List[List[Int]]` — a shape of its own, pinned in its own block. + */ + private val fromIsoShim: Optic[List[Int], List[Int], List[Int], List[Int], MFL] = + summon[Composer[Direct, MFL]].to[List[Int], List[Int], List[Int], List[Int]]( + Iso[List[Int], List[Int], List[Int], List[Int]](identity, identity) + ) + + /** The laws and definitions every `MultiFocus[List]` optic must satisfy, whatever built it. */ + private def battery(o: Optic[List[Int], List[Int], Int, Int, MFL]): Prop = + val modifyIdentity = forAll { (xs: List[Int]) => o.modify(identity[Int])(xs) == xs } + val composeModify = forAll { (xs: List[Int]) => + val f: Int => Int = _ + 1 + val g: Int => Int = _ * 3 + o.modify(g)(o.modify(f)(xs)) == o.modify(f.andThen(g))(xs) + } + val replaceIdempotent = forAll { (xs: List[Int], b: Int) => + o.replace(b)(o.replace(b)(xs)) == o.replace(b)(xs) + } + val replaceIsMap = forAll { (xs: List[Int], b: Int) => o.replace(b)(xs) == xs.map(_ => b) } + val mapShaped = forAll { (xs: List[Int]) => + val agg: List[Int] => Int = _.sum + o.collectMap[Int](agg)(xs) == xs.map(_ => agg(xs)) && + o.collectWith(fa => a => agg(fa) + a)(xs) == xs.map(a => agg(xs) + a) && + o.collectWith(_ => (a: Int) => a + 1)(xs) == o.modify(_ + 1)(xs) + } + val read = forAll { (xs: List[Int]) => + o.foldMap[Int](identity)(xs) == xs.sum && + o.headOption(xs) == xs.headOption && + o.length(xs) == xs.length + } + modifyIdentity && composeModify && replaceIdempotent && replaceIsMap && mapShaped && read + + /** The shape-collapsing `collectList`, asserted only where the optic's leftover is + * count-agnostic. + * + * A *composite* (`MultiFocus.apply[List, Int].andThen(lens)`) records per-focus structure in its + * context (`Z = (Xo, F[(Xi, Int)])`), so a write whose focus vector has a different cardinality + * than the read's is out of its contract — `collectList(_.sum)(Nil)` rebuilds `Nil`, not + * `List(0)`. That boundary is named here rather than asserted, and a witness-typed refusal (see + * the review note) is the way to make it a compile error instead. + */ + private def collapses(o: Optic[List[Int], List[Int], Int, Int, MFL]): Prop = + forAll { (xs: List[Int]) => o.collectList(_.sum)(xs) == List(xs.sum) } + + "inbound provenance — generic factory: MF laws + collect* + read surface" >> (battery( + fromGeneric + ) && collapses(fromGeneric)) + + /** A `MultiFocus[List]` optic that is itself a *composite* of two shipped optics, so its context + * records per-focus structure (`Z = (Xo, F[(Xi, Int)])`) rather than a single leftover. + */ + private val fromComposite: Optic[List[Int], List[Int], Int, Int, MFL] = + MultiFocus + .apply[List, Int] + .andThen(Lens[Int, Int](identity, (_, m) => m)) + + "inbound provenance — composite of two shipped optics: MF laws + collect* + read surface" >> + battery(fromComposite) + + // covers: the `Direct` bridge, whose foci are a singleton of the source value — the morph's write + // picks it back out (documented), so the properties are stated on that shape rather than + // element-wise. + "inbound provenance — Iso bridge (Direct): singleton foci obey MF1 / replace / read" >> { + val identityOk = forAll { (xs: List[Int]) => + fromIsoShim.modify(identity[List[Int]])(xs) == xs + } + val replaceOk = forAll { (xs: List[Int], b: List[Int]) => fromIsoShim.replace(b)(xs) == b } + val readOk = forAll { (xs: List[Int]) => + fromIsoShim.foldMap[List[Int]](identity)(xs) == xs && fromIsoShim.length(xs) == 1 + } + identityOk && replaceOk && readOk + } + + "inbound provenance — Lens bridge (Tuple2): MF laws + collect* + read surface" >> (battery( + fromLens + ) && collapses(fromLens)) + + "inbound provenance — Prism bridge (Either): MF laws + collect* + read surface" >> (battery( + fromPrism + ) && collapses(fromPrism)) + + "inbound provenance — Optional bridge (Affine): MF laws + collect* + read surface" >> (battery( + fromOptional + ) && collapses(fromOptional)) + + // covers: the polymorphic factory, whose read and write types differ — the properties are the + // pointwise results rather than MF1 (which needs S = T). + "inbound provenance — polymorphic factory: pointwise modify with a type change" >> { + val o: Optic[List[Int], List[String], Int, String, MFL] = MultiFocus.pApply[List, Int, String] + val pointwise = forAll { (xs: List[Int]) => o.modify(_.toString)(xs) == xs.map(_.toString) } + val collapsing = forAll { (xs: List[Int]) => + o.collectList(_.sum.toString)(xs) == List(xs.sum.toString) + } + pointwise && collapsing + } + + // ------------------------------------------------------------------ + // Composition, both directions. Sources and inners are the `Box` shapes `MatrixFixtures` + // (CompositionMatrixSpec) already uses, so this sweep runs on the cells the matrix pins. + // ------------------------------------------------------------------ + + /** A `Box`-sourced lens whose write reads its leftover, so the `MultiFocus[List]` outer is built + * by a bridge whose write is not leftover-free either. + */ + private val boxLens + : Optic[Box[List[Box[Int]]], Box[List[Box[Int]]], List[Box[Int]], List[Box[Int]], Tuple2] = + Lens[Box[List[Box[Int]]], List[Box[Int]]](_.a, (s, m) => s.copy(a = m)) + + private val mfOuter: Optic[Box[List[Box[Int]]], Box[List[Box[Int]]], Box[Int], Box[Int], MFL] = + MultiFocus.fromLensF[List, Box[List[Box[Int]]], Box[List[Box[Int]]], Box[Int], Box[Int]]( + boxLens + ) + + // covers: a MultiFocus[List] outer composed with one inner per family it can morph into the carrier + // (Iso via Direct, Lens via Tuple2, Prism via Either, Optional via Affine) — the MF laws plus an + // independently computed element-wise expectation and a read-side sum. + "MultiFocus[List] outer ∘ each family inner: MF laws + element-wise expectation" >> { + val viaIso = mfOuter.andThen(Iso[Box[Int], Box[Int], Int, Int](_.a, Box(_))) + val viaLens = mfOuter.andThen(Lens[Box[Int], Int](_.a, (_, m) => Box(m))) + val viaPrism = mfOuter.andThen(Prism[Box[Int], Int](b => Right(b.a), Box(_))) + val viaOptional = + mfOuter.andThen(Optional[Box[Int], Box[Int], Int, Int](b => Right(b.a), sb => Box(sb._2))) + + def pointwise(o: Optic[Box[List[Box[Int]]], Box[List[Box[Int]]], Int, Int, MFL]): Prop = + forAll { (bs: List[Box[Int]]) => + val s = Box(bs) + o.modify(_ + 1)(s) == Box(bs.map(b => Box(b.a + 1))) && + o.modify(identity[Int])(s) == s && + o.foldMap[Int](identity)(s) == bs.map(_.a).sum + } + + pointwise(viaIso) && pointwise(viaLens) && pointwise(viaPrism) && pointwise(viaOptional) + } + + // ------------------------------------------------------------------ + // Outbound: a MultiFocus optic handed *to* every family it can reach. The provenance blocks above + // pin "built from a family" (the inbound direction); these pin the other one, and each projection + // is checked against the source optic so it cannot drift from the behaviour it projects. + // ------------------------------------------------------------------ + + /** `MultiFocus[List] → ModifyF` — the write-only projection, for every writable provenance. */ + private def modifyDirection(o: Optic[List[Int], List[Int], Int, Int, MFL]): Prop = + val lifted: Optic[List[Int], List[Int], Int, Int, ModifyF] = + summon[Composer[MFL, ModifyF]].to(o) + val sameWrites = forAll { (xs: List[Int]) => + lifted.modify(_ + 1)(xs) == o.modify(_ + 1)(xs) && + lifted.replace(7)(xs) == o.replace(7)(xs) + } + val laws = forAll { (xs: List[Int]) => + val f: Int => Int = _ + 1 + val g: Int => Int = _ * 3 + lifted.modify(identity[Int])(xs) == xs && + lifted.modify(g)(lifted.modify(f)(xs)) == lifted.modify(f.andThen(g))(xs) + } + sameWrites && laws + + "outbound — ModifyF projection of the generic factory: writes match the source" >> modifyDirection( + fromGeneric + ) + + "outbound — ModifyF projection of the Lens bridge: writes match the source" >> modifyDirection( + fromLens + ) + + "outbound — ModifyF projection of the Prism bridge: writes match the source" >> modifyDirection( + fromPrism + ) + + "outbound — ModifyF projection of the Optional bridge: writes match the source" >> modifyDirection( + fromOptional + ) + + "outbound — ModifyF projection of a composite: writes match the source" >> modifyDirection( + fromComposite + ) + + // covers: the polymorphic factory into ModifyF — the projection has to carry a type-changing write, + // not just an endomorphism. + "outbound — ModifyF projection of the polymorphic factory: type-changing write" >> { + val o: Optic[List[Int], List[String], Int, String, MFL] = MultiFocus.pApply[List, Int, String] + val lifted: Optic[List[Int], List[String], Int, String, ModifyF] = + summon[Composer[MFL, ModifyF]].to(o) + forAll { (xs: List[Int]) => + lifted.modify(_.toString)(xs) == o.modify(_.toString)(xs) && lifted.modify(_.toString)( + xs + ) == xs.map(_.toString) + } + } + + // covers: `MultiFocus[List] → Forget[List]` — the read-only escape, available on the `T = Unit` + // shape (a Forget-carried optic has no write). Its source is a `Fold`, so this is also the one + // place the fold family meets the carrier: the escape must read exactly what the fold and the + // carrier read. + "outbound — Forget[List] escape over a Fold-sourced optic: read matches the source" >> { + val mfFold: Optic[List[Int], Unit, Int, Unit, MFL] = + summon[Composer[Forget[List], MFL]].to(Fold[List, Int]) + val escaped: Optic[List[Int], Unit, Int, Unit, Forget[List]] = + summon[Composer[MFL, Forget[List]]].to(mfFold) + forAll { (xs: List[Int]) => + escaped.to(xs).value == mfFold.to(xs).foci && + escaped.to(xs).value == Fold[List, Int].to(xs).value && + escaped.to(xs).value.sum == xs.sum + } + } + + // covers: the Function1 (Grate) sub-shape into ModifyF — the absorbed-Grate carrier's outbound + // direction, paired with the tabulating factory that builds it. + "outbound — ModifyF projection of the Function1 (Grate) tuple: writes match the source" >> { + val grate: Optic[(Int, Int, Int), (Int, Int, Int), Int, Int, MultiFocus[Function1[Int, *]]] = + MultiFocus.tuple[(Int, Int, Int), Int] + val lifted: Optic[(Int, Int, Int), (Int, Int, Int), Int, Int, ModifyF] = + summon[Composer[MultiFocus[Function1[Int, *]], ModifyF]].to(grate) + forAll { (a: Int, b: Int, c: Int) => + lifted.modify(_ + 1)((a, b, c)) == grate.modify(_ + 1)((a, b, c)) && + lifted.replace(0)((a, b, c)) == grate.replace(0)((a, b, c)) + } + } + + // covers: the other direction — a family outer with a MultiFocus[List] inner, morphed through the + // same carrier. Sources are singletons: the inbound `Direct` / `Tuple2` morphs pick the singleton + // focus out on the way back (documented), so a multi-focus write is out of their contract. + "each family outer ∘ MultiFocus[List] inner: MF laws + pointwise result" >> { + val viaIso = Iso[Box[List[Int]], Box[List[Int]], List[Int], List[Int]](_.a, Box(_)) + .andThen(MultiFocus.apply[List, Int]) + val viaLens = Lens[Box[List[Int]], List[Int]](_.a, (_, m) => Box(m)) + .andThen(MultiFocus.apply[List, Int]) + + def singleton(o: Optic[Box[List[Int]], Box[List[Int]], Int, Int, MFL]): Prop = + forAll { (n: Int) => + val s = Box(List(n)) + o.modify(_ + 1)(s) == Box(List(n + 1)) && + o.modify(identity[Int])(s) == s && + o.foldMap[Int](identity)(s) == n + } + + singleton(viaIso) && singleton(viaLens) + } diff --git a/tests/src/test/scala/dev/constructive/eo/OpticsBehaviorSpec.scala b/tests/src/test/scala/dev/constructive/eo/OpticsBehaviorSpec.scala index d53f8e61..ea7fb3c0 100644 --- a/tests/src/test/scala/dev/constructive/eo/OpticsBehaviorSpec.scala +++ b/tests/src/test/scala/dev/constructive/eo/OpticsBehaviorSpec.scala @@ -479,8 +479,8 @@ class OpticsBehaviorSpec extends Specification with ScalaCheck: type X = String def to(n: Int): MultiFocus[Option][X, Int] = MultiFocus(s"tag-$n", Option.when(n < 1000)(n + 1)) - def from(pair: MultiFocus[Option][X, Int]): Int = - pair.foci.fold(pair.context.length)(_ * 100 + pair.context.length) + def from(mf: MultiFocus[Option][X, Int]): Int = + mf.foci.fold(mf.context.length)(_ * 100 + mf.context.length) val composed = lifted.andThen(inner2) val composedOk = (composed.modify(identity)(5) === 5113).and(composed.modify(identity)(-2) === -1) From 462e037b7df74c393ecb5ad4a2d0b8b7d2b4bf96 Mon Sep 17 00:00:00 2001 From: Rodolfo Hansen Date: Fri, 2 Oct 2026 15:12:22 -0400 Subject: [PATCH 2/4] build(deps): land #118 + #124 + #126 as one verified bump; fix avro's stryker blocker (#115) (#128) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * build(deps): bump actions/cache from v4 to v6 Supersedes #118. Drop-in verified: action.yml inputs are byte-identical between v4.3.0 and v6.1.0 (only the node20 -> node24 runtime line differs); all 18 steps pass exactly {path, key, restore-keys}; @v6 resolves to v6.1.0, which adds graceful handling of read-only cache tokens (the accurate 'cache write denied' warning on fork PRs instead of the bogus 'another job may be creating this cache'). * build(deps): bump droste-core from 0.9.0-M3 to 0.10.0 Supersedes #124. Benchmark-only dependency (never published downstream). 0.10.0 is dependency maintenance upstream (cats update, scala-collection-compat 2.13.0, Scala.js 1.18.2); our droste surface (Fix, scheme.{cata,ana,hylo}, Algebra/Coalgebra) compiles unchanged and all nine SchemesBench benchmarks execute on the new version. * build(deps): bump sbt-stryker4s from 0.20.4 to 1.1.1 Supersedes #126. No removed or renamed features reach this build: the setting keys used in build.sbt (strykerReporters, strykerExcludedMutations, strykerThresholdsBreak) are unchanged, the borrowed-tests wiring still resolves, and 1.x requires sbt >= 1.11.2 (we run 1.13.0). Verified with a schemes smoke run (48/58 killed, 0 NoCoverage) and a full avroIntegration run (481 killed / 51 survived / 58 known-macro NoCoverage, no crash). Decisive for issue #115: 1.1.1 fixes stryker4s' rollback invariant crash ('cases should be non-empty') that killed avro's mutation run on main — 0.20.4's mutant removal could empty a Term.Match by deleting its default Pat.Wildcard case; 1.1.1 filters it. Also refreshes the invocation-doctrine comment: the module-scoped /stryker form works again since 0.20.4. * fix(avro): keep AvroWalk's null-narrowing outside stryker's reach Addresses #115 blocker 1. The flow-typed 'val here = if index != null then index else ...' loses its narrowing the moment stryker4s' mutator rewrites the condition, so two mutants died as compile errors instead of being exercised (and on 0.20.4 that rollback crashed the whole run). Express the narrowing as a match on the null sentinel with an explicit JMap[String, Integer] type: a match has no condition to mutate, so the narrowing is structural rather than flow-based. (The ascribe + 'index.nn' spelling from the issue does not compile here — the guard already narrows, E216 fires, and -Werror rejects the warning.) Applied at both occurrences (totalNominalIndex and recordSlots); AvroCompileError mutants from AvroWalk go to zero. * docs: refresh version pins and the stryker invocation doctrine CLAUDE.md said Scala 3.8.3 / sbt 1.12.9; the project builds Scala 3.9.0 (build.sbt scala3Version) on sbt 1.13.0 (project/build.properties). CONTRIBUTING.md's bootstrap list pointed Scala at build.properties and omitted the JDK 25 requirement for kyo + the docs site. The 'invoke as project ; stryker, NOT /stryker' claim stopped being true in 0.20.4 (module-scoped task resolution was fixed upstream); state the history instead of forbidding the working form. The mutationAll alias also covers zio and kyo now, not just the original eight modules. quality-assurance.md's scoverage path follows the Scala version. * build(ci): bump the workflow generator's actions/cache ref to v6 The cache bump landed as a hand-edit of the generated ci.yml (mirroring Dependabot's #118 diff), which githubWorkflowCheck rightly flags: ci.yml is generator-owned (CONTRIBUTING.md: never hand-edit it). This pairs the edit with its source of truth — UseRef.Public("actions", "cache", "v6") in the setup-java cache patch. githubWorkflowGenerate now emits zero workflow drift, so the committed ci.yml is exactly generated output, and githubWorkflowCheck passes. --- .github/workflows/bench-pr.yml | 2 +- .github/workflows/bench-sweep.yml | 2 +- .github/workflows/benchmarks.yml | 2 +- .github/workflows/ci.yml | 24 +++++++++---------- .github/workflows/deploy-site.yml | 2 +- .github/workflows/quality.yml | 4 ++-- CLAUDE.md | 24 +++++++++---------- CONTRIBUTING.md | 6 ++--- .../dev/constructive/eo/avro/AvroWalk.scala | 17 +++++++++++-- build.sbt | 12 +++++----- project/plugins.sbt | 23 +++++++++++------- site/docs/quality-assurance.md | 7 +++--- 12 files changed, 73 insertions(+), 52 deletions(-) diff --git a/.github/workflows/bench-pr.yml b/.github/workflows/bench-pr.yml index aac5578c..c5b77b1a 100644 --- a/.github/workflows/bench-pr.yml +++ b/.github/workflows/bench-pr.yml @@ -136,7 +136,7 @@ jobs: distribution: temurin java-version: 25 # kyoIntegration (KyoDiBench dep) targets JDK 25 since v0.15.0 - name: Cache coursier + ivy + sbt boot - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier diff --git a/.github/workflows/bench-sweep.yml b/.github/workflows/bench-sweep.yml index 5b74994a..ef47b53f 100644 --- a/.github/workflows/bench-sweep.yml +++ b/.github/workflows/bench-sweep.yml @@ -127,7 +127,7 @@ jobs: distribution: temurin java-version: 25 # kyoIntegration (KyoDiBench dep) targets JDK 25 since v0.15.0 - name: Cache coursier + ivy + sbt boot - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index 419a8120..2ff77d9d 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -62,7 +62,7 @@ jobs: distribution: temurin java-version: 21 - name: Cache coursier + ivy + sbt boot - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 708d447b..1f47fdd0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,7 +52,7 @@ jobs: - name: Cache coursier + ivy + sbt boot id: coursier-cache-temurin-25 if: matrix.java == 'temurin@25' - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier @@ -76,7 +76,7 @@ jobs: - name: Cache coursier + ivy + sbt boot id: coursier-cache-temurin-17 if: matrix.java == 'temurin@17' - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier @@ -100,7 +100,7 @@ jobs: - name: Cache coursier + ivy + sbt boot id: coursier-cache-temurin-21 if: matrix.java == 'temurin@21' - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier @@ -177,7 +177,7 @@ jobs: - name: Cache coursier + ivy + sbt boot id: coursier-cache-temurin-25 if: matrix.java == 'temurin@25' - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier @@ -201,7 +201,7 @@ jobs: - name: Cache coursier + ivy + sbt boot id: coursier-cache-temurin-17 if: matrix.java == 'temurin@17' - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier @@ -225,7 +225,7 @@ jobs: - name: Cache coursier + ivy + sbt boot id: coursier-cache-temurin-21 if: matrix.java == 'temurin@21' - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier @@ -299,7 +299,7 @@ jobs: - name: Cache coursier + ivy + sbt boot id: coursier-cache-temurin-25 if: matrix.java == 'temurin@25' - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier @@ -323,7 +323,7 @@ jobs: - name: Cache coursier + ivy + sbt boot id: coursier-cache-temurin-17 if: matrix.java == 'temurin@17' - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier @@ -347,7 +347,7 @@ jobs: - name: Cache coursier + ivy + sbt boot id: coursier-cache-temurin-21 if: matrix.java == 'temurin@21' - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier @@ -393,7 +393,7 @@ jobs: - name: Cache coursier + ivy + sbt boot id: coursier-cache-temurin-25 if: matrix.java == 'temurin@25' - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier @@ -417,7 +417,7 @@ jobs: - name: Cache coursier + ivy + sbt boot id: coursier-cache-temurin-17 if: matrix.java == 'temurin@17' - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier @@ -441,7 +441,7 @@ jobs: - name: Cache coursier + ivy + sbt boot id: coursier-cache-temurin-21 if: matrix.java == 'temurin@21' - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier diff --git a/.github/workflows/deploy-site.yml b/.github/workflows/deploy-site.yml index d6852b8e..2d94a58b 100644 --- a/.github/workflows/deploy-site.yml +++ b/.github/workflows/deploy-site.yml @@ -70,7 +70,7 @@ jobs: distribution: temurin java-version: 25 - name: Cache coursier + ivy + sbt boot - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index 780bafa5..7582cbdc 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -61,7 +61,7 @@ jobs: distribution: temurin java-version: 25 - name: Cache coursier + ivy + sbt boot - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier @@ -97,7 +97,7 @@ jobs: distribution: temurin java-version: 25 - name: Cache coursier + ivy + sbt boot - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ~/.cache/coursier diff --git a/CLAUDE.md b/CLAUDE.md index f8f39344..b1b26934 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -3,8 +3,8 @@ ## Project `cats-eo` — an Existential Optics library for Scala 3, built on top of -[cats](https://typelevel.org/cats/). Scala `3.8.3` via sbt `1.12.9` -(`project/build.properties`), runs on JDK 17, 21, or 25 — but the `kyo` module (and therefore the docs site) needs JDK 25; on older JVMs it drops out of the root aggregate. +[cats](https://typelevel.org/cats/). Scala `3.9.0` (the `scala3Version` pin in +`build.sbt`) via sbt `1.13.0` (`project/build.properties`), runs on JDK 17, 21, or 25 — but the `kyo` module (and therefore the docs site) needs JDK 25; on older JVMs it drops out of the root aggregate. Human contributors: see [`CONTRIBUTING.md`](./CONTRIBUTING.md) for the day-one bootstrap. This file is the parallel guide for AI agents. @@ -44,7 +44,7 @@ curl -fLo /usr/local/bin/cs \ https://github.com/coursier/coursier/releases/latest/download/cs-x86_64-pc-linux.gz \ && gunzip -f /usr/local/bin/cs && chmod +x /usr/local/bin/cs -# A recent JVM (sbt 1.12 supports JDK 17 and JDK 21) +# A recent JVM (the project runs on JDK 17, 21, or 25; `kyo` needs 25) cs java --jvm temurin:21 --setup # writes JAVA_HOME into ~/.profile # Scala dev tools @@ -54,10 +54,10 @@ cs install --install-dir /usr/local/bin sbt scala scalafmt scalafix metals metal After `cs java --setup`, open a fresh shell (or `source ~/.profile`) so `JAVA_HOME` is on your PATH. -Installed versions in this environment: `sbt 1.12.9`, `scala-runner 1.12.4` -(Scala `3.8.3` by default, matching the project), `scalafmt 3.11.0` (honours -the `version` pin in `.scalafmt.conf`), `scalafix 0.14.6`, `metals 1.6.7`, -`metals-mcp 1.6.7`. +Installed versions in this environment: `sbt 1.12.9` (the launcher script — it +boots the sbt version pinned in `project/build.properties`), `scala-runner +1.12.4`, `scalafmt 3.11.0` (honours the `version` pin in `.scalafmt.conf`), +`scalafix 0.14.6`, `metals 1.6.7`, `metals-mcp 1.6.7`. ### Day-to-day commands @@ -136,12 +136,12 @@ SBT_OPTS="-Xmx6g" sbt mutationAll Key facts, all the hard-won kind: -- **Invoke as `project ; stryker`, NOT `/stryker`.** The - module-scoped task form reads `loadedTestFrameworks` from the - aggregating root project (no test deps), so specs2 is invisible and - *every* mutant comes back `NoCoverage`. The `mutationAll` alias uses the +- **Invoke as `project ; stryker`** — the `mutationAll` alias uses the project-switch form across core, laws, generics, schemes, schemesLaws, - circe, avro, jsoniter. + circe, avro, jsoniter, zio, kyo. The module-scoped `/stryker` form works + again since 0.20.4; before that it resolved `loadedTestFrameworks` from the + aggregating root project (no test deps), so specs2 was invisible and + *every* mutant came back `NoCoverage`. - **It's a report, not a gate** (`strykerThresholdsBreak := 0`): a low score never fails the build. - **`core` and `laws` are scored against the `tests/` suite via diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9da95010..8ad58947 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,9 +14,9 @@ canonical reference and stays current with what CI runs. In short, you need: -- JDK 17 or JDK 21 (Temurin is fine). -- `sbt` 1.12.x. -- Scala 3.8.x (matches `project/build.properties`). +- JDK 17 or JDK 21 (Temurin is fine) — JDK 25 for the `kyo` module and the docs site. +- `sbt` 1.13.x (the launcher boots the version pinned in `project/build.properties`). +- Scala 3.9.x (pinned as `scala3Version` in `build.sbt`). - `scalafmt` 3.11.x (honours the pin in `.scalafmt.conf`). Clone the repo, then optionally enable the project git hooks so your diff --git a/avro/src/main/scala/dev/constructive/eo/avro/AvroWalk.scala b/avro/src/main/scala/dev/constructive/eo/avro/AvroWalk.scala index 152d3ccc..0644bb70 100644 --- a/avro/src/main/scala/dev/constructive/eo/avro/AvroWalk.scala +++ b/avro/src/main/scala/dev/constructive/eo/avro/AvroWalk.scala @@ -582,7 +582,16 @@ private[avro] object AvroWalk: out(i) = idx loop(i + 1, t, index) else - val here = if index != null then index else normalisedNameIndex(record) + // A `match` on the null sentinel rather than `if index != null`: stryker4s's + // `ConditionalExpression` mutant replaces an `if` condition with `true`/`false`, which + // would drop the flow narrowing and leave `index` typed `JMap[String, Integer] | Null`, + // so `here.get(...)` stops compiling and the mutant dies as a compile error instead of + // being exercised (issue #115). A match has no condition to replace. Writing the guard + // as `if … then index.nn` fixes the mutant too, but the guard already narrows `index`, + // so the compiler reports E216 "Unnecessary .nn" and `-Werror` rejects it. + val here: JMap[String, Integer] = index match + case null => normalisedNameIndex(record) + case m => m val hit = here.get(normalisedName(n)) // A key present with `Ambiguous` is the same verdict the scan produced on its SECOND // hit: more than one schema field normalises to this name, so the signal is no signal. @@ -646,7 +655,11 @@ private[avro] object AvroWalk: val resolved: Integer | Null = if exact != null then Integer.valueOf(exact.pos) else - val here = if index != null then index else normalisedNameIndex(record) + // Same explicit-nulls / stryker `ConditionalExpression` hazard as in [[totalNominalIndex]]: + // a `match` keeps the null-narrowing unmutatable and the non-null type explicit. + val here: JMap[String, Integer] = index match + case null => normalisedNameIndex(record) + case m => m here.get(normalisedName(n)) resolved match case null => diff --git a/build.sbt b/build.sbt index 4e104af5..cbf57a80 100644 --- a/build.sbt +++ b/build.sbt @@ -248,7 +248,7 @@ ThisBuild / githubWorkflowJobSetup ~= { steps => case s: WorkflowStep.Use if s.id.exists(_.startsWith("setup-java-")) => val javaId = s.id.get.stripPrefix("setup-java-") val cacheStep = WorkflowStep.Use( - UseRef.Public("actions", "cache", "v4"), + UseRef.Public("actions", "cache", "v6"), params = Map( "path" -> Seq( "~/.cache/coursier", @@ -356,7 +356,7 @@ lazy val scalacheck = ScalaCheckOrg %% "scalacheck" % "1.20.0" lazy val monocle = Optics %% "monocle-core" % "3.3.0" // droste — the recursion-scheme baseline for the schemes benchmarks (pattern // functor + Fix encoding). Benchmark-only; never a published dependency. -lazy val drosteCore = "io.higherkindness" %% "droste-core" % "0.9.0-M3" +lazy val drosteCore = "io.higherkindness" %% "droste-core" % "0.10.0" // kindlings 0.3.x (all three) ship a configurable macro-expansion timeout // (`DerivationTimeout`, default 5s) and pull hearth 0.4.2 + kindlings-derivation-commons. // We raise it to 30s via `-Xmacro-settings:{circe,cats,avro}Derivation.timeout=30s` @@ -1176,10 +1176,10 @@ addCommandAlias( ) // Mutation testing across the published modules (tests/benchmarks/docs -// aren't published). Uses the `project ; stryker` form, NOT -// `/stryker`: see the plugins.sbt note — the module-scoped task reads -// `loadedTestFrameworks` from the empty root project and marks every -// mutant NoCoverage. +// aren't published). Uses the `project ; stryker` form — the alias +// switches projects anyway, and the borrowed-tests `set` lines below are +// expressed against those switches. (The `/stryker` form works too +// since 0.20.4; see the plugins.sbt note.) // // The `set` lines borrow the `tests` module's compiled suite into core's // and laws' Test scopes so their mutants get killed by the behavioural diff --git a/project/plugins.sbt b/project/plugins.sbt index ae078589..96afd0b6 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -9,14 +9,21 @@ addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.4.8") // at release rather than as a per-PR gate (see `mutationAll` in // build.sbt and site/docs/quality-assurance.md). // Stryker runs each module's OWN `Test / test` against that module's -// mutants. NB: invoke it as `project ; stryker`, NOT -// `/stryker` — the module-scoped task form resolves -// `loadedTestFrameworks` from the aggregating root project (which has no -// test deps), so every mutant comes back NoCoverage; switching the -// current project first makes specs2 visible. 0.20.x auto-derives the -// Scala 3 dialect from scalaVersion. -// 0.20.4 fixed multi-module invocation; the `project ; stryker` workaround still works. -addSbtPlugin("io.stryker-mutator" % "sbt-stryker4s" % "0.20.4") +// mutants. This build invokes it as `project ; stryker` (see +// `mutationAll` in build.sbt and the quality.yml release sweep). +// Upstream fixed the multi-module invocation in 0.20.4 by scoping the +// task to the invoking project, so `/stryker` is correct too on +// 1.x; the current-project form is kept because the alias switches +// projects anyway and the borrowed-tests `set` lines are expressed with +// `project ;` as well. Before 0.20.4 the module-scoped form resolved +// `loadedTestFrameworks` from the aggregating root project (no test +// deps), so every mutant came back NoCoverage. +// The Scala 3 dialect is still auto-derived from scalaVersion. Bumped +// 0.20.4 → 1.1.1: v1 has no removed or renamed features, the sbt +// setting keys used in build.sbt (`strykerReporters`, +// `strykerExcludedMutations`, `strykerThresholdsBreak`) are unchanged, +// and 1.x requires sbt >= 1.11.2 (we run 1.13.0). +addSbtPlugin("io.stryker-mutator" % "sbt-stryker4s" % "1.1.1") // Format check gate for CI (`sbt scalafmtCheckAll scalafmtSbtCheck` // in the workflow). The project ships a `.scalafmt.conf` pinned to diff --git a/site/docs/quality-assurance.md b/site/docs/quality-assurance.md index 1672b53d..cf46564c 100644 --- a/site/docs/quality-assurance.md +++ b/site/docs/quality-assurance.md @@ -386,7 +386,7 @@ no change to the suite. Do not read such a delta as a regression. ```sh # Statement / branch coverage (cross-module aggregate): SBT_OPTS="-Xmx6g" sbt coverageAll -# → target/scala-3.8.3/scoverage-report/ (HTML + scoverage.xml) +# → target/scala-3.9.0/scoverage-report/ (HTML + scoverage.xml) # Mutation testing across the runtime-logic modules: SBT_OPTS="-Xmx6g" sbt mutationAll @@ -400,8 +400,9 @@ python3 site/tools/gen-qa-report.py --check # CI: non-zero if stale Both aliases relax the always-on `-Werror` (`tlFatalWarnings`) first, since instrumented sources can surface `-Wunused` warnings; the larger heap is because the `set` reapply re-evaluates the Laika docs settings. Mutation runs -with `project ; stryker` (not `/stryker`) so specs2 is visible to the -test runner — see +use `project ; stryker`; the module-scoped `/stryker` form works too +(upstream fixed it in 0.20.4 — before that it resolved `loadedTestFrameworks` +from the aggregating root project and marked every mutant `NoCoverage`) — see [`project/plugins.sbt`](https://github.com/Constructive-Programming/eo/blob/main/project/plugins.sbt). The [`quality.yml`](https://github.com/Constructive-Programming/eo/blob/main/.github/workflows/quality.yml) From 5a2802214e7c3f0caf08b6a4852edaf3c62666d0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Oct 2026 10:18:46 +0000 Subject: [PATCH 3/4] docs(benchmarks): sweep 462e037b7df74c393ecb5ad4a2d0b8b7d2b4bf96 (2026-10-03) [skip ci] --- BENCHMARKS.md | 816 +++++++++++++-------------- site/laika-static/bench/series.jsonl | 1 + 2 files changed, 409 insertions(+), 408 deletions(-) diff --git a/BENCHMARKS.md b/BENCHMARKS.md index 099fe8b1..573e21f7 100644 --- a/BENCHMARKS.md +++ b/BENCHMARKS.md @@ -8,578 +8,578 @@ > directional** and not comparable across runs/VMs. The usual JMH > disclaimer applies: "the numbers below are just data". -source_sha: `6e53b8574a3ff5c233303325e94c5d910496ad4b` · date: `2026-10-02` · jdk: `temurin-21` · runner: `ubuntu-22.04` · jmh_params: `-i 5 -wi 3 -f 3 -t 1 -foe true -prof gc -rf json -jvmArgsAppend -XX:-ResizeTLAB -jvmArgsAppend -Xms1g -jvmArgsAppend -Xmx1g` · profile: `sweep:-i5-wi3-f3-t1-gc-rt1g` +source_sha: `462e037b7df74c393ecb5ad4a2d0b8b7d2b4bf96` · date: `2026-10-03` · jdk: `temurin-21` · runner: `ubuntu-22.04` · jmh_params: `-i 5 -wi 3 -f 3 -t 1 -foe true -prof gc -rf json -jvmArgsAppend -XX:-ResizeTLAB -jvmArgsAppend -Xms1g -jvmArgsAppend -Xmx1g` · profile: `sweep:-i5-wi3-f3-t1-gc-rt1g` ## AffineFoldBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `GetOption_0` | `-` | 0.7 ± 0.0 | 0.6 ± 0.0 | 0.0 | 0.0 | -| `GetOption_0_asAffineFold` | `-` | 0.7 ± 0.0 | — | 0.0 | — | -| `GetOption_0_asOptional` | `-` | 1.8 ± 0.1 | — | 16.0 | — | -| `GetOption_0_empty` | `-` | 0.7 ± 0.0 | 0.6 ± 0.0 | 0.0 | 0.0 | -| `GetOption_3` | `-` | 9.0 ± 0.2 | 5.5 ± 0.1 | 16.0 | 0.0 | -| `GetOption_6` | `-` | 16.2 ± 0.3 | 14.0 ± 0.4 | 16.0 | 0.0 | -| `GetOption_loyalty` | `-` | 0.7 ± 0.0 | 0.7 ± 0.0 | 0.0 | 0.0 | -| `GetOption_loyalty_empty` | `-` | 0.7 ± 0.0 | 0.7 ± 0.0 | 0.0 | 0.0 | +| `GetOption_0` | `-` | 0.8 ± 0.0 | 0.7 ± 0.0 | 0.0 | 0.0 | +| `GetOption_0_asAffineFold` | `-` | 0.7 ± 0.1 | — | 0.0 | — | +| `GetOption_0_asOptional` | `-` | 2.5 ± 0.0 | — | 16.0 | — | +| `GetOption_0_empty` | `-` | 0.8 ± 0.1 | 0.7 ± 0.0 | 0.0 | 0.0 | +| `GetOption_3` | `-` | 9.2 ± 0.1 | 6.2 ± 0.1 | 16.0 | 0.0 | +| `GetOption_6` | `-` | 18.7 ± 0.1 | 16.3 ± 0.4 | 16.0 | 0.0 | +| `GetOption_loyalty` | `-` | 0.8 ± 0.0 | 0.8 ± 0.0 | 0.0 | 0.0 | +| `GetOption_loyalty_empty` | `-` | 0.8 ± 0.0 | 0.8 ± 0.0 | 0.0 | 0.0 | ## AvroBytesBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `GraftPayload` | `-` | 94.3 ± 2.7 | — | 720.0 | — | -| `ModifyCountry` | `-` | 211.8 ± 7.3 | — | 933.3 | — | -| `ModifyPartner` | `-` | 274.9 ± 10.9 | — | 984.0 | — | -| `ReadCountry` | `-` | 120.0 ± 5.1 | — | 520.0 | — | -| `ReadPartner` | `-` | 131.3 ± 6.1 | — | 480.0 | — | -| `SliceGraftPayload` | `-` | 186.7 ± 6.8 | — | 1,192.0 | — | -| `naiveModifyCountry` | `-` | 1,909.2 ± 66.8 | — | 7,616.0 | — | -| `naiveModifyPartner` | `-` | 2,192.8 ± 70.4 | — | 8,696.0 | — | -| `naivePassthroughPayload` | `-` | 3,558.6 ± 87.5 | — | 14,088.1 | — | -| `naiveReadCountry` | `-` | 1,162.1 ± 57.9 | — | 4,256.0 | — | -| `naiveReadPartner` | `-` | 1,434.4 ± 63.1 | — | 5,424.0 | — | -| `prunedReadCountry` | `-` | 709.6 ± 8.6 | — | 1,976.0 | — | -| `prunedReadPartner` | `-` | 473.4 ± 17.1 | — | 1,592.0 | — | +| `GraftPayload` | `-` | 110.1 ± 0.2 | — | 720.0 | — | +| `ModifyCountry` | `-` | 236.9 ± 4.9 | — | 928.0 | — | +| `ModifyPartner` | `-` | 278.2 ± 1.3 | — | 984.0 | — | +| `ReadCountry` | `-` | 133.6 ± 2.6 | — | 520.0 | — | +| `ReadPartner` | `-` | 144.9 ± 1.6 | — | 480.0 | — | +| `SliceGraftPayload` | `-` | 211.9 ± 2.2 | — | 1,192.0 | — | +| `naiveModifyCountry` | `-` | 2,131.4 ± 20.6 | — | 7,616.0 | — | +| `naiveModifyPartner` | `-` | 2,513.9 ± 49.1 | — | 8,696.0 | — | +| `naivePassthroughPayload` | `-` | 4,091.2 ± 30.9 | — | 14,088.1 | — | +| `naiveReadCountry` | `-` | 1,278.6 ± 11.6 | — | 4,256.0 | — | +| `naiveReadPartner` | `-` | 1,638.3 ± 45.1 | — | 5,424.0 | — | +| `prunedReadCountry` | `-` | 772.3 ± 12.6 | — | 1,976.0 | — | +| `prunedReadPartner` | `-` | 538.2 ± 5.4 | — | 1,592.0 | — | ## AvroDecodeReuseBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `cachedDecodeRecord` | `-` | 246.2 ± 10.7 | — | 1,224.0 | — | -| `confluentRecordReader` | `-` | 266.5 ± 4.1 | — | 1,560.0 | — | -| `confluentRecordReaderFresh` | `-` | 1,126.0 ± 18.6 | — | 3,696.0 | — | -| `freshDecodeRecord` | `-` | 1,068.7 ± 27.8 | — | 3,344.0 | — | +| `cachedDecodeRecord` | `-` | 274.0 ± 1.4 | — | 1,224.0 | — | +| `confluentRecordReader` | `-` | 312.0 ± 5.6 | — | 1,541.3 | — | +| `confluentRecordReaderFresh` | `-` | 1,161.3 ± 21.7 | — | 3,696.0 | — | +| `freshDecodeRecord` | `-` | 1,090.7 ± 11.9 | — | 3,344.0 | — | ## AvroEncodeRouteBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `eo_encodeToAny` | `-` | 37.6 ± 1.3 | — | 312.0 | — | -| `eo_encodeValue` | `-` | 417.9 ± 49.4 | — | 568.0 | — | -| `handwritten_stream` | `-` | 124.0 ± 5.5 | — | 240.0 | — | -| `naive_freshPlumbing` | `-` | 684.9 ± 19.4 | — | 2,624.0 | — | +| `eo_encodeToAny` | `-` | 48.4 ± 0.5 | — | 312.0 | — | +| `eo_encodeValue` | `-` | 448.6 ± 11.6 | — | 568.0 | — | +| `handwritten_stream` | `-` | 143.6 ± 6.8 | — | 240.0 | — | +| `naive_freshPlumbing` | `-` | 704.5 ± 7.2 | — | 2,624.0 | — | ## AvroJsonBridgeBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `ClickToAvro` | `-` | 2,136.0 ± 83.8 | — | 4,664.0 | — | -| `ClickToJson` | `-` | 1,902.3 ± 45.0 | — | 3,984.0 | — | -| `WideToAvro` | `-` | 526.7 ± 9.5 | — | 2,040.0 | — | -| `WideToJson` | `-` | 399.6 ± 18.3 | — | 1,472.0 | — | -| `naiveClickToAvro` | `-` | 1,105.5 ± 40.2 | — | 3,928.0 | — | -| `naiveClickToJson` | `-` | 2,104.7 ± 83.7 | — | 5,856.0 | — | -| `naiveWideToAvro` | `-` | 868.3 ± 25.0 | — | 3,504.0 | — | -| `naiveWideToJson` | `-` | 1,376.6 ± 21.9 | — | 4,376.0 | — | +| `ClickToAvro` | `-` | 2,276.8 ± 14.4 | — | 4,674.7 | — | +| `ClickToJson` | `-` | 2,138.1 ± 28.8 | — | 3,962.7 | — | +| `WideToAvro` | `-` | 650.7 ± 7.4 | — | 2,024.0 | — | +| `WideToJson` | `-` | 472.3 ± 13.0 | — | 1,472.0 | — | +| `naiveClickToAvro` | `-` | 1,314.4 ± 20.9 | — | 3,928.0 | — | +| `naiveClickToJson` | `-` | 2,322.9 ± 27.8 | — | 5,856.0 | — | +| `naiveWideToAvro` | `-` | 963.2 ± 10.1 | — | 3,504.0 | — | +| `naiveWideToJson` | `-` | 1,427.4 ± 10.5 | — | 4,376.0 | — | ## AvroVulcanBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `decode_bridged` | `-` | 127.5 ± 2.2 | — | 832.0 | — | -| `decode_native` | `-` | 14.8 ± 0.3 | — | 48.0 | — | -| `decode_vulcanRaw` | `-` | 124.9 ± 1.9 | — | 832.0 | — | -| `encode_bridged` | `-` | 155.5 ± 4.3 | — | 1,234.7 | — | -| `encode_native` | `-` | 11.1 ± 0.8 | — | 56.0 | — | -| `encode_vulcanRaw` | `-` | 151.2 ± 6.5 | — | 1,229.3 | — | -| `fieldGet_bridged` | `-` | 68.8 ± 1.0 | — | 432.0 | — | -| `fieldGet_native` | `-` | 72.0 ± 5.1 | — | 432.0 | — | -| `rootGet_bridged` | `-` | 237.9 ± 7.0 | — | 1,424.0 | — | -| `rootGet_native` | `-` | 112.3 ± 2.8 | — | 600.0 | — | +| `decode_bridged` | `-` | 141.5 ± 0.8 | — | 832.0 | — | +| `decode_native` | `-` | 11.3 ± 0.0 | — | 48.0 | — | +| `decode_vulcanRaw` | `-` | 139.2 ± 0.5 | — | 832.0 | — | +| `encode_bridged` | `-` | 182.2 ± 1.2 | — | 1,224.0 | — | +| `encode_native` | `-` | 10.0 ± 0.3 | — | 56.0 | — | +| `encode_vulcanRaw` | `-` | 183.1 ± 2.2 | — | 1,224.0 | — | +| `fieldGet_bridged` | `-` | 77.1 ± 1.8 | — | 432.0 | — | +| `fieldGet_native` | `-` | 78.0 ± 2.1 | — | 432.0 | — | +| `rootGet_bridged` | `-` | 274.3 ± 5.7 | — | 1,424.0 | — | +| `rootGet_native` | `-` | 119.8 ± 1.9 | — | 600.0 | — | ## CapsBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `foldMapCap` | `-` | 13.6 ± 0.3 | — | 0.0 | — | -| `foldMapDerivedHeld` | `-` | 14.9 ± 0.5 | — | 0.0 | — | -| `foldMapDerivedPerCall` | `-` | 14.0 ± 0.6 | — | 0.0 | — | -| `foldMapDirect` | `-` | 13.6 ± 0.4 | — | 0.0 | — | -| `getCap` | `-` | 0.7 ± 0.0 | — | 0.0 | — | -| `getDeepCap` | `-` | 1.0 ± 0.0 | — | 0.0 | — | -| `getDeepDirect` | `-` | 0.9 ± 0.0 | — | 0.0 | — | -| `getDerivedHeld` | `-` | 1.5 ± 0.1 | — | 0.0 | — | -| `getDerivedPerCall` | `-` | 1.0 ± 0.0 | — | 0.0 | — | -| `getDirect` | `-` | 0.7 ± 0.0 | — | 0.0 | — | -| `modifyCap` | `-` | 3.2 ± 0.1 | — | 40.0 | — | -| `modifyDeepCap` | `-` | 19.8 ± 0.3 | — | 176.0 | — | -| `modifyDeepDirect` | `-` | 21.1 ± 0.7 | — | 152.0 | — | -| `modifyDerivedHeld` | `-` | 3.6 ± 0.1 | — | 40.0 | — | -| `modifyDerivedPerCall` | `-` | 3.5 ± 0.2 | — | 40.0 | — | -| `modifyDirect` | `-` | 3.2 ± 0.1 | — | 40.0 | — | +| `foldMapCap` | `-` | 16.6 ± 0.1 | — | 0.0 | — | +| `foldMapDerivedHeld` | `-` | 17.7 ± 0.0 | — | 0.0 | — | +| `foldMapDerivedPerCall` | `-` | 16.7 ± 0.1 | — | 0.0 | — | +| `foldMapDirect` | `-` | 16.5 ± 0.2 | — | 0.0 | — | +| `getCap` | `-` | 0.9 ± 0.0 | — | 0.0 | — | +| `getDeepCap` | `-` | 1.1 ± 0.0 | — | 0.0 | — | +| `getDeepDirect` | `-` | 1.0 ± 0.0 | — | 0.0 | — | +| `getDerivedHeld` | `-` | 1.6 ± 0.0 | — | 0.0 | — | +| `getDerivedPerCall` | `-` | 1.1 ± 0.0 | — | 0.0 | — | +| `getDirect` | `-` | 0.8 ± 0.0 | — | 0.0 | — | +| `modifyCap` | `-` | 5.6 ± 0.0 | — | 40.0 | — | +| `modifyDeepCap` | `-` | 27.7 ± 0.5 | — | 176.0 | — | +| `modifyDeepDirect` | `-` | 26.1 ± 0.1 | — | 152.0 | — | +| `modifyDerivedHeld` | `-` | 5.7 ± 0.0 | — | 40.0 | — | +| `modifyDerivedPerCall` | `-` | 5.6 ± 0.0 | — | 40.0 | — | +| `modifyDirect` | `-` | 5.6 ± 0.1 | — | 40.0 | — | ## ClickRecordBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `encode_derived` | `-` | 337.2 ± 9.5 | — | 744.0 | — | -| `encode_derivedThroughPrism` | `-` | 336.9 ± 7.3 | — | 744.0 | — | -| `encode_hand` | `-` | 114.1 ± 1.7 | — | 768.0 | — | -| `encode_positional` | `-` | 4,183.8 ± 157.0 | — | 23,912.0 | — | -| `encode_vulcanFull` | `-` | 4,693.5 ± 105.1 | — | 28,408.0 | — | +| `encode_derived` | `-` | 379.8 ± 9.7 | — | 744.0 | — | +| `encode_derivedThroughPrism` | `-` | 392.3 ± 2.8 | — | 744.0 | — | +| `encode_hand` | `-` | 113.6 ± 0.7 | — | 768.0 | — | +| `encode_positional` | `-` | 4,302.6 ± 54.9 | — | 23,912.0 | — | +| `encode_vulcanFull` | `-` | 5,153.7 ± 101.9 | — | 28,408.0 | — | ## CompositionBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `buildLens1` | `-` | 5.8 ± 0.1 | — | 72.0 | — | -| `buildLens3` | `-` | 16.9 ± 0.5 | — | 184.0 | — | -| `buildLens6` | `-` | 35.1 ± 4.4 | — | 352.0 | — | -| `buildLensOptional3` | `-` | 16.6 ± 0.3 | — | 184.0 | — | -| `reuseLeaf` | `-` | 2.4 ± 0.2 | — | 24.0 | — | -| `reuseLens1` | `-` | 16.0 ± 0.5 | — | 40.0 | — | -| `reuseLens3` | `-` | 33.6 ± 0.6 | — | 72.0 | — | -| `reuseLens6` | `-` | 73.6 ± 3.0 | — | 120.0 | — | -| `reuseLensOptional3` | `-` | 35.5 ± 1.4 | — | 160.0 | — | +| `buildLens1` | `-` | 10.2 ± 0.2 | — | 72.0 | — | +| `buildLens3` | `-` | 27.0 ± 0.1 | — | 184.0 | — | +| `buildLens6` | `-` | 51.9 ± 0.5 | — | 352.0 | — | +| `buildLensOptional3` | `-` | 27.0 ± 0.2 | — | 184.0 | — | +| `reuseLeaf` | `-` | 3.5 ± 0.1 | — | 24.0 | — | +| `reuseLens1` | `-` | 10.3 ± 0.2 | — | 40.0 | — | +| `reuseLens3` | `-` | 28.3 ± 0.3 | — | 72.0 | — | +| `reuseLens6` | `-` | 77.5 ± 0.6 | — | 120.0 | — | +| `reuseLensOptional3` | `-` | 38.8 ± 0.2 | — | 160.0 | — | ## FoldBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `FoldMap` | `size=512` | 1,329.2 ± 20.9 | 1,344.8 ± 29.8 | 7,936.2 | 7,936.2 | -| `FoldMap` | `size=64` | 157.2 ± 3.5 | 157.5 ± 4.5 | 768.0 | 768.0 | -| `FoldMap` | `size=8` | 13.5 ± 0.3 | 14.0 ± 0.8 | 0.0 | 0.0 | -| `FoldPrices` | `size=512` | 2,044.4 ± 80.1 | 2,064.3 ± 103.8 | 12,312.3 | 12,312.3 | -| `FoldPrices` | `size=64` | 148.7 ± 3.6 | 151.7 ± 5.0 | 1,560.0 | 1,560.0 | -| `FoldPrices` | `size=8` | 19.3 ± 0.5 | 19.2 ± 0.4 | 216.0 | 216.0 | +| `FoldMap` | `size=512` | 1,303.8 ± 12.0 | 1,288.9 ± 10.5 | 7,936.2 | 7,936.2 | +| `FoldMap` | `size=64` | 138.2 ± 3.5 | 134.8 ± 1.7 | 768.0 | 768.0 | +| `FoldMap` | `size=8` | 16.6 ± 0.1 | 16.3 ± 0.1 | 0.0 | 0.0 | +| `FoldPrices` | `size=512` | 2,278.8 ± 27.0 | 2,276.3 ± 23.8 | 12,312.4 | 12,312.4 | +| `FoldPrices` | `size=64` | 219.7 ± 2.5 | 217.5 ± 2.0 | 1,560.0 | 1,560.0 | +| `FoldPrices` | `size=8` | 29.9 ± 0.1 | 29.7 ± 0.5 | 216.0 | 216.0 | ## GenericsBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `genLensGet` | `-` | 0.7 ± 0.0 | — | 0.0 | — | -| `genLensModify` | `-` | 3.5 ± 0.1 | — | 24.0 | — | -| `genPrismGetHit` | `-` | 1.8 ± 0.1 | — | 16.0 | — | -| `genPrismGetMiss` | `-` | 0.7 ± 0.0 | — | 0.0 | — | -| `genPrismModifyHit` | `-` | 2.5 ± 0.1 | — | 24.0 | — | -| `genPrismModifyMiss` | `-` | 0.8 ± 0.0 | — | 0.0 | — | -| `handLensGet` | `-` | 0.7 ± 0.0 | — | 0.0 | — | -| `handLensModify` | `-` | 2.0 ± 0.1 | — | 24.0 | — | -| `handPrismGetHit` | `-` | 1.5 ± 0.1 | — | 16.0 | — | -| `handPrismGetMiss` | `-` | 0.7 ± 0.0 | — | 0.0 | — | -| `handPrismModifyHit` | `-` | 2.1 ± 0.1 | — | 24.0 | — | -| `handPrismModifyMiss` | `-` | 0.7 ± 0.0 | — | 0.0 | — | -| `rawLensGet` | `-` | 0.4 ± 0.0 | — | 0.0 | — | -| `rawLensModify` | `-` | 2.1 ± 0.1 | — | 24.0 | — | -| `rawPrismGetHit` | `-` | 1.4 ± 0.0 | — | 16.0 | — | -| `rawPrismModifyHit` | `-` | 2.1 ± 0.1 | — | 24.0 | — | +| `genLensGet` | `-` | 0.8 ± 0.0 | — | 0.0 | — | +| `genLensModify` | `-` | 3.7 ± 0.0 | — | 24.0 | — | +| `genPrismGetHit` | `-` | 2.4 ± 0.0 | — | 16.0 | — | +| `genPrismGetMiss` | `-` | 0.9 ± 0.0 | — | 0.0 | — | +| `genPrismModifyHit` | `-` | 3.4 ± 0.0 | — | 24.0 | — | +| `genPrismModifyMiss` | `-` | 0.9 ± 0.0 | — | 0.0 | — | +| `handLensGet` | `-` | 0.8 ± 0.0 | — | 0.0 | — | +| `handLensModify` | `-` | 3.5 ± 0.0 | — | 24.0 | — | +| `handPrismGetHit` | `-` | 2.3 ± 0.0 | — | 16.0 | — | +| `handPrismGetMiss` | `-` | 0.8 ± 0.0 | — | 0.0 | — | +| `handPrismModifyHit` | `-` | 3.3 ± 0.0 | — | 24.0 | — | +| `handPrismModifyMiss` | `-` | 0.8 ± 0.0 | — | 0.0 | — | +| `rawLensGet` | `-` | 0.6 ± 0.0 | — | 0.0 | — | +| `rawLensModify` | `-` | 3.4 ± 0.0 | — | 24.0 | — | +| `rawPrismGetHit` | `-` | 2.5 ± 0.0 | — | 16.0 | — | +| `rawPrismModifyHit` | `-` | 3.3 ± 0.0 | — | 24.0 | — | ## GetterBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `Get_0` | `-` | 0.6 ± 0.0 | 0.3 ± 0.0 | 0.0 | 0.0 | -| `Get_3` | `-` | 8.9 ± 0.3 | 4.7 ± 0.5 | 0.0 | 0.0 | -| `Get_6` | `-` | 17.2 ± 0.5 | 14.5 ± 0.5 | 0.0 | 0.0 | -| `Get_orderId` | `-` | 0.6 ± 0.0 | 0.3 ± 0.0 | 0.0 | 0.0 | +| `Get_0` | `-` | 0.7 ± 0.0 | 0.4 ± 0.0 | 0.0 | 0.0 | +| `Get_3` | `-` | 10.2 ± 0.1 | 5.3 ± 0.3 | 0.0 | 0.0 | +| `Get_6` | `-` | 19.6 ± 0.1 | 16.7 ± 0.2 | 0.0 | 0.0 | +| `Get_orderId` | `-` | 0.7 ± 0.0 | 0.4 ± 0.0 | 0.0 | 0.0 | ## IsoBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `Get` | `-` | 2.6 ± 0.1 | 2.7 ± 0.1 | 32.0 | 32.0 | -| `ReverseGet` | `-` | 2.7 ± 0.1 | 2.5 ± 0.1 | 32.0 | 32.0 | +| `Get` | `-` | 4.5 ± 0.0 | 4.6 ± 0.1 | 32.0 | 32.0 | +| `ReverseGet` | `-` | 4.4 ± 0.0 | 4.5 ± 0.0 | 32.0 | 32.0 | ## JsoniterBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `cModifyId` | `size=512` | 275,758.8 ± 4,909.1 | — | 1,066,670.4 | — | -| `cModifyId` | `size=64` | 32,031.5 ± 810.6 | — | 136,254.2 | — | -| `cModifyId` | `size=8` | 5,355.2 ± 186.2 | — | 20,696.1 | — | -| `cReadId` | `size=512` | 133,028.9 ± 6,973.6 | — | 797,909.8 | — | -| `cReadId` | `size=64` | 16,142.0 ± 480.5 | — | 101,288.5 | — | -| `cReadId` | `size=8` | 2,627.9 ± 64.8 | — | 15,568.0 | — | -| `cReadStreet` | `size=512` | 128,720.7 ± 3,048.3 | — | 797,908.6 | — | -| `cReadStreet` | `size=64` | 16,178.4 ± 436.8 | — | 101,288.5 | — | -| `cReadStreet` | `size=8` | 2,652.5 ± 81.8 | — | 15,568.0 | — | -| `cReplaceId` | `size=512` | 281,168.3 ± 9,007.4 | — | 1,066,624.0 | — | -| `cReplaceId` | `size=64` | 33,580.6 ± 1,704.8 | — | 136,206.6 | — | -| `cReplaceId` | `size=8` | 5,422.2 ± 162.0 | — | 20,656.1 | — | -| `cSumPrices` | `size=512` | 242,440.5 ± 8,774.3 | — | 1,240,708.9 | — | -| `cSumPrices` | `size=64` | 27,660.6 ± 794.5 | — | 157,582.0 | — | -| `cSumPrices` | `size=8` | 4,343.6 ± 73.0 | — | 22,720.0 | — | -| `jMiss` | `size=512` | 132.1 ± 5.7 | — | 0.0 | — | -| `jMiss` | `size=64` | 130.8 ± 4.7 | — | 0.0 | — | -| `jMiss` | `size=8` | 129.7 ± 4.4 | — | 0.0 | — | -| `jModifyId` | `size=512` | 5,380.8 ± 104.3 | — | 41,921.5 | — | -| `jModifyId` | `size=64` | 676.2 ± 6.3 | — | 5,328.0 | — | -| `jModifyId` | `size=8` | 147.5 ± 5.0 | — | 992.0 | — | -| `jReadId` | `size=512` | 30.0 ± 4.9 | — | 48.0 | — | -| `jReadId` | `size=64` | 32.9 ± 6.9 | — | 56.0 | — | -| `jReadId` | `size=8` | 30.5 ± 5.6 | — | 48.0 | — | -| `jReadStreet` | `size=512` | 133.0 ± 7.8 | — | 144.0 | — | -| `jReadStreet` | `size=64` | 126.5 ± 3.0 | — | 144.0 | — | -| `jReadStreet` | `size=8` | 130.8 ± 5.1 | — | 136.0 | — | -| `jReplaceId` | `size=512` | 5,291.3 ± 63.6 | — | 41,889.5 | — | -| `jReplaceId` | `size=64` | 670.5 ± 12.1 | — | 5,296.0 | — | -| `jReplaceId` | `size=8` | 146.8 ± 2.9 | — | 960.0 | — | -| `jSumPrices` | `size=512` | 58,899.7 ± 1,778.0 | — | 63,676.6 | — | -| `jSumPrices` | `size=64` | 7,499.5 ± 211.4 | — | 8,120.2 | — | -| `jSumPrices` | `size=8` | 979.0 ± 23.0 | — | 1,176.0 | — | +| `cModifyId` | `size=512` | 281,082.8 ± 2,777.1 | — | 1,066,680.0 | — | +| `cModifyId` | `size=64` | 35,897.2 ± 250.9 | — | 136,264.5 | — | +| `cModifyId` | `size=8` | 6,220.7 ± 125.7 | — | 20,704.1 | — | +| `cReadId` | `size=512` | 148,919.7 ± 1,886.6 | — | 797,914.4 | — | +| `cReadId` | `size=64` | 18,725.8 ± 155.7 | — | 101,288.5 | — | +| `cReadId` | `size=8` | 2,912.1 ± 13.9 | — | 15,568.0 | — | +| `cReadStreet` | `size=512` | 149,872.7 ± 2,125.4 | — | 797,914.6 | — | +| `cReadStreet` | `size=64` | 18,757.4 ± 165.8 | — | 101,288.5 | — | +| `cReadStreet` | `size=8` | 2,963.1 ± 50.7 | — | 15,568.0 | — | +| `cReplaceId` | `size=512` | 281,300.1 ± 3,052.2 | — | 1,066,616.0 | — | +| `cReplaceId` | `size=64` | 36,251.0 ± 716.8 | — | 136,216.6 | — | +| `cReplaceId` | `size=8` | 6,053.6 ± 27.4 | — | 20,656.1 | — | +| `cSumPrices` | `size=512` | 243,908.2 ± 2,294.7 | — | 1,240,709.4 | — | +| `cSumPrices` | `size=64` | 30,276.8 ± 111.4 | — | 157,486.9 | — | +| `cSumPrices` | `size=8` | 4,616.8 ± 34.5 | — | 22,720.0 | — | +| `jMiss` | `size=512` | 143.2 ± 3.0 | — | 0.0 | — | +| `jMiss` | `size=64` | 142.7 ± 2.6 | — | 0.0 | — | +| `jMiss` | `size=8` | 144.9 ± 1.1 | — | 0.0 | — | +| `jModifyId` | `size=512` | 5,342.7 ± 120.9 | — | 41,921.5 | — | +| `jModifyId` | `size=64` | 669.0 ± 14.3 | — | 5,336.0 | — | +| `jModifyId` | `size=8` | 146.1 ± 2.3 | — | 992.0 | — | +| `jReadId` | `size=512` | 32.7 ± 4.3 | — | 64.0 | — | +| `jReadId` | `size=64` | 30.5 ± 5.5 | — | 48.0 | — | +| `jReadId` | `size=8` | 32.9 ± 4.3 | — | 64.0 | — | +| `jReadStreet` | `size=512` | 145.7 ± 1.2 | — | 136.0 | — | +| `jReadStreet` | `size=64` | 147.5 ± 1.8 | — | 128.0 | — | +| `jReadStreet` | `size=8` | 148.1 ± 1.4 | — | 136.0 | — | +| `jReplaceId` | `size=512` | 5,295.2 ± 74.1 | — | 41,889.5 | — | +| `jReplaceId` | `size=64` | 650.6 ± 10.3 | — | 5,304.0 | — | +| `jReplaceId` | `size=8` | 143.8 ± 0.9 | — | 960.0 | — | +| `jSumPrices` | `size=512` | 67,706.8 ± 571.7 | — | 63,671.3 | — | +| `jSumPrices` | `size=64` | 8,504.5 ± 106.3 | — | 8,120.2 | — | +| `jSumPrices` | `size=8` | 1,132.3 ± 15.7 | — | 1,176.0 | — | ## KyoDiBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `EnvFocus` | `-` | 73.3 ± 2.3 | — | 320.0 | — | -| `MapDrillModify` | `-` | 25.5 ± 0.7 | — | 216.0 | — | -| `MapGet` | `-` | 1.6 ± 0.0 | — | 0.0 | — | -| `VarUpdateFocus` | `-` | 61.3 ± 1.6 | — | 216.0 | — | -| `handEnvUse` | `-` | 71.1 ± 1.3 | — | 312.0 | — | -| `handMapDrillModify` | `-` | 23.2 ± 0.9 | — | 216.0 | — | -| `handMapGet` | `-` | 1.2 ± 0.0 | — | 0.0 | — | -| `handVarUpdate` | `-` | 55.9 ± 1.6 | — | 200.0 | — | +| `EnvFocus` | `-` | 83.8 ± 1.0 | — | 320.0 | — | +| `MapDrillModify` | `-` | 34.4 ± 0.4 | — | 216.0 | — | +| `MapGet` | `-` | 1.8 ± 0.0 | — | 0.0 | — | +| `VarUpdateFocus` | `-` | 66.4 ± 2.9 | — | 216.0 | — | +| `handEnvUse` | `-` | 82.5 ± 1.2 | — | 312.0 | — | +| `handMapDrillModify` | `-` | 33.0 ± 0.2 | — | 216.0 | — | +| `handMapGet` | `-` | 1.4 ± 0.0 | — | 0.0 | — | +| `handVarUpdate` | `-` | 65.0 ± 3.0 | — | 200.0 | — | ## LensBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `Get` | `-` | 0.7 ± 0.0 | 0.8 ± 0.0 | 0.0 | 0.0 | -| `Modify` | `-` | 3.5 ± 0.1 | 3.2 ± 0.1 | 40.0 | 40.0 | -| `ModifyDeep` | `-` | 21.4 ± 0.5 | 19.7 ± 0.9 | 152.0 | 176.0 | -| `Replace` | `-` | 3.2 ± 0.1 | 3.2 ± 0.1 | 40.0 | 40.0 | +| `Get` | `-` | 0.8 ± 0.0 | 0.9 ± 0.0 | 0.0 | 0.0 | +| `Modify` | `-` | 5.6 ± 0.1 | 5.6 ± 0.1 | 40.0 | 40.0 | +| `ModifyDeep` | `-` | 26.1 ± 0.1 | 26.9 ± 0.1 | 152.0 | 176.0 | +| `Replace` | `-` | 5.5 ± 0.1 | 5.4 ± 0.0 | 40.0 | 40.0 | ## MultiFocusBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `Fold_powerEach` | `size=1024` | 13,486.6 ± 639.8 | — | 43,035.5 | — | -| `Fold_powerEach` | `size=256` | 2,473.3 ± 34.2 | — | 9,240.2 | — | -| `Fold_powerEach` | `size=32` | 290.2 ± 34.5 | — | 920.0 | — | -| `Fold_powerEach` | `size=4` | 48.6 ± 0.5 | — | 328.0 | — | -| `Modify_multiFocus` | `size=1024` | 51,824.7 ± 1,257.8 | — | 331,137.5 | — | -| `Modify_multiFocus` | `size=256` | 11,249.4 ± 198.5 | — | 76,112.8 | — | -| `Modify_multiFocus` | `size=32` | 1,516.7 ± 15.5 | — | 8,600.0 | — | -| `Modify_multiFocus` | `size=4` | 155.4 ± 4.8 | — | 1,320.0 | — | -| `Modify_powerEach` | `size=1024` | 26,492.5 ± 2,139.8 | — | 115,174.9 | — | -| `Modify_powerEach` | `size=256` | 6,149.4 ± 94.7 | — | 26,080.4 | — | -| `Modify_powerEach` | `size=32` | 798.4 ± 25.8 | — | 3,152.0 | — | -| `Modify_powerEach` | `size=4` | 118.0 ± 1.9 | — | 800.0 | — | -| `naive_listMap` | `size=1024` | 8,404.5 ± 652.0 | — | 65,578.2 | — | -| `naive_listMap` | `size=256` | 1,876.1 ± 40.1 | — | 16,424.1 | — | -| `naive_listMap` | `size=32` | 243.9 ± 11.4 | — | 2,088.0 | — | -| `naive_listMap` | `size=4` | 29.3 ± 0.4 | — | 296.0 | — | -| `naive_sumQty` | `size=1024` | 3,994.2 ± 178.3 | — | 16,129.0 | — | -| `naive_sumQty` | `size=256` | 613.0 ± 10.2 | — | 3,840.0 | — | -| `naive_sumQty` | `size=32` | 52.4 ± 0.8 | — | 256.0 | — | -| `naive_sumQty` | `size=4` | 4.7 ± 0.2 | — | 0.0 | — | +| `Fold_powerEach` | `size=1024` | 15,494.7 ± 1,970.6 | — | 43,036.0 | — | +| `Fold_powerEach` | `size=256` | 2,638.1 ± 10.2 | — | 9,240.2 | — | +| `Fold_powerEach` | `size=32` | 273.9 ± 0.8 | — | 920.0 | — | +| `Fold_powerEach` | `size=4` | 56.7 ± 0.2 | — | 328.0 | — | +| `Modify_multiFocus` | `size=1024` | 56,453.4 ± 929.3 | — | 331,134.5 | — | +| `Modify_multiFocus` | `size=256` | 12,672.1 ± 123.8 | — | 76,112.9 | — | +| `Modify_multiFocus` | `size=32` | 1,461.3 ± 5.3 | — | 8,600.0 | — | +| `Modify_multiFocus` | `size=4` | 190.7 ± 0.8 | — | 1,320.0 | — | +| `Modify_powerEach` | `size=1024` | 29,220.8 ± 746.2 | — | 115,175.6 | — | +| `Modify_powerEach` | `size=256` | 6,024.9 ± 474.2 | — | 26,080.4 | — | +| `Modify_powerEach` | `size=32` | 758.1 ± 15.6 | — | 3,152.0 | — | +| `Modify_powerEach` | `size=4` | 129.5 ± 1.4 | — | 800.0 | — | +| `naive_listMap` | `size=1024` | 10,123.5 ± 28.1 | — | 65,578.6 | — | +| `naive_listMap` | `size=256` | 2,480.4 ± 10.5 | — | 16,424.2 | — | +| `naive_listMap` | `size=32` | 314.7 ± 1.1 | — | 2,088.0 | — | +| `naive_listMap` | `size=4` | 45.0 ± 0.5 | — | 296.0 | — | +| `naive_sumQty` | `size=1024` | 4,592.6 ± 176.5 | — | 16,129.2 | — | +| `naive_sumQty` | `size=256` | 607.1 ± 2.3 | — | 3,840.0 | — | +| `naive_sumQty` | `size=32` | 51.7 ± 0.1 | — | 256.0 | — | +| `naive_sumQty` | `size=4` | 5.4 ± 0.1 | — | 0.0 | — | ## MultiFocusCollectBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `CollectList_listSum` | `-` | 24.1 ± 0.7 | — | 56.0 | — | -| `CollectMap_constSum` | `-` | 1.3 ± 0.0 | — | 0.0 | — | -| `CollectMap_zipMean` | `-` | 100.9 ± 1.1 | — | 880.0 | — | -| `Modify_multiFocusTuple3` | `-` | 12.5 ± 0.4 | — | 128.0 | — | -| `Modify_multiFocusTuple6` | `-` | 20.8 ± 0.5 | — | 224.0 | — | -| `naive_constSum` | `-` | 1.3 ± 0.0 | — | 16.0 | — | -| `naive_listSum` | `-` | 20.9 ± 0.3 | — | 56.0 | — | -| `naive_tuple3Rewrite` | `-` | 7.4 ± 0.1 | — | 96.0 | — | -| `naive_tuple6Rewrite` | `-` | 14.2 ± 0.3 | — | 184.0 | — | -| `naive_zipMeanBroadcast` | `-` | 160.6 ± 9.2 | — | 1,176.0 | — | +| `CollectList_listSum` | `-` | 24.2 ± 0.1 | — | 56.0 | — | +| `CollectMap_constSum` | `-` | 1.4 ± 0.0 | — | 0.0 | — | +| `CollectMap_zipMean` | `-` | 129.0 ± 0.5 | — | 880.0 | — | +| `Modify_multiFocusTuple3` | `-` | 18.9 ± 0.4 | — | 128.0 | — | +| `Modify_multiFocusTuple6` | `-` | 33.2 ± 0.2 | — | 224.0 | — | +| `naive_constSum` | `-` | 2.4 ± 0.0 | — | 16.0 | — | +| `naive_listSum` | `-` | 22.5 ± 0.3 | — | 56.0 | — | +| `naive_tuple3Rewrite` | `-` | 13.0 ± 0.1 | — | 96.0 | — | +| `naive_tuple6Rewrite` | `-` | 24.5 ± 0.2 | — | 184.0 | — | +| `naive_zipMeanBroadcast` | `-` | 203.8 ± 0.9 | — | 1,176.0 | — | ## OpticBuildBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `build` | `-` | 38.1 ± 1.2 | — | 184.0 | — | -| `buildAndUse` | `-` | 696.5 ± 47.1 | — | 2,840.0 | — | -| `reuseUse` | `-` | 627.0 ± 17.7 | — | 2,696.0 | — | +| `build` | `-` | 36.1 ± 0.0 | — | 184.0 | — | +| `buildAndUse` | `-` | 799.2 ± 24.3 | — | 2,840.0 | — | +| `reuseUse` | `-` | 757.2 ± 11.1 | — | 2,696.0 | — | ## OptionalBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `Modify_0` | `-` | 14.2 ± 0.5 | 14.2 ± 0.6 | 112.0 | 112.0 | -| `Modify_0_empty` | `-` | 0.8 ± 0.0 | 1.1 ± 0.0 | 0.0 | 0.0 | -| `Modify_3` | `-` | 34.5 ± 1.2 | 44.5 ± 1.4 | 160.0 | 304.0 | -| `Modify_6` | `-` | 77.1 ± 2.0 | 75.3 ± 1.6 | 208.0 | 496.0 | -| `Modify_loyalty` | `-` | 12.6 ± 0.9 | 12.4 ± 0.8 | 112.0 | 112.0 | -| `Modify_loyalty_empty` | `-` | 0.9 ± 0.0 | 1.1 ± 0.0 | 0.0 | 0.0 | -| `Replace_0` | `-` | 3.5 ± 0.3 | 3.4 ± 0.1 | 40.0 | 40.0 | -| `Replace_loyalty` | `-` | 6.9 ± 0.1 | 6.9 ± 0.2 | 88.0 | 88.0 | +| `Modify_0` | `-` | 17.9 ± 0.1 | 17.9 ± 0.1 | 112.0 | 112.0 | +| `Modify_0_empty` | `-` | 1.1 ± 0.0 | 1.3 ± 0.1 | 0.0 | 0.0 | +| `Modify_3` | `-` | 38.5 ± 0.4 | 51.4 ± 0.3 | 160.0 | 304.0 | +| `Modify_6` | `-` | 89.3 ± 0.4 | 84.6 ± 1.5 | 208.0 | 496.0 | +| `Modify_loyalty` | `-` | 17.0 ± 0.2 | 16.9 ± 0.1 | 112.0 | 112.0 | +| `Modify_loyalty_empty` | `-` | 1.1 ± 0.0 | 1.3 ± 0.0 | 0.0 | 0.0 | +| `Replace_0` | `-` | 5.7 ± 0.0 | 5.5 ± 0.1 | 40.0 | 40.0 | +| `Replace_loyalty` | `-` | 11.9 ± 0.1 | 11.8 ± 0.1 | 88.0 | 88.0 | ## OrderAvroBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `ModifyNames` | `size=512` | 22,685.4 ± 1,193.6 | — | 97,421.4 | — | -| `ModifyNames` | `size=64` | 2,756.1 ± 95.6 | — | 12,616.1 | — | -| `ModifyNames` | `size=8` | 381.6 ± 18.9 | — | 2,048.0 | — | -| `ModifyStreet` | `size=512` | 79.9 ± 1.5 | — | 328.0 | — | -| `ModifyStreet` | `size=64` | 79.4 ± 2.3 | — | 328.0 | — | -| `ModifyStreet` | `size=8` | 81.6 ± 3.7 | — | 328.0 | — | -| `ReadStreet` | `size=512` | 23.6 ± 0.8 | — | 88.0 | — | -| `ReadStreet` | `size=64` | 23.5 ± 0.6 | — | 88.0 | — | -| `ReadStreet` | `size=8` | 23.3 ± 0.3 | — | 88.0 | — | -| `monocleModifyNames` | `size=512` | 74,146.7 ± 2,185.2 | — | 382,786.9 | — | -| `monocleModifyNames` | `size=64` | 6,755.2 ± 263.9 | — | 39,840.2 | — | -| `monocleModifyNames` | `size=8` | 1,007.9 ± 33.5 | — | 5,400.0 | — | -| `monocleModifyStreet` | `size=512` | 35,020.7 ± 1,424.3 | — | 169,071.1 | — | -| `monocleModifyStreet` | `size=64` | 4,447.4 ± 117.1 | — | 20,904.2 | — | -| `monocleModifyStreet` | `size=8` | 605.6 ± 26.9 | — | 2,992.0 | — | -| `monocleReadStreet` | `size=512` | 17,410.6 ± 262.0 | — | 69,780.2 | — | -| `monocleReadStreet` | `size=64` | 2,841.2 ± 251.9 | — | 8,848.1 | — | -| `monocleReadStreet` | `size=8` | 403.1 ± 75.1 | — | 1,208.0 | — | -| `naiveModifyNames` | `size=512` | 43,150.9 ± 366.8 | — | 226,287.1 | — | -| `naiveModifyNames` | `size=64` | 5,464.5 ± 182.6 | — | 27,936.2 | — | -| `naiveModifyNames` | `size=8` | 712.2 ± 25.5 | — | 3,752.0 | — | -| `naiveModifyStreet` | `size=512` | 33,568.4 ± 436.9 | — | 169,047.3 | — | -| `naiveModifyStreet` | `size=64` | 4,396.7 ± 139.9 | — | 20,880.1 | — | -| `naiveModifyStreet` | `size=8` | 605.9 ± 37.6 | — | 2,968.0 | — | -| `naiveReadStreet` | `size=512` | 17,507.4 ± 173.5 | — | 69,780.2 | — | -| `naiveReadStreet` | `size=64` | 3,038.7 ± 314.1 | — | 8,848.1 | — | -| `naiveReadStreet` | `size=8` | 295.4 ± 12.0 | — | 1,208.0 | — | +| `ModifyNames` | `size=512` | 25,112.6 ± 137.5 | — | 97,421.9 | — | +| `ModifyNames` | `size=64` | 3,014.1 ± 58.4 | — | 13,128.1 | — | +| `ModifyNames` | `size=8` | 453.9 ± 1.2 | — | 2,160.0 | — | +| `ModifyStreet` | `size=512` | 86.3 ± 0.2 | — | 328.0 | — | +| `ModifyStreet` | `size=64` | 85.5 ± 0.2 | — | 328.0 | — | +| `ModifyStreet` | `size=8` | 86.1 ± 1.3 | — | 328.0 | — | +| `ReadStreet` | `size=512` | 24.5 ± 0.3 | — | 88.0 | — | +| `ReadStreet` | `size=64` | 24.3 ± 0.0 | — | 88.0 | — | +| `ReadStreet` | `size=8` | 24.4 ± 0.1 | — | 88.0 | — | +| `monocleModifyNames` | `size=512` | 71,679.5 ± 377.2 | — | 382,786.6 | — | +| `monocleModifyNames` | `size=64` | 7,420.1 ± 79.9 | — | 39,840.3 | — | +| `monocleModifyNames` | `size=8` | 1,058.5 ± 8.4 | — | 5,400.0 | — | +| `monocleModifyStreet` | `size=512` | 33,901.1 ± 261.0 | — | 169,070.7 | — | +| `monocleModifyStreet` | `size=64` | 4,412.2 ± 77.4 | — | 20,904.1 | — | +| `monocleModifyStreet` | `size=8` | 689.2 ± 22.9 | — | 2,992.0 | — | +| `monocleReadStreet` | `size=512` | 17,105.2 ± 29.6 | — | 69,780.1 | — | +| `monocleReadStreet` | `size=64` | 2,187.9 ± 23.5 | — | 8,848.1 | — | +| `monocleReadStreet` | `size=8` | 329.4 ± 4.4 | — | 1,208.0 | — | +| `naiveModifyNames` | `size=512` | 43,850.4 ± 481.5 | — | 226,287.6 | — | +| `naiveModifyNames` | `size=64` | 5,631.5 ± 66.1 | — | 27,936.2 | — | +| `naiveModifyNames` | `size=8` | 818.2 ± 15.4 | — | 3,752.0 | — | +| `naiveModifyStreet` | `size=512` | 33,797.8 ± 421.3 | — | 169,046.7 | — | +| `naiveModifyStreet` | `size=64` | 4,427.2 ± 83.5 | — | 20,880.1 | — | +| `naiveModifyStreet` | `size=8` | 694.7 ± 19.0 | — | 2,968.0 | — | +| `naiveReadStreet` | `size=512` | 17,173.6 ± 241.4 | — | 69,780.1 | — | +| `naiveReadStreet` | `size=64` | 2,180.4 ± 3.7 | — | 8,848.1 | — | +| `naiveReadStreet` | `size=8` | 328.9 ± 3.6 | — | 1,208.0 | — | ## OrderCirceBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `Names` | `size=512` | 136,508.7 ± 5,885.7 | — | 613,949.4 | — | -| `Names` | `size=64` | 17,688.0 ± 813.8 | — | 78,777.9 | — | -| `Names` | `size=8` | 2,436.9 ± 107.9 | — | 10,944.1 | — | -| `NamesIor` | `size=512` | 154,436.9 ± 3,554.7 | — | 683,467.8 | — | -| `NamesIor` | `size=64` | 19,873.6 ± 531.2 | — | 87,487.4 | — | -| `NamesIor` | `size=8` | 2,554.1 ± 77.1 | — | 11,576.1 | — | -| `Street` | `size=512` | 659.8 ± 50.5 | — | 2,720.5 | — | -| `Street` | `size=64` | 659.6 ± 52.2 | — | 2,720.1 | — | -| `Street` | `size=8` | 613.3 ± 8.4 | — | 2,720.0 | — | -| `StreetIor` | `size=512` | 615.5 ± 16.7 | — | 2,736.5 | — | -| `StreetIor` | `size=64` | 623.9 ± 13.8 | — | 2,736.1 | — | -| `StreetIor` | `size=8` | 609.6 ± 8.8 | — | 2,736.0 | — | -| `directNames` | `size=512` | 136,137.3 ± 5,706.7 | — | 613,909.1 | — | -| `directNames` | `size=64` | 16,900.4 ± 271.8 | — | 77,177.8 | — | -| `directNames` | `size=8` | 2,349.1 ± 89.2 | — | 10,688.1 | — | -| `directStreet` | `size=512` | 635.5 ± 18.9 | — | 2,728.5 | — | -| `directStreet` | `size=64` | 652.9 ± 60.7 | — | 2,736.1 | — | -| `directStreet` | `size=8` | 653.2 ± 37.3 | — | 2,736.0 | — | -| `hcursorNames` | `size=512` | 135,868.0 ± 3,572.9 | — | 609,804.9 | — | -| `hcursorNames` | `size=64` | 17,339.3 ± 651.4 | — | 77,257.8 | — | -| `hcursorNames` | `size=8` | 2,357.0 ± 79.5 | — | 10,696.1 | — | -| `hcursorStreet` | `size=512` | 711.7 ± 53.2 | — | 3,032.6 | — | -| `hcursorStreet` | `size=64` | 691.7 ± 22.8 | — | 3,032.1 | — | -| `hcursorStreet` | `size=8` | 673.7 ± 11.5 | — | 3,032.0 | — | -| `monocleNames` | `size=512` | 189,274.0 ± 2,993.8 | — | 1,121,735.2 | — | -| `monocleNames` | `size=64` | 18,595.4 ± 535.2 | — | 132,767.0 | — | -| `monocleNames` | `size=8` | 3,119.9 ± 56.7 | — | 19,477.4 | — | -| `monocleStreet` | `size=512` | 146,025.2 ± 1,402.9 | — | 908,002.1 | — | -| `monocleStreet` | `size=64` | 15,821.4 ± 378.3 | — | 113,809.4 | — | -| `monocleStreet` | `size=8` | 2,700.5 ± 75.5 | — | 17,053.4 | — | -| `naiveNames` | `size=512` | 163,938.1 ± 7,361.0 | — | 965,246.2 | — | -| `naiveNames` | `size=64` | 16,912.1 ± 305.8 | — | 120,825.5 | — | -| `naiveNames` | `size=8` | 2,810.1 ± 59.9 | — | 17,808.1 | — | -| `naiveStreet` | `size=512` | 149,523.8 ± 2,282.8 | — | 908,009.8 | — | -| `naiveStreet` | `size=64` | 16,091.2 ± 453.9 | — | 113,801.4 | — | -| `naiveStreet` | `size=8` | 2,727.6 ± 64.0 | — | 17,040.1 | — | +| `Names` | `size=512` | 165,861.5 ± 3,391.9 | — | 613,973.0 | — | +| `Names` | `size=64` | 21,094.6 ± 536.0 | — | 78,778.2 | — | +| `Names` | `size=8` | 2,870.5 ± 59.8 | — | 10,944.1 | — | +| `NamesIor` | `size=512` | 170,538.4 ± 3,253.5 | — | 679,376.7 | — | +| `NamesIor` | `size=64` | 23,127.9 ± 330.3 | — | 86,962.4 | — | +| `NamesIor` | `size=8` | 3,111.5 ± 107.2 | — | 11,576.1 | — | +| `Street` | `size=512` | 748.1 ± 11.6 | — | 2,720.6 | — | +| `Street` | `size=64` | 755.7 ± 19.1 | — | 2,720.1 | — | +| `Street` | `size=8` | 771.6 ± 11.8 | — | 2,720.0 | — | +| `StreetIor` | `size=512` | 779.5 ± 7.8 | — | 2,736.6 | — | +| `StreetIor` | `size=64` | 771.1 ± 23.8 | — | 2,736.1 | — | +| `StreetIor` | `size=8` | 761.4 ± 17.5 | — | 2,736.0 | — | +| `directNames` | `size=512` | 160,671.7 ± 3,762.5 | — | 613,928.8 | — | +| `directNames` | `size=64` | 20,432.2 ± 275.8 | — | 77,698.2 | — | +| `directNames` | `size=8` | 2,801.1 ± 78.1 | — | 10,688.1 | — | +| `directStreet` | `size=512` | 770.9 ± 7.7 | — | 2,736.6 | — | +| `directStreet` | `size=64` | 768.2 ± 3.8 | — | 2,736.1 | — | +| `directStreet` | `size=8` | 772.4 ± 8.7 | — | 2,736.0 | — | +| `hcursorNames` | `size=512` | 160,016.3 ± 5,165.1 | — | 613,928.3 | — | +| `hcursorNames` | `size=64` | 20,488.9 ± 691.2 | — | 77,778.2 | — | +| `hcursorNames` | `size=8` | 2,789.6 ± 146.3 | — | 10,696.1 | — | +| `hcursorStreet` | `size=512` | 810.9 ± 8.2 | — | 3,032.6 | — | +| `hcursorStreet` | `size=64` | 801.4 ± 10.2 | — | 3,032.1 | — | +| `hcursorStreet` | `size=8` | 810.7 ± 8.6 | — | 3,032.0 | — | +| `monocleNames` | `size=512` | 180,538.0 ± 2,074.2 | — | 1,121,729.3 | — | +| `monocleNames` | `size=64` | 20,767.7 ± 434.0 | — | 132,756.5 | — | +| `monocleNames` | `size=8` | 3,184.3 ± 24.0 | — | 19,466.7 | — | +| `monocleStreet` | `size=512` | 140,475.5 ± 2,884.0 | — | 907,998.4 | — | +| `monocleStreet` | `size=64` | 17,668.2 ± 335.9 | — | 113,809.6 | — | +| `monocleStreet` | `size=8` | 2,753.2 ± 34.7 | — | 17,053.4 | — | +| `naiveNames` | `size=512` | 147,247.6 ± 1,961.3 | — | 965,235.0 | — | +| `naiveNames` | `size=64` | 18,519.0 ± 231.9 | — | 120,825.7 | — | +| `naiveNames` | `size=8` | 2,882.6 ± 48.1 | — | 17,808.1 | — | +| `naiveStreet` | `size=512` | 139,044.2 ± 553.9 | — | 908,008.1 | — | +| `naiveStreet` | `size=64` | 17,586.3 ± 160.9 | — | 113,774.9 | — | +| `naiveStreet` | `size=8` | 2,724.6 ± 26.7 | — | 17,034.7 | — | ## OrderJsoniterBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `ModifyStreet` | `size=512` | 5,497.2 ± 83.6 | — | 42,028.9 | — | -| `ModifyStreet` | `size=64` | 830.7 ± 16.3 | — | 5,432.1 | — | -| `ModifyStreet` | `size=8` | 213.8 ± 11.1 | — | 1,080.0 | — | -| `ReadStreet` | `size=512` | 130.0 ± 5.6 | — | 109.5 | — | -| `ReadStreet` | `size=64` | 128.9 ± 4.4 | — | 109.3 | — | -| `ReadStreet` | `size=8` | 125.9 ± 2.3 | — | 90.7 | — | -| `SumPrices` | `size=512` | 59,361.5 ± 1,761.7 | — | 63,711.9 | — | -| `SumPrices` | `size=64` | 7,662.4 ± 375.2 | — | 8,120.9 | — | -| `SumPrices` | `size=8` | 998.1 ± 32.7 | — | 1,176.0 | — | -| `monocleModifyStreet` | `size=512` | 106,445.4 ± 4,506.6 | — | 333,473.6 | — | -| `monocleModifyStreet` | `size=64` | 12,360.4 ± 434.7 | — | 30,081.2 | — | -| `monocleModifyStreet` | `size=8` | 1,988.9 ± 33.4 | — | 4,664.0 | — | -| `monocleReadStreet` | `size=512` | 55,727.5 ± 2,747.4 | — | 193,199.7 | — | -| `monocleReadStreet` | `size=64` | 6,846.0 ± 225.3 | — | 24,704.7 | — | -| `monocleReadStreet` | `size=8` | 1,106.9 ± 22.5 | — | 3,648.0 | — | -| `monocleSumPrices` | `size=512` | 302,491.2 ± 18,291.5 | — | 1,178,338.9 | — | -| `monocleSumPrices` | `size=64` | 10,097.4 ± 333.6 | — | 45,841.0 | — | -| `monocleSumPrices` | `size=8` | 1,620.9 ± 59.8 | — | 6,445.4 | — | -| `naiveModifyStreet` | `size=512` | 107,342.7 ± 4,232.6 | — | 333,466.3 | — | -| `naiveModifyStreet` | `size=64` | 12,129.9 ± 323.8 | — | 30,057.2 | — | -| `naiveModifyStreet` | `size=8` | 2,015.1 ± 53.0 | — | 4,640.0 | — | -| `naiveReadStreet` | `size=512` | 55,926.8 ± 2,328.4 | — | 193,199.9 | — | -| `naiveReadStreet` | `size=64` | 7,037.7 ± 359.0 | — | 24,704.7 | — | -| `naiveReadStreet` | `size=8` | 1,131.7 ± 50.5 | — | 3,648.0 | — | -| `naiveSumPrices` | `size=512` | 58,612.2 ± 1,852.9 | — | 230,090.2 | — | -| `naiveSumPrices` | `size=64` | 7,396.0 ± 175.9 | — | 29,336.8 | — | -| `naiveSumPrices` | `size=8` | 1,164.6 ± 19.5 | — | 4,248.0 | — | -| `nativeReadStreet` | `size=512` | 25,173.3 ± 782.5 | — | 445.0 | — | -| `nativeReadStreet` | `size=64` | 3,200.1 ± 116.8 | — | 424.3 | — | -| `nativeReadStreet` | `size=8` | 569.7 ± 14.8 | — | 424.0 | — | -| `nativeSumPrices` | `size=512` | 43,656.3 ± 2,038.0 | — | 86,268.1 | — | -| `nativeSumPrices` | `size=64` | 5,282.6 ± 229.6 | — | 10,920.6 | — | -| `nativeSumPrices` | `size=8` | 748.9 ± 33.0 | — | 1,512.0 | — | +| `ModifyStreet` | `size=512` | 5,605.8 ± 58.5 | — | 42,029.0 | — | +| `ModifyStreet` | `size=64` | 803.2 ± 4.9 | — | 5,432.1 | — | +| `ModifyStreet` | `size=8` | 233.2 ± 1.1 | — | 1,080.0 | — | +| `ReadStreet` | `size=512` | 147.4 ± 2.1 | — | 109.5 | — | +| `ReadStreet` | `size=64` | 149.7 ± 1.2 | — | 128.0 | — | +| `ReadStreet` | `size=8` | 147.2 ± 2.5 | — | 90.7 | — | +| `SumPrices` | `size=512` | 67,758.6 ± 332.5 | — | 63,713.1 | — | +| `SumPrices` | `size=64` | 8,401.5 ± 64.8 | — | 8,121.0 | — | +| `SumPrices` | `size=8` | 1,147.9 ± 22.4 | — | 1,176.0 | — | +| `monocleModifyStreet` | `size=512` | 119,210.4 ± 699.3 | — | 333,548.1 | — | +| `monocleModifyStreet` | `size=64` | 14,249.5 ± 30.7 | — | 30,081.4 | — | +| `monocleModifyStreet` | `size=8` | 2,516.6 ± 21.3 | — | 4,664.1 | — | +| `monocleReadStreet` | `size=512` | 62,735.4 ± 378.6 | — | 193,205.7 | — | +| `monocleReadStreet` | `size=64` | 8,035.7 ± 145.8 | — | 24,704.8 | — | +| `monocleReadStreet` | `size=8` | 1,277.8 ± 12.7 | — | 3,648.0 | — | +| `monocleSumPrices` | `size=512` | 295,494.7 ± 2,715.7 | — | 1,178,332.9 | — | +| `monocleSumPrices` | `size=64` | 11,464.7 ± 31.9 | — | 45,833.2 | — | +| `monocleSumPrices` | `size=8` | 1,882.8 ± 14.7 | — | 6,338.7 | — | +| `naiveModifyStreet` | `size=512` | 119,443.0 ± 445.5 | — | 333,499.9 | — | +| `naiveModifyStreet` | `size=64` | 14,268.9 ± 134.0 | — | 30,057.4 | — | +| `naiveModifyStreet` | `size=8` | 2,500.8 ± 4.7 | — | 4,640.1 | — | +| `naiveReadStreet` | `size=512` | 62,951.2 ± 232.8 | — | 193,205.9 | — | +| `naiveReadStreet` | `size=64` | 7,949.0 ± 18.8 | — | 24,704.8 | — | +| `naiveReadStreet` | `size=8` | 1,271.5 ± 6.1 | — | 3,648.0 | — | +| `naiveSumPrices` | `size=512` | 68,711.6 ± 442.1 | — | 230,098.9 | — | +| `naiveSumPrices` | `size=64` | 8,578.0 ± 21.8 | — | 29,336.9 | — | +| `naiveSumPrices` | `size=8` | 1,348.2 ± 6.6 | — | 4,248.0 | — | +| `nativeReadStreet` | `size=512` | 28,950.9 ± 219.7 | — | 448.2 | — | +| `nativeReadStreet` | `size=64` | 3,734.5 ± 69.9 | — | 424.4 | — | +| `nativeReadStreet` | `size=8` | 667.3 ± 8.2 | — | 424.0 | — | +| `nativeSumPrices` | `size=512` | 47,023.9 ± 989.3 | — | 86,269.7 | — | +| `nativeSumPrices` | `size=64` | 5,744.5 ± 15.2 | — | 10,920.6 | — | +| `nativeSumPrices` | `size=8` | 856.3 ± 5.9 | — | 1,512.0 | — | ## PlatedBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `TransformDeep` | `n=4096` | 113,326.9 ± 2,754.6 | — | 624,378.5 | — | -| `TransformDeep` | `n=512` | 10,667.5 ± 288.8 | — | 57,361.1 | — | -| `TransformDeep` | `n=64` | 1,196.8 ± 27.1 | — | 7,184.0 | — | -| `TransformExpr` | `n=4096` | 108,826.1 ± 7,367.5 | 114,486.6 ± 3,342.9 | 655,343.2 | 753,699.3 | -| `TransformExpr` | `n=512` | 13,313.6 ± 265.0 | 10,687.4 ± 179.1 | 81,825.4 | 69,585.1 | -| `TransformExpr` | `n=64` | 1,701.4 ± 23.1 | 1,875.6 ± 89.0 | 10,144.0 | 11,728.0 | -| `UniverseDeep` | `n=4096` | 145,025.4 ± 3,131.3 | — | 786,609.6 | — | -| `UniverseDeep` | `n=512` | 14,161.1 ± 537.4 | — | 98,377.4 | — | -| `UniverseDeep` | `n=64` | 1,580.6 ± 56.9 | — | 12,360.0 | — | -| `UniverseExpr` | `n=4096` | 145,392.7 ± 3,046.4 | 3,858,618.7 ± 208,771.0 | 786,417.8 | 4,688,483.2 | -| `UniverseExpr` | `n=512` | 14,006.6 ± 308.2 | 256,141.0 ± 7,774.9 | 98,185.4 | 475,018.2 | -| `UniverseExpr` | `n=64` | 1,597.6 ± 81.0 | 22,972.4 ± 527.2 | 12,168.0 | 45,424.4 | -| `UniverseJson` | `n=4096` | 200,009.6 ± 6,961.7 | 4,183,491.0 ± 222,157.7 | 786,457.6 | 6,490,581.5 | -| `UniverseJson` | `n=512` | 20,510.5 ± 519.2 | 298,099.7 ± 10,105.5 | 98,186.1 | 699,926.4 | -| `UniverseJson` | `n=64` | 2,520.9 ± 107.6 | 26,607.2 ± 691.3 | 12,168.0 | 73,208.5 | -| `visitorTransformDeep` | `n=4096` | 28,478.6 ± 730.9 | — | 163,876.7 | — | -| `visitorTransformDeep` | `n=512` | 3,335.8 ± 85.9 | — | 20,496.3 | — | -| `visitorTransformDeep` | `n=64` | 388.6 ± 11.7 | — | 2,576.0 | — | -| `visitorTransformExpr` | `n=4096` | 53,102.5 ± 716.5 | — | 360,462.7 | — | -| `visitorTransformExpr` | `n=512` | 5,965.5 ± 159.6 | — | 45,032.6 | — | -| `visitorTransformExpr` | `n=64` | 809.7 ± 21.0 | — | 5,608.0 | — | -| `visitorUniverseDeep` | `n=4096` | 48,077.1 ± 783.6 | — | 196,699.0 | — | -| `visitorUniverseDeep` | `n=512` | 5,400.2 ± 111.5 | — | 24,632.6 | — | -| `visitorUniverseDeep` | `n=64` | 607.3 ± 20.9 | — | 3,128.0 | — | -| `visitorUniverseExpr` | `n=4096` | 52,303.4 ± 1,145.9 | — | 196,654.1 | — | -| `visitorUniverseExpr` | `n=512` | 6,284.3 ± 162.1 | — | 24,584.6 | — | -| `visitorUniverseExpr` | `n=64` | 605.1 ± 10.7 | — | 3,080.0 | — | -| `visitorUniverseJson` | `n=4096` | 119,428.0 ± 36,166.3 | — | 374,558.9 | — | -| `visitorUniverseJson` | `n=512` | 21,600.7 ± 500.2 | — | 40,954.2 | — | -| `visitorUniverseJson` | `n=64` | 1,725.3 ± 54.4 | — | 4,424.0 | — | +| `TransformDeep` | `n=4096` | 113,589.8 ± 270.8 | — | 624,378.7 | — | +| `TransformDeep` | `n=512` | 12,073.9 ± 177.3 | — | 57,361.2 | — | +| `TransformDeep` | `n=64` | 1,262.8 ± 4.9 | — | 7,184.0 | — | +| `TransformExpr` | `n=4096` | 114,650.3 ± 2,459.4 | 134,018.3 ± 1,604.5 | 655,347.5 | 753,713.5 | +| `TransformExpr` | `n=512` | 14,224.3 ± 42.5 | 12,097.4 ± 92.1 | 81,825.5 | 69,585.2 | +| `TransformExpr` | `n=64` | 1,748.8 ± 20.5 | 2,043.7 ± 12.4 | 10,144.0 | 11,728.0 | +| `UniverseDeep` | `n=4096` | 139,189.4 ± 1,415.4 | — | 786,605.3 | — | +| `UniverseDeep` | `n=512` | 16,866.2 ± 62.4 | — | 98,377.7 | — | +| `UniverseDeep` | `n=64` | 1,945.7 ± 6.2 | — | 12,360.0 | — | +| `UniverseExpr` | `n=4096` | 137,192.7 ± 991.7 | 4,297,983.2 ± 173,922.3 | 786,411.9 | 4,688,802.6 | +| `UniverseExpr` | `n=512` | 16,558.9 ± 210.1 | 301,081.2 ± 5,228.7 | 98,185.7 | 475,022.7 | +| `UniverseExpr` | `n=64` | 1,904.5 ± 9.4 | 26,311.1 ± 151.7 | 12,168.0 | 45,424.5 | +| `UniverseJson` | `n=4096` | 178,734.8 ± 1,039.6 | 4,529,430.0 ± 214,793.4 | 786,442.1 | 6,884,001.3 | +| `UniverseJson` | `n=512` | 21,362.6 ± 81.5 | 331,801.0 ± 4,258.1 | 98,186.2 | 699,929.9 | +| `UniverseJson` | `n=64` | 2,387.4 ± 45.3 | 30,140.9 ± 164.7 | 12,168.0 | 73,208.6 | +| `visitorTransformDeep` | `n=4096` | 39,532.5 ± 203.4 | — | 163,884.8 | — | +| `visitorTransformDeep` | `n=512` | 4,360.8 ± 80.5 | — | 20,496.4 | — | +| `visitorTransformDeep` | `n=64` | 484.5 ± 4.0 | — | 2,576.0 | — | +| `visitorTransformExpr` | `n=4096` | 61,466.4 ± 176.0 | — | 360,468.7 | — | +| `visitorTransformExpr` | `n=512` | 7,196.9 ± 17.8 | — | 45,032.7 | — | +| `visitorTransformExpr` | `n=64` | 938.6 ± 3.6 | — | 5,608.0 | — | +| `visitorUniverseDeep` | `n=4096` | 52,905.9 ± 213.8 | — | 196,702.5 | — | +| `visitorUniverseDeep` | `n=512` | 6,432.1 ± 20.5 | — | 24,632.7 | — | +| `visitorUniverseDeep` | `n=64` | 662.8 ± 1.3 | — | 3,128.0 | — | +| `visitorUniverseExpr` | `n=4096` | 46,975.4 ± 178.3 | — | 196,650.2 | — | +| `visitorUniverseExpr` | `n=512` | 5,799.4 ± 32.8 | — | 24,584.6 | — | +| `visitorUniverseExpr` | `n=64` | 681.0 ± 8.8 | — | 3,080.0 | — | +| `visitorUniverseJson` | `n=4096` | 111,847.0 ± 12,983.9 | — | 299,674.6 | — | +| `visitorUniverseJson` | `n=512` | 18,126.2 ± 1,237.6 | — | 42,313.9 | — | +| `visitorUniverseJson` | `n=64` | 1,670.9 ± 82.8 | — | 4,424.0 | — | ## PowerSeriesBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `Modify_powerEach` | `size=1024` | 9,886.9 ± 200.8 | — | 41,412.7 | — | -| `Modify_powerEach` | `size=16` | 171.8 ± 9.4 | — | 1,088.0 | — | -| `Modify_powerEach` | `size=256` | 2,661.3 ± 138.5 | — | 10,688.4 | — | -| `Modify_powerEach` | `size=4` | 76.9 ± 2.2 | — | 608.0 | — | -| `Modify_powerEach` | `size=4096` | 41,538.5 ± 1,898.3 | — | 164,356.0 | — | -| `Modify_powerEach` | `size=64` | 551.6 ± 11.8 | — | 3,008.0 | — | -| `monocle_powerEach` | `size=1024` | 49,643.0 ± 838.4 | — | 279,425.7 | — | -| `monocle_powerEach` | `size=16` | 504.5 ± 10.4 | — | 3,720.0 | — | -| `monocle_powerEach` | `size=256` | 16,763.3 ± 388.6 | — | 107,338.6 | — | -| `monocle_powerEach` | `size=4` | 130.9 ± 5.0 | — | 1,176.0 | — | -| `monocle_powerEach` | `size=4096` | 194,302.6 ± 4,965.9 | — | 967,868.4 | — | -| `monocle_powerEach` | `size=64` | 2,150.6 ± 37.8 | — | 14,520.1 | — | -| `naive_powerEach` | `size=1024` | 5,159.9 ± 108.3 | — | 28,730.4 | — | -| `naive_powerEach` | `size=16` | 71.4 ± 1.1 | — | 504.0 | — | -| `naive_powerEach` | `size=256` | 1,262.8 ± 16.6 | — | 7,224.2 | — | -| `naive_powerEach` | `size=4` | 19.5 ± 0.7 | — | 168.0 | — | -| `naive_powerEach` | `size=4096` | 23,758.9 ± 760.9 | — | 114,783.0 | — | -| `naive_powerEach` | `size=64` | 336.2 ± 4.8 | — | 1,848.0 | — | +| `Modify_powerEach` | `size=1024` | 10,606.2 ± 32.4 | — | 41,413.0 | — | +| `Modify_powerEach` | `size=16` | 180.3 ± 1.2 | — | 1,088.0 | — | +| `Modify_powerEach` | `size=256` | 2,462.5 ± 13.8 | — | 10,688.4 | — | +| `Modify_powerEach` | `size=4` | 91.5 ± 0.2 | — | 608.0 | — | +| `Modify_powerEach` | `size=4096` | 42,276.9 ± 1,158.2 | — | 164,356.9 | — | +| `Modify_powerEach` | `size=64` | 657.0 ± 12.5 | — | 3,008.0 | — | +| `monocle_powerEach` | `size=1024` | 50,383.4 ± 666.2 | — | 279,426.2 | — | +| `monocle_powerEach` | `size=16` | 595.1 ± 2.4 | — | 3,720.0 | — | +| `monocle_powerEach` | `size=256` | 18,151.2 ± 91.3 | — | 107,330.8 | — | +| `monocle_powerEach` | `size=4` | 167.2 ± 1.6 | — | 1,176.0 | — | +| `monocle_powerEach` | `size=4096` | 176,221.2 ± 2,120.9 | — | 967,839.0 | — | +| `monocle_powerEach` | `size=64` | 2,226.2 ± 11.8 | — | 14,514.7 | — | +| `naive_powerEach` | `size=1024` | 5,284.5 ± 182.9 | — | 28,730.5 | — | +| `naive_powerEach` | `size=16` | 84.7 ± 0.9 | — | 504.0 | — | +| `naive_powerEach` | `size=256` | 1,246.1 ± 5.7 | — | 7,224.2 | — | +| `naive_powerEach` | `size=4` | 26.2 ± 0.2 | — | 168.0 | — | +| `naive_powerEach` | `size=4096` | 20,329.7 ± 97.9 | — | 114,777.1 | — | +| `naive_powerEach` | `size=64` | 318.4 ± 2.3 | — | 1,848.0 | — | ## PowerSeriesNestedBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `Modify_nested` | `size=1024` | 49,951.6 ± 1,641.6 | — | 210,533.6 | — | -| `Modify_nested` | `size=16` | 970.4 ± 27.2 | — | 4,744.0 | — | -| `Modify_nested` | `size=256` | 14,139.5 ± 281.2 | — | 53,696.9 | — | -| `Modify_nested` | `size=4` | 441.6 ± 12.4 | — | 2,264.0 | — | -| `Modify_nested` | `size=64` | 3,800.5 ± 170.3 | — | 14,616.4 | — | -| `monocle_nested` | `size=1024` | 221,339.5 ± 6,741.5 | — | 1,118,802.9 | — | -| `monocle_nested` | `size=16` | 2,462.5 ± 111.3 | — | 15,776.1 | — | -| `monocle_nested` | `size=256` | 71,544.4 ± 1,584.1 | — | 430,203.3 | — | -| `monocle_nested` | `size=4` | 908.2 ± 24.2 | — | 5,536.0 | — | -| `monocle_nested` | `size=64` | 8,092.0 ± 268.3 | — | 58,859.5 | — | -| `naive_nested` | `size=1024` | 19,826.4 ± 650.6 | — | 115,068.1 | — | -| `naive_nested` | `size=16` | 309.9 ± 11.5 | — | 2,136.0 | — | -| `naive_nested` | `size=256` | 4,900.5 ± 120.3 | — | 29,019.1 | — | -| `naive_nested` | `size=4` | 95.0 ± 3.3 | — | 792.0 | — | -| `naive_nested` | `size=64` | 1,230.1 ± 26.1 | — | 7,512.1 | — | +| `Modify_nested` | `size=1024` | 51,294.5 ± 907.5 | — | 210,560.0 | — | +| `Modify_nested` | `size=16` | 1,103.3 ± 34.1 | — | 4,792.0 | — | +| `Modify_nested` | `size=256` | 14,889.8 ± 308.2 | — | 53,729.4 | — | +| `Modify_nested` | `size=4` | 527.3 ± 11.0 | — | 2,240.0 | — | +| `Modify_nested` | `size=64` | 4,018.3 ± 424.4 | — | 14,640.5 | — | +| `monocle_nested` | `size=1024` | 207,300.7 ± 2,134.2 | — | 1,118,777.4 | — | +| `monocle_nested` | `size=16` | 2,612.0 ± 91.6 | — | 15,749.4 | — | +| `monocle_nested` | `size=256` | 75,908.4 ± 724.0 | — | 430,204.5 | — | +| `monocle_nested` | `size=4` | 1,026.8 ± 52.2 | — | 5,557.4 | — | +| `monocle_nested` | `size=64` | 9,280.5 ± 95.8 | — | 58,859.7 | — | +| `naive_nested` | `size=1024` | 19,638.8 ± 112.7 | — | 115,067.8 | — | +| `naive_nested` | `size=16` | 353.8 ± 6.1 | — | 2,136.0 | — | +| `naive_nested` | `size=256` | 4,959.0 ± 67.9 | — | 29,019.1 | — | +| `naive_nested` | `size=4` | 126.8 ± 1.0 | — | 792.0 | — | +| `naive_nested` | `size=64` | 1,247.3 ± 23.9 | — | 7,512.1 | — | ## PowerSeriesPrismBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `Modify_sparse` | `size=128` | 1,238.7 ± 95.2 | — | 4,816.1 | — | -| `Modify_sparse` | `size=2048` | 19,756.0 ± 405.9 | — | 104,687.9 | — | -| `Modify_sparse` | `size=32` | 298.2 ± 7.4 | — | 1,360.0 | — | -| `Modify_sparse` | `size=512` | 5,004.9 ± 104.0 | — | 24,785.4 | — | -| `Modify_sparse` | `size=8` | 87.8 ± 2.5 | — | 496.0 | — | -| `monocle_sparse` | `size=128` | 3,997.1 ± 136.1 | — | 27,808.2 | — | -| `monocle_sparse` | `size=2048` | 97,801.6 ± 8,555.6 | — | 523,143.7 | — | -| `monocle_sparse` | `size=32` | 1,131.4 ± 27.3 | — | 7,024.0 | — | -| `monocle_sparse` | `size=512` | 27,484.7 ± 720.6 | — | 166,680.5 | — | -| `monocle_sparse` | `size=8` | 294.5 ± 20.7 | — | 1,952.0 | — | -| `naive_sparse` | `size=128` | 323.6 ± 9.7 | — | 1,568.0 | — | -| `naive_sparse` | `size=2048` | 3,810.4 ± 94.1 | — | 24,611.2 | — | -| `naive_sparse` | `size=32` | 82.7 ± 1.6 | — | 416.0 | — | -| `naive_sparse` | `size=512` | 1,163.7 ± 41.9 | — | 6,176.3 | — | -| `naive_sparse` | `size=8` | 17.0 ± 0.4 | — | 128.0 | — | +| `Modify_sparse` | `size=128` | 1,141.5 ± 17.6 | — | 4,816.1 | — | +| `Modify_sparse` | `size=2048` | 19,349.0 ± 231.6 | — | 104,672.0 | — | +| `Modify_sparse` | `size=32` | 276.7 ± 2.8 | — | 1,360.0 | — | +| `Modify_sparse` | `size=512` | 4,936.7 ± 51.6 | — | 24,785.4 | — | +| `Modify_sparse` | `size=8` | 92.0 ± 1.2 | — | 496.0 | — | +| `monocle_sparse` | `size=128` | 4,281.4 ± 34.8 | — | 27,808.2 | — | +| `monocle_sparse` | `size=2048` | 94,378.5 ± 1,613.7 | — | 523,141.3 | — | +| `monocle_sparse` | `size=32` | 1,104.9 ± 8.5 | — | 7,032.0 | — | +| `monocle_sparse` | `size=512` | 29,093.4 ± 401.3 | — | 166,681.6 | — | +| `monocle_sparse` | `size=8` | 322.3 ± 7.6 | — | 1,952.0 | — | +| `naive_sparse` | `size=128` | 277.9 ± 4.8 | — | 1,568.0 | — | +| `naive_sparse` | `size=2048` | 4,417.9 ± 47.3 | — | 24,611.8 | — | +| `naive_sparse` | `size=32` | 72.6 ± 0.5 | — | 416.0 | — | +| `naive_sparse` | `size=512` | 1,167.8 ± 13.4 | — | 6,176.3 | — | +| `naive_sparse` | `size=8` | 20.4 ± 0.3 | — | 128.0 | — | ## PrismBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `GetOptionAbsent` | `-` | 0.6 ± 0.0 | 0.7 ± 0.0 | 0.0 | 0.0 | -| `GetOptionPresent` | `-` | 0.6 ± 0.0 | 0.7 ± 0.0 | 0.0 | 0.0 | -| `GetRightAbsent` | `-` | 0.7 ± 0.0 | 0.7 ± 0.0 | 0.0 | 0.0 | -| `GetRightPresent` | `-` | 2.1 ± 0.1 | 2.2 ± 0.1 | 16.0 | 16.0 | -| `ReverseGet` | `-` | 2.3 ± 0.1 | 2.3 ± 0.1 | 16.0 | 16.0 | -| `RightReverseGet` | `-` | 2.3 ± 0.1 | 2.3 ± 0.1 | 16.0 | 16.0 | +| `GetOptionAbsent` | `-` | 0.7 ± 0.0 | 0.8 ± 0.0 | 0.0 | 0.0 | +| `GetOptionPresent` | `-` | 0.7 ± 0.0 | 0.8 ± 0.0 | 0.0 | 0.0 | +| `GetRightAbsent` | `-` | 0.8 ± 0.0 | 0.9 ± 0.0 | 0.0 | 0.0 | +| `GetRightPresent` | `-` | 2.4 ± 0.0 | 2.5 ± 0.0 | 16.0 | 16.0 | +| `ReverseGet` | `-` | 2.4 ± 0.0 | 2.4 ± 0.0 | 16.0 | 16.0 | +| `RightReverseGet` | `-` | 2.4 ± 0.0 | 2.4 ± 0.0 | 16.0 | 16.0 | ## ReviewBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `ReverseGet_0` | `-` | 2.1 ± 0.1 | — | 24.0 | — | -| `ReverseGet_3` | `-` | 19.4 ± 0.4 | — | 72.0 | — | -| `ReverseGet_6` | `-` | 32.3 ± 0.5 | — | 120.0 | — | -| `naiveBuild_0` | `-` | 2.0 ± 0.0 | — | 24.0 | — | -| `naiveBuild_3` | `-` | 6.0 ± 0.1 | — | 72.0 | — | -| `naiveBuild_6` | `-` | 9.8 ± 0.2 | — | 120.0 | — | +| `ReverseGet_0` | `-` | 3.5 ± 0.0 | — | 24.0 | — | +| `ReverseGet_3` | `-` | 13.2 ± 0.1 | — | 72.0 | — | +| `ReverseGet_6` | `-` | 22.7 ± 0.4 | — | 120.0 | — | +| `naiveBuild_0` | `-` | 3.5 ± 0.0 | — | 24.0 | — | +| `naiveBuild_3` | `-` | 10.3 ± 0.4 | — | 72.0 | — | +| `naiveBuild_6` | `-` | 16.7 ± 0.1 | — | 120.0 | — | ## SchemesBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `Ana` | `-` | 83,808.2 ± 2,297.0 | — | 589,712.6 | — | -| `Cata` | `-` | 66,151.1 ± 1,339.7 | — | 197,568.5 | — | -| `Hylo` | `-` | 69,268.7 ± 6,246.8 | — | 295,848.5 | — | -| `drosteAna` | `-` | 47,082.2 ± 3,478.9 | — | 327,632.3 | — | -| `drosteCata` | `-` | 41,900.7 ± 1,702.7 | — | 164,824.3 | — | -| `drosteHylo` | `-` | 49,002.3 ± 3,275.8 | — | 328,640.3 | — | -| `handAna` | `-` | 29,080.8 ± 1,333.6 | — | 163,816.2 | — | -| `handCata` | `-` | 9,224.0 ± 178.4 | — | 0.1 | — | -| `handHylo` | `-` | 6,835.2 ± 180.0 | — | 0.0 | — | +| `Ana` | `-` | 97,638.1 ± 1,816.4 | — | 589,712.7 | — | +| `Cata` | `-` | 56,898.7 ± 493.8 | — | 197,568.4 | — | +| `Hylo` | `-` | 66,291.2 ± 853.8 | — | 295,848.5 | — | +| `drosteAna` | `-` | 51,618.6 ± 441.7 | — | 327,632.4 | — | +| `drosteCata` | `-` | 31,011.1 ± 162.5 | — | 164,824.2 | — | +| `drosteHylo` | `-` | 52,346.2 ± 987.2 | — | 328,640.4 | — | +| `handAna` | `-` | 27,962.2 ± 236.1 | — | 163,816.2 | — | +| `handCata` | `-` | 12,707.1 ± 130.0 | — | 0.1 | — | +| `handHylo` | `-` | 10,531.1 ± 379.5 | — | 0.1 | — | ## SetterBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `Modify_0` | `-` | 2.3 ± 0.2 | 2.2 ± 0.0 | 24.0 | 24.0 | -| `Modify_3` | `-` | 8.6 ± 0.2 | 21.7 ± 1.0 | 72.0 | 168.0 | -| `Modify_6` | `-` | 17.9 ± 0.7 | 41.5 ± 1.4 | 120.0 | 288.0 | -| `Modify_orderId` | `-` | 3.0 ± 0.2 | 3.1 ± 0.4 | 40.0 | 40.0 | +| `Modify_0` | `-` | 3.4 ± 0.0 | 3.4 ± 0.0 | 24.0 | 24.0 | +| `Modify_3` | `-` | 11.4 ± 0.1 | 26.6 ± 0.1 | 72.0 | 168.0 | +| `Modify_6` | `-` | 20.2 ± 0.3 | 49.5 ± 0.4 | 120.0 | 288.0 | +| `Modify_orderId` | `-` | 5.4 ± 0.1 | 5.4 ± 0.0 | 40.0 | 40.0 | ## TraversalBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `FoldNested` | `size=512` | 4,042.5 ± 67.8 | — | 20,200.6 | — | -| `FoldNested` | `size=64` | 465.0 ± 7.9 | — | 2,680.0 | — | -| `FoldNested` | `size=8` | 40.5 ± 6.1 | — | 360.0 | — | -| `FoldPrices` | `size=512` | 1,699.9 ± 21.9 | 24,631.9 ± 313.5 | 12,312.3 | 162,563.9 | -| `FoldPrices` | `size=64` | 149.8 ± 1.6 | 2,184.0 ± 16.8 | 1,560.0 | 15,408.1 | -| `FoldPrices` | `size=8` | 18.5 ± 0.4 | 265.5 ± 9.4 | 216.0 | 2,000.0 | -| `Modify` | `size=512` | 6,353.5 ± 104.7 | 28,880.7 ± 400.6 | 36,897.0 | 176,887.0 | -| `Modify` | `size=64` | 723.0 ± 17.5 | 2,025.0 ± 37.9 | 4,640.0 | 14,408.1 | -| `Modify` | `size=8` | 77.7 ± 2.6 | 240.9 ± 8.8 | 608.0 | 1,896.0 | +| `FoldNested` | `size=512` | 4,674.9 ± 52.6 | — | 20,200.7 | — | +| `FoldNested` | `size=64` | 534.3 ± 9.2 | — | 2,680.0 | — | +| `FoldNested` | `size=8` | 54.2 ± 6.9 | — | 360.0 | — | +| `FoldPrices` | `size=512` | 1,986.2 ± 42.9 | 27,737.5 ± 201.9 | 12,312.3 | 162,564.4 | +| `FoldPrices` | `size=64` | 221.2 ± 4.5 | 2,355.4 ± 9.4 | 1,560.0 | 15,408.1 | +| `FoldPrices` | `size=8` | 30.1 ± 0.2 | 356.1 ± 4.8 | 216.0 | 2,000.0 | +| `Modify` | `size=512` | 7,270.3 ± 69.4 | 30,282.1 ± 220.1 | 36,897.2 | 176,888.1 | +| `Modify` | `size=64` | 815.8 ± 14.2 | 2,192.6 ± 21.4 | 4,640.0 | 14,408.1 | +| `Modify` | `size=8` | 97.7 ± 2.0 | 309.9 ± 4.6 | 608.0 | 1,896.0 | ## ZioDiBench | Benchmark | params | eo ns/op | monocle ns/op | eo B/op | monocle B/op | |---|---|---:|---:|---:|---:| -| `DrillGet` | `-` | 6.5 ± 0.2 | — | 0.0 | — | -| `DrillModify` | `-` | 76.6 ± 4.8 | — | 472.0 | — | -| `ServiceGet` | `-` | 3.5 ± 0.1 | — | 0.0 | — | -| `ServiceReplace` | `-` | 68.8 ± 0.4 | — | 400.0 | — | -| `handDrillGet` | `-` | 10.7 ± 0.2 | — | 120.0 | — | -| `handDrillModify` | `-` | 92.5 ± 0.6 | — | 592.0 | — | -| `handServiceGet` | `-` | 10.3 ± 0.3 | — | 120.0 | — | -| `handServiceReplace` | `-` | 85.0 ± 5.3 | — | 520.0 | — | +| `DrillGet` | `-` | 7.4 ± 0.0 | — | 0.0 | — | +| `DrillModify` | `-` | 86.4 ± 0.9 | — | 472.0 | — | +| `ServiceGet` | `-` | 4.1 ± 0.0 | — | 0.0 | — | +| `ServiceReplace` | `-` | 75.3 ± 3.8 | — | 400.0 | — | +| `handDrillGet` | `-` | 17.5 ± 0.1 | — | 120.0 | — | +| `handDrillModify` | `-` | 94.3 ± 0.4 | — | 592.0 | — | +| `handServiceGet` | `-` | 17.5 ± 0.3 | — | 120.0 | — | +| `handServiceReplace` | `-` | 84.2 ± 0.2 | — | 520.0 | — | diff --git a/site/laika-static/bench/series.jsonl b/site/laika-static/bench/series.jsonl index b75000b9..2bbf95c8 100644 --- a/site/laika-static/bench/series.jsonl +++ b/site/laika-static/bench/series.jsonl @@ -27,3 +27,4 @@ {"source_sha":"96bc4e2372f9968afd51764901fe0e3d0350d324","date":"2026-09-30","jdk":"temurin-21","runner":"ubuntu-22.04","jmh_params":"-i 5 -wi 3 -f 3 -t 1 -foe true -prof gc -rf json -jvmArgsAppend -XX:-ResizeTLAB -jvmArgsAppend -Xms1g -jvmArgsAppend -Xmx1g","profile":"sweep:-i5-wi3-f3-t1-gc-rt1g","results":[{"b":"AffineFoldBench.eoGetOption_0","p":"-","ns":1.0109631112699053,"ns_err":0.0014943006467939299,"bop":7.055221934938157e-06},{"b":"AffineFoldBench.eoGetOption_0_asAffineFold","p":"-","ns":1.0106205226250056,"ns_err":0.0017236135289108885,"bop":7.053427014739798e-06},{"b":"AffineFoldBench.eoGetOption_0_asOptional","p":"-","ns":2.839600233332349,"ns_err":0.04004355252907138,"bop":16.00001998201017},{"b":"AffineFoldBench.eoGetOption_0_empty","p":"-","ns":1.0102957969861324,"ns_err":0.00181868273281536,"bop":7.0513158159510766e-06},{"b":"AffineFoldBench.eoGetOption_3","p":"-","ns":13.383272916567016,"ns_err":0.49733732461294866,"bop":16.000094106935013},{"b":"AffineFoldBench.eoGetOption_6","p":"-","ns":25.59286158331658,"ns_err":0.2601723219009854,"bop":16.00017992448623},{"b":"AffineFoldBench.eoGetOption_loyalty","p":"-","ns":1.1541562631369708,"ns_err":0.001461407892702588,"bop":8.055350570392565e-06},{"b":"AffineFoldBench.eoGetOption_loyalty_empty","p":"-","ns":1.1546356494244447,"ns_err":0.0027832855304333846,"bop":8.053970706885828e-06},{"b":"AffineFoldBench.mGetOption_0","p":"-","ns":1.0105322870431228,"ns_err":0.0031276922126964343,"bop":7.0586539474167e-06},{"b":"AffineFoldBench.mGetOption_0_empty","p":"-","ns":1.0094428856948727,"ns_err":0.000817607478879604,"bop":7.056192082239894e-06},{"b":"AffineFoldBench.mGetOption_3","p":"-","ns":9.271675527363508,"ns_err":0.2251036066778496,"bop":6.473248967915961e-05},{"b":"AffineFoldBench.mGetOption_6","p":"-","ns":24.869644997771083,"ns_err":0.5578554054490302,"bop":0.00017362030015731622},{"b":"AffineFoldBench.mGetOption_loyalty","p":"-","ns":1.1539594313557255,"ns_err":0.0010851451257554688,"bop":8.058669465804632e-06},{"b":"AffineFoldBench.mGetOption_loyalty_empty","p":"-","ns":1.1539369438078324,"ns_err":0.0010059535163531004,"bop":8.061387627394688e-06},{"b":"AvroBytesBench.eoGraftPayload","p":"-","ns":157.56827605246943,"ns_err":2.4883108543080255,"bop":720.0028586585631},{"b":"AvroBytesBench.eoModifyCountry","p":"-","ns":319.7677252045895,"ns_err":5.634960097950073,"bop":928.0056745644957},{"b":"AvroBytesBench.eoModifyPartner","p":"-","ns":403.52976111652237,"ns_err":5.444543437947939,"bop":994.6737789494763},{"b":"AvroBytesBench.eoReadCountry","p":"-","ns":178.33399983407546,"ns_err":5.6554481553673455,"bop":520.0030342667358},{"b":"AvroBytesBench.eoReadPartner","p":"-","ns":213.90742280139045,"ns_err":2.6232392490020153,"bop":480.0036376855999},{"b":"AvroBytesBench.eoSliceGraftPayload","p":"-","ns":310.63911894248906,"ns_err":2.7239301516633616,"bop":1192.005567648818},{"b":"AvroBytesBench.naiveModifyCountry","p":"-","ns":2734.9919134702,"ns_err":16.73351306889619,"bop":7616.045799988497},{"b":"AvroBytesBench.naiveModifyPartner","p":"-","ns":3104.8898540847435,"ns_err":45.67267531306817,"bop":8696.051988715826},{"b":"AvroBytesBench.naivePassthroughPayload","p":"-","ns":5224.133573265022,"ns_err":117.90092428740596,"bop":14088.087584477642},{"b":"AvroBytesBench.naiveReadCountry","p":"-","ns":1686.5397759763953,"ns_err":15.965405545724284,"bop":4256.028680954964},{"b":"AvroBytesBench.naiveReadPartner","p":"-","ns":2058.428623077669,"ns_err":12.741302105484236,"bop":5424.035001064897},{"b":"AvroBytesBench.prunedReadCountry","p":"-","ns":906.93236787364,"ns_err":2.9808307211447334,"bop":1976.0154248458102},{"b":"AvroBytesBench.prunedReadPartner","p":"-","ns":671.4941023511623,"ns_err":3.7406805182960396,"bop":1592.0114244765396},{"b":"AvroDecodeReuseBench.cachedDecodeRecord","p":"-","ns":371.0759532126258,"ns_err":1.6438483501851158,"bop":1224.0039684839946},{"b":"AvroDecodeReuseBench.confluentRecordReader","p":"-","ns":422.08497080809974,"ns_err":2.0990715732945384,"bop":1560.0045148701217},{"b":"AvroDecodeReuseBench.confluentRecordReaderFresh","p":"-","ns":1515.034488910317,"ns_err":12.686812627184754,"bop":3696.0161992358862},{"b":"AvroDecodeReuseBench.freshDecodeRecord","p":"-","ns":1453.907471096651,"ns_err":16.51669136795554,"bop":3344.0155554013613},{"b":"AvroEncodeRouteBench.eo_encodeToAny","p":"-","ns":57.173912994505486,"ns_err":0.21821710042677614,"bop":312.00040211396447},{"b":"AvroEncodeRouteBench.eo_encodeValue","p":"-","ns":648.3993157828596,"ns_err":6.282974626701035,"bop":562.6712229584433},{"b":"AvroEncodeRouteBench.handwritten_stream","p":"-","ns":169.83385950524433,"ns_err":8.107402385513335,"bop":240.00119341000047},{"b":"AvroEncodeRouteBench.naive_freshPlumbing","p":"-","ns":762.2403380270439,"ns_err":13.54418885271415,"bop":2624.0053625546902},{"b":"AvroJsonBridgeBench.eoClickToAvro","p":"-","ns":3062.8417276475816,"ns_err":131.47574854786274,"bop":4653.355991664719},{"b":"AvroJsonBridgeBench.eoClickToJson","p":"-","ns":2844.296087836698,"ns_err":34.83351585308233,"bop":3984.0199995197895},{"b":"AvroJsonBridgeBench.eoWideToAvro","p":"-","ns":855.7325102592811,"ns_err":9.307220753910691,"bop":2040.0065296806956},{"b":"AvroJsonBridgeBench.eoWideToJson","p":"-","ns":646.6561701917843,"ns_err":9.585033812006243,"bop":1472.0045508628832},{"b":"AvroJsonBridgeBench.naiveClickToAvro","p":"-","ns":1549.2306699788473,"ns_err":9.384782769273077,"bop":3928.0108927116166},{"b":"AvroJsonBridgeBench.naiveClickToJson","p":"-","ns":3096.5345683868336,"ns_err":53.61424220713063,"bop":5856.0217694608855},{"b":"AvroJsonBridgeBench.naiveWideToAvro","p":"-","ns":1055.9120529887166,"ns_err":8.042378730852326,"bop":3504.007422093322},{"b":"AvroJsonBridgeBench.naiveWideToJson","p":"-","ns":1921.1169301177383,"ns_err":38.36428460817537,"bop":4376.013517849588},{"b":"AvroVulcanBench.decode_bridged","p":"-","ns":232.59804919861446,"ns_err":1.9429656745307071,"bop":880.0016339479672},{"b":"AvroVulcanBench.decode_native","p":"-","ns":16.923551204226346,"ns_err":0.25579171292258573,"bop":48.00011888457115},{"b":"AvroVulcanBench.decode_vulcanRaw","p":"-","ns":227.95238005276624,"ns_err":1.3933292200765295,"bop":880.0016042980977},{"b":"AvroVulcanBench.encode_bridged","p":"-","ns":251.76669668315404,"ns_err":2.0204899869072177,"bop":1229.3351019073646},{"b":"AvroVulcanBench.encode_native","p":"-","ns":12.32674576198806,"ns_err":0.06466854254935352,"bop":56.00008662114456},{"b":"AvroVulcanBench.encode_vulcanRaw","p":"-","ns":252.9189714266435,"ns_err":12.581186080845596,"bop":1218.6684442426006},{"b":"AvroVulcanBench.fieldGet_bridged","p":"-","ns":100.76056749486791,"ns_err":0.9127735609562618,"bop":432.0007077488332},{"b":"AvroVulcanBench.fieldGet_native","p":"-","ns":100.59943423732396,"ns_err":0.6189519014114823,"bop":432.0007071194604},{"b":"AvroVulcanBench.rootGet_bridged","p":"-","ns":432.51629212332233,"ns_err":3.5418181228799615,"bop":1472.0030439647956},{"b":"AvroVulcanBench.rootGet_native","p":"-","ns":178.66384636196355,"ns_err":2.928476803398011,"bop":600.0012562305366},{"b":"CapsBench.foldMapCap","p":"-","ns":17.784194052546738,"ns_err":0.03311049763837722,"bop":0.00012431685080685408},{"b":"CapsBench.foldMapDerivedHeld","p":"-","ns":18.189159284375304,"ns_err":0.08530860232880948,"bop":0.000127071794689036},{"b":"CapsBench.foldMapDerivedPerCall","p":"-","ns":17.67582287216376,"ns_err":0.047177034071504975,"bop":0.00012359692625034185},{"b":"CapsBench.foldMapDirect","p":"-","ns":17.684158360164368,"ns_err":0.02412187970110494,"bop":0.00012342528602760344},{"b":"CapsBench.getCap","p":"-","ns":1.2981480977404927,"ns_err":0.001396844833253719,"bop":9.065767740415106e-06},{"b":"CapsBench.getDeepCap","p":"-","ns":1.5899177070939714,"ns_err":0.003503818810498836,"bop":1.1110701775415523e-05},{"b":"CapsBench.getDeepDirect","p":"-","ns":1.442979366594313,"ns_err":0.0019057917653324554,"bop":1.0077768320177276e-05},{"b":"CapsBench.getDerivedHeld","p":"-","ns":2.1921176014021486,"ns_err":0.0016099262941785331,"bop":1.5314080182735058e-05},{"b":"CapsBench.getDerivedPerCall","p":"-","ns":1.5883991212058894,"ns_err":0.0053223807517929645,"bop":1.1083214419120726e-05},{"b":"CapsBench.getDirect","p":"-","ns":1.1547390876877268,"ns_err":0.0033832543505442334,"bop":8.054261683624986e-06},{"b":"CapsBench.modifyCap","p":"-","ns":5.136505867851749,"ns_err":0.0590562617423884,"bop":40.00003610537104},{"b":"CapsBench.modifyDeepCap","p":"-","ns":30.252805685691463,"ns_err":0.12720352393323328,"bop":176.00021282918127},{"b":"CapsBench.modifyDeepDirect","p":"-","ns":36.30721399052639,"ns_err":0.1988453049286724,"bop":152.00025544432543},{"b":"CapsBench.modifyDerivedHeld","p":"-","ns":5.942691454528862,"ns_err":0.17106973532681724,"bop":40.00004178465981},{"b":"CapsBench.modifyDerivedPerCall","p":"-","ns":5.575421384401121,"ns_err":0.06718583601174509,"bop":40.00003922707005},{"b":"CapsBench.modifyDirect","p":"-","ns":4.986364156613305,"ns_err":0.043999147402855,"bop":40.00003509246494},{"b":"ClickRecordBench.encode_derived","p":"-","ns":490.9464027668806,"ns_err":3.8623482079433167,"bop":744.0034561871774},{"b":"ClickRecordBench.encode_derivedThroughPrism","p":"-","ns":492.9156799539832,"ns_err":5.320453094104325,"bop":744.0034646051888},{"b":"ClickRecordBench.encode_hand","p":"-","ns":173.24715387668826,"ns_err":0.5396950378730552,"bop":768.0012178051986},{"b":"ClickRecordBench.encode_positional","p":"-","ns":5460.392675273921,"ns_err":77.22276673707259,"bop":23912.03844053002},{"b":"ClickRecordBench.encode_vulcanFull","p":"-","ns":6445.6062984231285,"ns_err":92.82250328177983,"bop":28408.045389847543},{"b":"CompositionBench.buildLens1","p":"-","ns":9.636824139819964,"ns_err":0.0781277235936683,"bop":72.00006776199594},{"b":"CompositionBench.buildLens3","p":"-","ns":27.730552422083225,"ns_err":0.27534311292985525,"bop":184.00019504305},{"b":"CompositionBench.buildLens6","p":"-","ns":55.70172008265732,"ns_err":0.6526447471808082,"bop":352.00039202271836},{"b":"CompositionBench.buildLensOptional3","p":"-","ns":28.901594808600464,"ns_err":0.19460767687294908,"bop":184.00020327671803},{"b":"CompositionBench.reuseLeaf","p":"-","ns":3.484009015385151,"ns_err":0.02575124584601571,"bop":24.00002450517153},{"b":"CompositionBench.reuseLens1","p":"-","ns":16.02325611769977,"ns_err":0.30235161620240797,"bop":40.000112666939366},{"b":"CompositionBench.reuseLens3","p":"-","ns":41.08955003514277,"ns_err":1.1426497799442359,"bop":72.00028882885857},{"b":"CompositionBench.reuseLens6","p":"-","ns":111.2379275588483,"ns_err":1.055749565772022,"bop":120.000781906086},{"b":"CompositionBench.reuseLensOptional3","p":"-","ns":53.36221769810329,"ns_err":0.16630476803134459,"bop":160.00037521331367},{"b":"FoldBench.eoFoldMap","p":"size=512","ns":3697.6836849354945,"ns_err":254.68085661210975,"bop":14080.603132273365},{"b":"FoldBench.eoFoldMap","p":"size=64","ns":313.16580944436413,"ns_err":1.779286128956316,"bop":768.0073650956798},{"b":"FoldBench.eoFoldMap","p":"size=8","ns":17.617930717749868,"ns_err":0.2022049911230735,"bop":0.00016109442236249461},{"b":"FoldBench.eoFoldPrices","p":"size=512","ns":3274.816874331246,"ns_err":19.644002754610984,"bop":12312.534158231185},{"b":"FoldBench.eoFoldPrices","p":"size=64","ns":324.03791463778816,"ns_err":1.8177489915213396,"bop":1560.0076190821878},{"b":"FoldBench.eoFoldPrices","p":"size=8","ns":44.312461557968426,"ns_err":0.7310470396544317,"bop":216.00040691966348},{"b":"FoldBench.mFoldMap","p":"size=512","ns":3474.155315777936,"ns_err":64.1800896923781,"bop":14080.566615893009},{"b":"FoldBench.mFoldMap","p":"size=64","ns":300.30802900788495,"ns_err":5.384006336481527,"bop":768.0070628841239},{"b":"FoldBench.mFoldMap","p":"size=8","ns":17.35881544967269,"ns_err":0.055850601749044354,"bop":0.00015834167932414053},{"b":"FoldBench.mFoldPrices","p":"size=512","ns":3166.2073307068367,"ns_err":18.183315952936816,"bop":12312.516460317132},{"b":"FoldBench.mFoldPrices","p":"size=64","ns":308.985030317395,"ns_err":2.9188166426092197,"bop":1560.0072663070512},{"b":"FoldBench.mFoldPrices","p":"size=8","ns":43.22403947076243,"ns_err":0.2449396966830234,"bop":216.00039710499004},{"b":"GenericsBench.genLensGet","p":"-","ns":1.1548018786662861,"ns_err":0.0029058194010052048,"bop":8.072486843215325e-06},{"b":"GenericsBench.genLensModify","p":"-","ns":4.085456223523904,"ns_err":0.024342689860472836,"bop":24.000028726001467},{"b":"GenericsBench.genPrismGetHit","p":"-","ns":2.5396863302987205,"ns_err":0.009665623302896262,"bop":16.000017878977268},{"b":"GenericsBench.genPrismGetMiss","p":"-","ns":1.3020771254691739,"ns_err":0.013699195360934524,"bop":9.087954734632301e-06},{"b":"GenericsBench.genPrismModifyHit","p":"-","ns":3.5485946970695994,"ns_err":0.09841926487678228,"bop":24.000024959868018},{"b":"GenericsBench.genPrismModifyMiss","p":"-","ns":1.298584246023334,"ns_err":0.0017296268527189965,"bop":9.06648564549089e-06},{"b":"GenericsBench.handLensGet","p":"-","ns":1.1551556920135686,"ns_err":0.004079315248758683,"bop":8.069994738260831e-06},{"b":"GenericsBench.handLensModify","p":"-","ns":3.581254231105776,"ns_err":0.03065906078546951,"bop":24.00002515843523},{"b":"GenericsBench.handPrismGetHit","p":"-","ns":2.4881716345098277,"ns_err":0.013869286613023012,"bop":16.000017509428588},{"b":"GenericsBench.handPrismGetMiss","p":"-","ns":1.1540656258516018,"ns_err":0.0004476867029329383,"bop":8.059986729155322e-06},{"b":"GenericsBench.handPrismModifyHit","p":"-","ns":3.643916875695024,"ns_err":0.5191976018490703,"bop":24.000025609920513},{"b":"GenericsBench.handPrismModifyMiss","p":"-","ns":1.1539574560605659,"ns_err":0.0010962640363266743,"bop":8.064242484677524e-06},{"b":"GenericsBench.rawLensGet","p":"-","ns":0.7225592453395061,"ns_err":0.0045161483974045505,"bop":5.039497728550877e-06},{"b":"GenericsBench.rawLensModify","p":"-","ns":3.0820536242088563,"ns_err":0.031059571772142275,"bop":24.000021677418562},{"b":"GenericsBench.rawPrismGetHit","p":"-","ns":2.3794034633637637,"ns_err":0.013248272193080335,"bop":16.00001672531254},{"b":"GenericsBench.rawPrismModifyHit","p":"-","ns":3.128445617216925,"ns_err":0.01688433840469121,"bop":24.000022004001565},{"b":"GetterBench.eoGet_0","p":"-","ns":1.0101236055147202,"ns_err":0.0018976602511516652,"bop":7.043997107124462e-06},{"b":"GetterBench.eoGet_3","p":"-","ns":14.087168691016709,"ns_err":0.2286617669460403,"bop":9.832193874467293e-05},{"b":"GetterBench.eoGet_6","p":"-","ns":27.94848334163242,"ns_err":1.5149419990408683,"bop":0.00019542234549648057},{"b":"GetterBench.eoGet_orderId","p":"-","ns":1.009741509444387,"ns_err":0.0008281858996922064,"bop":7.057981188219712e-06},{"b":"GetterBench.mGet_0","p":"-","ns":0.57862359831183,"ns_err":0.0009679773716200113,"bop":4.039103534402953e-06},{"b":"GetterBench.mGet_3","p":"-","ns":8.139082622812895,"ns_err":0.4838039650804928,"bop":5.678715737863698e-05},{"b":"GetterBench.mGet_6","p":"-","ns":23.28924602939862,"ns_err":1.2452668575185302,"bop":0.00016260001382250634},{"b":"GetterBench.mGet_orderId","p":"-","ns":0.5781038695748234,"ns_err":0.00047620808680755164,"bop":4.041131064397537e-06},{"b":"IsoBench.eoGet","p":"-","ns":4.652133074954275,"ns_err":0.38526380216700223,"bop":32.000032728782784},{"b":"IsoBench.eoReverseGet","p":"-","ns":4.009053146406469,"ns_err":0.054809020358565136,"bop":32.00002819813522},{"b":"IsoBench.mGet","p":"-","ns":4.714569017233497,"ns_err":0.02603641009435822,"bop":32.00003314948125},{"b":"IsoBench.mReverseGet","p":"-","ns":4.173538285319589,"ns_err":0.03013409888698641,"bop":32.00002932794864},{"b":"JsoniterBench.cModifyId","p":"size=512","ns":402028.23266681924,"ns_err":7953.2381329605505,"bop":1066721.5980232123},{"b":"JsoniterBench.cModifyId","p":"size=64","ns":52311.06392353996,"ns_err":275.77296330399383,"bop":136262.04068399232},{"b":"JsoniterBench.cModifyId","p":"size=8","ns":8330.636925828265,"ns_err":47.950275628811795,"bop":20688.08335355574},{"b":"JsoniterBench.cReadId","p":"size=512","ns":204774.8778560622,"ns_err":635.5342491648064,"bop":797930.2349496774},{"b":"JsoniterBench.cReadId","p":"size=64","ns":25937.706313898474,"ns_err":166.21827974594507,"bop":101292.62800098282},{"b":"JsoniterBench.cReadId","p":"size=8","ns":3948.8306899007375,"ns_err":28.09866879850873,"bop":15568.039443568849},{"b":"JsoniterBench.cReadStreet","p":"size=512","ns":211612.41440219368,"ns_err":2589.2823960287164,"bop":797932.1800206674},{"b":"JsoniterBench.cReadStreet","p":"size=64","ns":26219.861215470588,"ns_err":129.83274553037228,"bop":101293.12917424105},{"b":"JsoniterBench.cReadStreet","p":"size=8","ns":3938.6820206919933,"ns_err":60.73437886366435,"bop":15568.039348897077},{"b":"JsoniterBench.cReplaceId","p":"size=512","ns":403464.0986932154,"ns_err":4730.495632623863,"bop":1066664.8983470707},{"b":"JsoniterBench.cReplaceId","p":"size=64","ns":51905.299425578436,"ns_err":310.9586777970174,"bop":136221.50514546837},{"b":"JsoniterBench.cReplaceId","p":"size=8","ns":8293.54173706067,"ns_err":45.366870250531875,"bop":20648.08292845896},{"b":"JsoniterBench.cSumPrices","p":"size=512","ns":346480.2921248793,"ns_err":3040.2998598919585,"bop":1240739.1648008798},{"b":"JsoniterBench.cSumPrices","p":"size=64","ns":43270.3115923052,"ns_err":562.3835478429664,"bop":157053.69649753},{"b":"JsoniterBench.cSumPrices","p":"size=8","ns":6215.981841321687,"ns_err":36.715770439491656,"bop":22720.062167384887},{"b":"JsoniterBench.jMiss","p":"size=512","ns":173.19742195460216,"ns_err":0.8745886425744241,"bop":0.049241409708107337},{"b":"JsoniterBench.jMiss","p":"size=64","ns":170.18282988202378,"ns_err":7.749373320900109,"bop":0.004881668318560368},{"b":"JsoniterBench.jMiss","p":"size=8","ns":169.51635743539137,"ns_err":6.958041910675358,"bop":0.001686211045032304},{"b":"JsoniterBench.jModifyId","p":"size=512","ns":5620.692569075961,"ns_err":48.96556468262001,"bop":41921.59858369515},{"b":"JsoniterBench.jModifyId","p":"size=64","ns":656.3064580661179,"ns_err":4.1583288051667635,"bop":5328.01882805747},{"b":"JsoniterBench.jModifyId","p":"size=8","ns":145.07246821485765,"ns_err":1.719646674529711,"bop":992.001450012017},{"b":"JsoniterBench.jReadId","p":"size=512","ns":34.581562726891455,"ns_err":1.038623371095375,"bop":48.0098351643532},{"b":"JsoniterBench.jReadId","p":"size=64","ns":35.122013556556574,"ns_err":0.6397340916451889,"bop":48.00100983259121},{"b":"JsoniterBench.jReadId","p":"size=8","ns":36.258150714442486,"ns_err":2.100776191148797,"bop":56.00036232080111},{"b":"JsoniterBench.jReadStreet","p":"size=512","ns":179.97167732502987,"ns_err":1.0590514612941362,"bop":128.05117194569803},{"b":"JsoniterBench.jReadStreet","p":"size=64","ns":180.46406878190152,"ns_err":1.0945605345715035,"bop":128.00518272792362},{"b":"JsoniterBench.jReadStreet","p":"size=8","ns":179.53941556507158,"ns_err":1.347239964455297,"bop":128.0017929861735},{"b":"JsoniterBench.jReplaceId","p":"size=512","ns":5674.190518817036,"ns_err":40.16851880874546,"bop":41897.6137960764},{"b":"JsoniterBench.jReplaceId","p":"size=64","ns":671.1718236107314,"ns_err":6.69348787668985,"bop":5296.019251018544},{"b":"JsoniterBench.jReplaceId","p":"size=8","ns":145.93659968254067,"ns_err":0.9318823993085642,"bop":960.0014577146865},{"b":"JsoniterBench.jSumPrices","p":"size=512","ns":83876.01622775593,"ns_err":1194.562150641246,"bop":63663.994464808624},{"b":"JsoniterBench.jSumPrices","p":"size=64","ns":10585.98608626733,"ns_err":110.19964285549962,"bop":8120.304364485776},{"b":"JsoniterBench.jSumPrices","p":"size=8","ns":1492.203555787367,"ns_err":28.293219549119176,"bop":1176.0149179341017},{"b":"KyoDiBench.eoEnvFocus","p":"-","ns":78.592967291541,"ns_err":3.0739939554148843,"bop":312.00055280198353},{"b":"KyoDiBench.eoMapDrillModify","p":"-","ns":40.277157101533035,"ns_err":0.28251925352144075,"bop":216.00028319431198},{"b":"KyoDiBench.eoMapGet","p":"-","ns":2.6298864367356685,"ns_err":0.005446274862164697,"bop":1.8350288668759966e-05},{"b":"KyoDiBench.eoVarUpdateFocus","p":"-","ns":56.77974727564204,"ns_err":1.7973821364558762,"bop":200.0003992219666},{"b":"KyoDiBench.handEnvUse","p":"-","ns":74.43752760299553,"ns_err":1.0024529051329212,"bop":304.0005237194554},{"b":"KyoDiBench.handMapDrillModify","p":"-","ns":37.80931408403349,"ns_err":1.6892148497380852,"bop":216.00026606896415},{"b":"KyoDiBench.handMapGet","p":"-","ns":2.0285565151092992,"ns_err":0.0025645240655012215,"bop":1.4184679665024589e-05},{"b":"KyoDiBench.handVarUpdate","p":"-","ns":53.01635188775264,"ns_err":0.7174838906283796,"bop":184.0003725463162},{"b":"LensBench.eoGet","p":"-","ns":1.1549782245180953,"ns_err":0.0011316770345345946,"bop":8.066353549971897e-06},{"b":"LensBench.eoModify","p":"-","ns":5.1265176456891055,"ns_err":0.036484938658840206,"bop":40.00003607923678},{"b":"LensBench.eoModifyDeep","p":"-","ns":35.008800996252354,"ns_err":0.9535074280967135,"bop":152.00024623611674},{"b":"LensBench.eoReplace","p":"-","ns":5.032717631443517,"ns_err":0.6602474806816802,"bop":40.00003539451218},{"b":"LensBench.mGet","p":"-","ns":1.298759654253332,"ns_err":0.001469174017487177,"bop":9.067825364882808e-06},{"b":"LensBench.mModify","p":"-","ns":5.582374653495678,"ns_err":0.03353228933577937,"bop":40.00003925140318},{"b":"LensBench.mModifyDeep","p":"-","ns":30.30610650458747,"ns_err":0.45371811895943137,"bop":176.00021302813045},{"b":"LensBench.mReplace","p":"-","ns":4.803460315264819,"ns_err":0.04633010921188653,"bop":40.00003381584541},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=1024","ns":16271.222257730298,"ns_err":1201.8919453905285,"bop":43036.224308164936},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=256","ns":3230.3087141178926,"ns_err":14.326839600950114,"bop":9240.22142362067},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=32","ns":373.767829391718,"ns_err":1.3726895824748726,"bop":920.0054400678741},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=4","ns":76.3839404315198,"ns_err":0.25249513396359236,"bop":328.0006138870216},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=1024","ns":57429.215928541096,"ns_err":202.3777400029195,"bop":331114.77963432396},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=256","ns":13369.642447332535,"ns_err":77.82305294608443,"bop":76134.2496377612},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=32","ns":1598.0544542226912,"ns_err":21.516618320389707,"bop":8600.023208913708},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=4","ns":243.9852247065678,"ns_err":4.500761003956206,"bop":1341.335292306087},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=1024","ns":34555.71922215392,"ns_err":741.3201446947847,"bop":115176.97219488636},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=256","ns":8083.972252753609,"ns_err":81.19003864033948,"bop":26080.554156763134},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=32","ns":1009.4882350444276,"ns_err":7.339949408031387,"bop":3152.0146701533045},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=4","ns":190.44159337857874,"ns_err":3.0892566034996807,"bop":800.0015286557923},{"b":"MultiFocusBench.naive_listMap","p":"size=1024","ns":10283.67488026543,"ns_err":538.4277416963403,"bop":65578.67018648992},{"b":"MultiFocusBench.naive_listMap","p":"size=256","ns":2469.473168805653,"ns_err":10.526427738222251,"bop":16424.169246254096},{"b":"MultiFocusBench.naive_listMap","p":"size=32","ns":306.6411474465613,"ns_err":1.3506973753781149,"bop":2088.004455519372},{"b":"MultiFocusBench.naive_listMap","p":"size=4","ns":43.631610839791044,"ns_err":0.18707504623705856,"bop":296.0003506004358},{"b":"MultiFocusBench.naive_sumQty","p":"size=1024","ns":4716.23566580227,"ns_err":138.5645186854284,"bop":16129.224533780469},{"b":"MultiFocusBench.naive_sumQty","p":"size=256","ns":684.3706531537653,"ns_err":5.170343476410501,"bop":3840.0469042554455},{"b":"MultiFocusBench.naive_sumQty","p":"size=32","ns":67.03047571126022,"ns_err":0.2945898926816822,"bop":256.0009742530796},{"b":"MultiFocusBench.naive_sumQty","p":"size=4","ns":6.839965671126561,"ns_err":0.15410696240680538,"bop":5.464991678426298e-05},{"b":"MultiFocusCollectBench.eoCollectList_listSum","p":"-","ns":56.12447272331896,"ns_err":1.4203119165115095,"bop":56.0003945036272},{"b":"MultiFocusCollectBench.eoCollectMap_constSum","p":"-","ns":2.0207051461383063,"ns_err":0.002237744874973506,"bop":1.4112463101368164e-05},{"b":"MultiFocusCollectBench.eoCollectMap_zipMean","p":"-","ns":199.39450085849055,"ns_err":4.655856154839956,"bop":880.0014028441452},{"b":"MultiFocusCollectBench.eoModify_multiFocusTuple3","p":"-","ns":19.553151713387184,"ns_err":0.07904434883701175,"bop":128.00013773766534},{"b":"MultiFocusCollectBench.eoModify_multiFocusTuple6","p":"-","ns":33.630182356248156,"ns_err":0.25040180133242695,"bop":224.0002367511655},{"b":"MultiFocusCollectBench.naive_constSum","p":"-","ns":2.545165479614797,"ns_err":0.011565851539659127,"bop":16.00001789532254},{"b":"MultiFocusCollectBench.naive_listSum","p":"-","ns":31.176811920249538,"ns_err":0.2714747950216097,"bop":56.0002192152757},{"b":"MultiFocusCollectBench.naive_tuple3Rewrite","p":"-","ns":12.769065872232812,"ns_err":0.11018705864416709,"bop":96.00008983823028},{"b":"MultiFocusCollectBench.naive_tuple6Rewrite","p":"-","ns":23.243214702768626,"ns_err":0.1378141872552914,"bop":184.00016372455994},{"b":"MultiFocusCollectBench.naive_zipMeanBroadcast","p":"-","ns":207.4306690686144,"ns_err":1.8499448311349653,"bop":1176.001458067223},{"b":"OpticBuildBench.build","p":"-","ns":46.00865744970197,"ns_err":0.28110016970693247,"bop":184.00036883283713},{"b":"OpticBuildBench.buildAndUse","p":"-","ns":1087.701254167059,"ns_err":4.979155266704788,"bop":2840.008345728627},{"b":"OpticBuildBench.reuseUse","p":"-","ns":1017.2712582209411,"ns_err":13.60474985812521,"bop":2672.0071506943245},{"b":"OptionalBench.eoModify_0","p":"-","ns":22.26960089039155,"ns_err":2.661271794879961,"bop":112.00015671531284},{"b":"OptionalBench.eoModify_0_empty","p":"-","ns":1.298855098645496,"ns_err":0.0030810075710932267,"bop":9.06307500473944e-06},{"b":"OptionalBench.eoModify_3","p":"-","ns":53.929631781718946,"ns_err":0.2256496730386733,"bop":160.0003792015075},{"b":"OptionalBench.eoModify_6","p":"-","ns":126.34824816101141,"ns_err":2.702053799437681,"bop":208.00088833164827},{"b":"OptionalBench.eoModify_loyalty","p":"-","ns":18.047016801088184,"ns_err":0.17877880698170873,"bop":112.00012701084593},{"b":"OptionalBench.eoModify_loyalty_empty","p":"-","ns":1.4434967307606312,"ns_err":0.001458432009319743,"bop":1.0069198373753306e-05},{"b":"OptionalBench.eoReplace_0","p":"-","ns":6.361138148519356,"ns_err":0.06045574293077043,"bop":40.00004468432141},{"b":"OptionalBench.eoReplace_loyalty","p":"-","ns":11.378059651528071,"ns_err":0.17906263982580448,"bop":88.00007993046982},{"b":"OptionalBench.mModify_0","p":"-","ns":22.123300990131163,"ns_err":0.13122043428413313,"bop":112.00015550956303},{"b":"OptionalBench.mModify_0_empty","p":"-","ns":1.4426353839906028,"ns_err":0.0009312089433131912,"bop":1.0069381783070495e-05},{"b":"OptionalBench.mModify_3","p":"-","ns":68.33770245436386,"ns_err":0.2349340435260949,"bop":304.0004803284104},{"b":"OptionalBench.mModify_6","p":"-","ns":112.37597744460949,"ns_err":2.8294116285290567,"bop":496.000790392104},{"b":"OptionalBench.mModify_loyalty","p":"-","ns":18.634128301571486,"ns_err":0.14327440776255565,"bop":112.00013114460278},{"b":"OptionalBench.mModify_loyalty_empty","p":"-","ns":1.5866475414162684,"ns_err":0.0016996559273457924,"bop":1.1094640399094742e-05},{"b":"OptionalBench.mReplace_0","p":"-","ns":6.082237695533384,"ns_err":0.12307200720694866,"bop":40.00004276435295},{"b":"OptionalBench.mReplace_loyalty","p":"-","ns":11.983927195361268,"ns_err":2.272421958040048,"bop":88.00008423325971},{"b":"OrderAvroBench.eoModifyNames","p":"size=512","ns":33947.14943579015,"ns_err":1445.5239872046268,"bop":105610.6781964979},{"b":"OrderAvroBench.eoModifyNames","p":"size=64","ns":4034.4722772458763,"ns_err":19.157538035672506,"bop":12584.140808980033},{"b":"OrderAvroBench.eoModifyNames","p":"size=8","ns":572.882045982298,"ns_err":13.718469400691992,"bop":2048.0061482992846},{"b":"OrderAvroBench.eoModifyStreet","p":"size=512","ns":121.15266137293698,"ns_err":0.6791789745661824,"bop":328.02899357515474},{"b":"OrderAvroBench.eoModifyStreet","p":"size=64","ns":122.24591380884026,"ns_err":1.6645618432352294,"bop":328.00426560874655},{"b":"OrderAvroBench.eoModifyStreet","p":"size=8","ns":121.72226714449059,"ns_err":0.7902631570470743,"bop":328.0013060208248},{"b":"OrderAvroBench.eoReadStreet","p":"size=512","ns":35.00923506662662,"ns_err":0.6820025590663628,"bop":88.00837874812505},{"b":"OrderAvroBench.eoReadStreet","p":"size=64","ns":35.1152938501,"ns_err":0.607504178973454,"bop":88.00122524937186},{"b":"OrderAvroBench.eoReadStreet","p":"size=8","ns":34.64812241993314,"ns_err":0.21728869563550451,"bop":88.00037185498049},{"b":"OrderAvroBench.monocleModifyNames","p":"size=512","ns":100975.97005134859,"ns_err":847.4149501983073,"bop":382771.9755179157},{"b":"OrderAvroBench.monocleModifyNames","p":"size=64","ns":10240.36648306735,"ns_err":433.1673341949734,"bop":39848.34649626099},{"b":"OrderAvroBench.monocleModifyNames","p":"size=8","ns":1470.4980065400136,"ns_err":22.6972040209842,"bop":5400.01553211119},{"b":"OrderAvroBench.monocleModifyStreet","p":"size=512","ns":53788.61550316231,"ns_err":431.0305410576997,"bop":169082.5414152208},{"b":"OrderAvroBench.monocleModifyStreet","p":"size=64","ns":6973.6855460427005,"ns_err":27.739902296268436,"bop":20904.23598005582},{"b":"OrderAvroBench.monocleModifyStreet","p":"size=8","ns":931.6079327356803,"ns_err":12.048440090121954,"bop":2992.009847970793},{"b":"OrderAvroBench.monocleReadStreet","p":"size=512","ns":32089.78389003433,"ns_err":179.8057579496162,"bop":69789.54034576795},{"b":"OrderAvroBench.monocleReadStreet","p":"size=64","ns":4071.43351254939,"ns_err":16.62344491392532,"bop":8848.142081362292},{"b":"OrderAvroBench.monocleReadStreet","p":"size=8","ns":479.0786037807016,"ns_err":3.839423773229976,"bop":1208.0051589549507},{"b":"OrderAvroBench.naiveModifyNames","p":"size=512","ns":65820.0010383889,"ns_err":330.38862248050566,"bop":226299.4816415225},{"b":"OrderAvroBench.naiveModifyNames","p":"size=64","ns":8638.015402298106,"ns_err":43.80530052648248,"bop":27936.2922722123},{"b":"OrderAvroBench.naiveModifyNames","p":"size=8","ns":1124.6909620150518,"ns_err":13.083973806681799,"bop":3752.0118839504476},{"b":"OrderAvroBench.naiveModifyStreet","p":"size=512","ns":53571.07586737354,"ns_err":279.69898070800036,"bop":169060.90456130402},{"b":"OrderAvroBench.naiveModifyStreet","p":"size=64","ns":6805.6253905906315,"ns_err":216.11742815355436,"bop":20880.230219437286},{"b":"OrderAvroBench.naiveModifyStreet","p":"size=8","ns":932.681089956109,"ns_err":6.254976925398711,"bop":2968.0098551992164},{"b":"OrderAvroBench.naiveReadStreet","p":"size=512","ns":32354.770091073868,"ns_err":287.92341430300036,"bop":69789.35421949779},{"b":"OrderAvroBench.naiveReadStreet","p":"size=64","ns":4063.0348081809148,"ns_err":38.52470451527252,"bop":8848.141759736258},{"b":"OrderAvroBench.naiveReadStreet","p":"size=8","ns":488.92195814422206,"ns_err":8.495194033836102,"bop":1208.0052474619501},{"b":"OrderCirceBench.directNames","p":"size=512","ns":231988.2079310423,"ns_err":3296.6719780744966,"bop":613985.9431060441},{"b":"OrderCirceBench.directNames","p":"size=64","ns":29337.655438255555,"ns_err":620.9636975222428,"bop":76678.99563022953},{"b":"OrderCirceBench.directNames","p":"size=8","ns":4033.8566043618243,"ns_err":146.29184059997675,"bop":10688.087814040997},{"b":"OrderCirceBench.directStreet","p":"size=512","ns":1023.0319606771504,"ns_err":5.706719363179526,"bop":2744.8075201585857},{"b":"OrderCirceBench.directStreet","p":"size=64","ns":1022.2500716848211,"ns_err":9.714662837175574,"bop":2736.1061908046136},{"b":"OrderCirceBench.directStreet","p":"size=8","ns":1027.478525585431,"ns_err":18.85990036496752,"bop":2736.022480651455},{"b":"OrderCirceBench.eoNames","p":"size=512","ns":236200.15261418498,"ns_err":4432.274659903364,"bop":609925.3329129537},{"b":"OrderCirceBench.eoNames","p":"size=64","ns":29779.328380349907,"ns_err":284.76698678640713,"bop":78779.13846095583},{"b":"OrderCirceBench.eoNames","p":"size=8","ns":4198.013279665157,"ns_err":72.51552967162506,"bop":10944.091526580954},{"b":"OrderCirceBench.eoNamesIor","p":"size=512","ns":254559.84800106086,"ns_err":5199.153467037154,"bop":679444.033633364},{"b":"OrderCirceBench.eoNamesIor","p":"size=64","ns":32783.41679016899,"ns_err":652.1868111437733,"bop":87532.95521452511},{"b":"OrderCirceBench.eoNamesIor","p":"size=8","ns":4284.883009968912,"ns_err":31.043422894084536,"bop":11592.094047833001},{"b":"OrderCirceBench.eoStreet","p":"size=512","ns":1029.837227100076,"ns_err":8.379445052016843,"bop":2720.8127964705686},{"b":"OrderCirceBench.eoStreet","p":"size=64","ns":1030.496220929295,"ns_err":21.990529423960222,"bop":2720.107033830854},{"b":"OrderCirceBench.eoStreet","p":"size=8","ns":1045.475286842329,"ns_err":52.50848371229014,"bop":2720.0228884392104},{"b":"OrderCirceBench.eoStreetIor","p":"size=512","ns":1032.1083174176538,"ns_err":12.763622740943726,"bop":2736.8145832544437},{"b":"OrderCirceBench.eoStreetIor","p":"size=64","ns":1061.4794676353904,"ns_err":36.907252910891366,"bop":2736.1102387782053},{"b":"OrderCirceBench.eoStreetIor","p":"size=8","ns":1032.6319968762887,"ns_err":22.290985312582713,"bop":2736.022370938154},{"b":"OrderCirceBench.hcursorNames","p":"size=512","ns":230402.2286310947,"ns_err":4630.51321845713,"bop":605776.662384291},{"b":"OrderCirceBench.hcursorNames","p":"size=64","ns":29306.90799880952,"ns_err":703.9102967156731,"bop":77268.68234824669},{"b":"OrderCirceBench.hcursorNames","p":"size=8","ns":4039.630226634047,"ns_err":34.14030476040613,"bop":10768.090184743156},{"b":"OrderCirceBench.hcursorStreet","p":"size=512","ns":1102.9923796713765,"ns_err":7.756601366480916,"bop":3032.8706029562095},{"b":"OrderCirceBench.hcursorStreet","p":"size=64","ns":1097.624566105864,"ns_err":10.0542050558145,"bop":3032.1140685382506},{"b":"OrderCirceBench.hcursorStreet","p":"size=8","ns":1110.6227951762257,"ns_err":27.153855325693787,"bop":3032.0240460322248},{"b":"OrderCirceBench.monocleNames","p":"size=512","ns":230377.87777025154,"ns_err":2272.2524847201585,"bop":1121762.8031852443},{"b":"OrderCirceBench.monocleNames","p":"size=64","ns":26062.05112068736,"ns_err":285.09985974932886,"bop":132765.65899963523},{"b":"OrderCirceBench.monocleNames","p":"size=8","ns":3964.8475186598585,"ns_err":71.69088747889069,"bop":19488.0759894088},{"b":"OrderCirceBench.monocleStreet","p":"size=512","ns":180881.7808459299,"ns_err":11053.949299650452,"bop":908025.5481003963},{"b":"OrderCirceBench.monocleStreet","p":"size=64","ns":22191.35654132175,"ns_err":177.35921919276794,"bop":113799.36625491451},{"b":"OrderCirceBench.monocleStreet","p":"size=8","ns":3330.4138081720234,"ns_err":16.647105167512382,"bop":17048.06379448323},{"b":"OrderCirceBench.naiveNames","p":"size=512","ns":193295.0575351145,"ns_err":5152.554602959927,"bop":965265.8884192485},{"b":"OrderCirceBench.naiveNames","p":"size=64","ns":23844.438748797587,"ns_err":257.4124174115908,"bop":120845.21141860675},{"b":"OrderCirceBench.naiveNames","p":"size=8","ns":3521.407062397864,"ns_err":22.773402178127178,"bop":17808.067918394074},{"b":"OrderCirceBench.naiveStreet","p":"size=512","ns":176141.3401215884,"ns_err":1437.8756682591618,"bop":902558.3653174537},{"b":"OrderCirceBench.naiveStreet","p":"size=64","ns":22171.98050530002,"ns_err":303.5391925723062,"bop":113777.9864830193},{"b":"OrderCirceBench.naiveStreet","p":"size=8","ns":3334.08712867708,"ns_err":35.06405362777578,"bop":17050.730535640752},{"b":"OrderJsoniterBench.eoModifyStreet","p":"size=512","ns":5830.226870525901,"ns_err":92.11976844465818,"bop":42029.23915527748},{"b":"OrderJsoniterBench.eoModifyStreet","p":"size=64","ns":846.2768848210524,"ns_err":7.446444945777681,"bop":5432.09835978314},{"b":"OrderJsoniterBench.eoModifyStreet","p":"size=8","ns":349.58215978253895,"ns_err":19.62757500820431,"bop":1080.00805169939},{"b":"OrderJsoniterBench.eoReadStreet","p":"size=512","ns":184.3646145933975,"ns_err":2.547787337586699,"bop":128.16570729356923},{"b":"OrderJsoniterBench.eoReadStreet","p":"size=64","ns":182.15212870547052,"ns_err":1.7406845575095897,"bop":128.02116360316566},{"b":"OrderJsoniterBench.eoReadStreet","p":"size=8","ns":182.0670037059594,"ns_err":3.2299678403126393,"bop":128.00419228059522},{"b":"OrderJsoniterBench.eoSumPrices","p":"size=512","ns":84604.5390091077,"ns_err":775.9148989205785,"bop":63715.76972557985},{"b":"OrderJsoniterBench.eoSumPrices","p":"size=64","ns":10519.71539121822,"ns_err":58.32516207732581,"bop":8121.216934310195},{"b":"OrderJsoniterBench.eoSumPrices","p":"size=8","ns":1509.7721056532698,"ns_err":16.453679784327544,"bop":1176.03476104039},{"b":"OrderJsoniterBench.monocleModifyStreet","p":"size=512","ns":161337.4559605412,"ns_err":2442.9068546850185,"bop":333576.12119425926},{"b":"OrderJsoniterBench.monocleModifyStreet","p":"size=64","ns":19108.09212395691,"ns_err":197.15570347218573,"bop":30081.924859457882},{"b":"OrderJsoniterBench.monocleModifyStreet","p":"size=8","ns":3335.793870629508,"ns_err":17.63272341319898,"bop":4664.070420965512},{"b":"OrderJsoniterBench.monocleReadStreet","p":"size=512","ns":87933.81365281381,"ns_err":1580.1918734351943,"bop":193227.26635276756},{"b":"OrderJsoniterBench.monocleReadStreet","p":"size=64","ns":11125.207465291423,"ns_err":211.4264398733368,"bop":24705.13822274805},{"b":"OrderJsoniterBench.monocleReadStreet","p":"size=8","ns":1829.6122703205688,"ns_err":10.210294036783749,"bop":3648.03897031251},{"b":"OrderJsoniterBench.monocleSumPrices","p":"size=512","ns":403160.92714051827,"ns_err":2928.325375479425,"bop":1190729.065466169},{"b":"OrderJsoniterBench.monocleSumPrices","p":"size=64","ns":15533.245501398316,"ns_err":426.9716882136779,"bop":46876.25479364775},{"b":"OrderJsoniterBench.monocleSumPrices","p":"size=8","ns":2673.5960653886527,"ns_err":14.845633732493722,"bop":6640.056900633814},{"b":"OrderJsoniterBench.naiveModifyStreet","p":"size=512","ns":161649.3574105916,"ns_err":7222.454577703534,"bop":333567.05390343635},{"b":"OrderJsoniterBench.naiveModifyStreet","p":"size=64","ns":19040.902204140624,"ns_err":225.48686068178887,"bop":30057.9180573435},{"b":"OrderJsoniterBench.naiveModifyStreet","p":"size=8","ns":3313.36164973625,"ns_err":10.79823159847681,"bop":4640.069939087771},{"b":"OrderJsoniterBench.naiveReadStreet","p":"size=512","ns":85327.2805949001,"ns_err":1929.4088252704132,"bop":193225.04342422282},{"b":"OrderJsoniterBench.naiveReadStreet","p":"size=64","ns":11016.037344233042,"ns_err":310.43442734591,"bop":24705.126795558117},{"b":"OrderJsoniterBench.naiveReadStreet","p":"size=8","ns":1839.7875552295989,"ns_err":8.934906885099409,"bop":3648.0391931203053},{"b":"OrderJsoniterBench.naiveSumPrices","p":"size=512","ns":92440.19009847999,"ns_err":1902.1115412589504,"bop":230119.12940550974},{"b":"OrderJsoniterBench.naiveSumPrices","p":"size=64","ns":11884.181741109724,"ns_err":197.70790864436984,"bop":29337.215669038495},{"b":"OrderJsoniterBench.naiveSumPrices","p":"size=8","ns":1936.9653851794246,"ns_err":7.103859405024104,"bop":4248.041249129663},{"b":"OrderJsoniterBench.nativeReadStreet","p":"size=512","ns":33115.709370620316,"ns_err":347.97858983149774,"bop":451.4807202432582},{"b":"OrderJsoniterBench.nativeReadStreet","p":"size=64","ns":4275.918394549513,"ns_err":95.58669214950687,"bop":424.462230049326},{"b":"OrderJsoniterBench.nativeReadStreet","p":"size=8","ns":794.1547177392814,"ns_err":9.244616182145776,"bop":424.0171592269108},{"b":"OrderJsoniterBench.nativeSumPrices","p":"size=512","ns":59431.748201972754,"ns_err":996.1388904218288,"bop":86271.50357987048},{"b":"OrderJsoniterBench.nativeSumPrices","p":"size=64","ns":7414.581374089556,"ns_err":118.01883877088348,"bop":10920.800550327865},{"b":"OrderJsoniterBench.nativeSumPrices","p":"size=8","ns":1175.25477949412,"ns_err":38.13395838323485,"bop":1512.0254374555318},{"b":"PlatedBench.eoTransformDeep","p":"n=4096","ns":140316.80137111738,"ns_err":831.618811879781,"bop":624398.1231148541},{"b":"PlatedBench.eoTransformDeep","p":"n=512","ns":16687.67390854251,"ns_err":100.65123836559857,"bop":57361.71344324086},{"b":"PlatedBench.eoTransformDeep","p":"n=64","ns":1932.1247204982496,"ns_err":5.533759777452454,"bop":7184.037476938732},{"b":"PlatedBench.eoTransformExpr","p":"n=4096","ns":135687.8500254227,"ns_err":1024.1409785734625,"bop":655362.7598615265},{"b":"PlatedBench.eoTransformExpr","p":"n=512","ns":16920.98660805687,"ns_err":47.623540014664286,"bop":81825.7280557497},{"b":"PlatedBench.eoTransformExpr","p":"n=64","ns":2083.7483295295488,"ns_err":6.824104629840917,"bop":10144.040932747484},{"b":"PlatedBench.eoUniverseDeep","p":"n=4096","ns":147610.8294381612,"ns_err":923.443871360747,"bop":786611.4375838233},{"b":"PlatedBench.eoUniverseDeep","p":"n=512","ns":17928.42587614546,"ns_err":75.51579033556862,"bop":98377.84115525638},{"b":"PlatedBench.eoUniverseDeep","p":"n=64","ns":2121.0424641000895,"ns_err":15.650000793617568,"bop":12360.041953366874},{"b":"PlatedBench.eoUniverseExpr","p":"n=4096","ns":147441.70335524608,"ns_err":690.9592717461438,"bop":786419.3122466498},{"b":"PlatedBench.eoUniverseExpr","p":"n=512","ns":17379.65115868545,"ns_err":127.61858937926257,"bop":98185.77508048968},{"b":"PlatedBench.eoUniverseExpr","p":"n=64","ns":2076.1157135313206,"ns_err":11.864569022400385,"bop":12168.041946136831},{"b":"PlatedBench.eoUniverseJson","p":"n=4096","ns":254477.98431595493,"ns_err":2896.471529538322,"bop":786497.2039220056},{"b":"PlatedBench.eoUniverseJson","p":"n=512","ns":28331.90213181656,"ns_err":702.3278050503759,"bop":98186.89376350089},{"b":"PlatedBench.eoUniverseJson","p":"n=64","ns":3234.1479130335347,"ns_err":14.938497864359691,"bop":12168.0642259356},{"b":"PlatedBench.mTransformExpr","p":"n=4096","ns":173520.13354337524,"ns_err":949.6964935069901,"bop":753742.2785284301},{"b":"PlatedBench.mTransformExpr","p":"n=512","ns":16628.829501819368,"ns_err":100.2087908735478,"bop":69585.69822214231},{"b":"PlatedBench.mTransformExpr","p":"n=64","ns":2677.1827425545066,"ns_err":19.123500064780433,"bop":11728.051893013322},{"b":"PlatedBench.mUniverseExpr","p":"n=4096","ns":3990196.355411428,"ns_err":171821.4490400833,"bop":4688577.993943331},{"b":"PlatedBench.mUniverseExpr","p":"n=512","ns":295830.326831401,"ns_err":1740.8041888395612,"bop":475022.37337231584},{"b":"PlatedBench.mUniverseExpr","p":"n=64","ns":27464.81800801731,"ns_err":1131.9125192699814,"bop":45424.53299192971},{"b":"PlatedBench.mUniverseJson","p":"n=4096","ns":4374190.2671416905,"ns_err":205346.29224027236,"bop":6490719.640729595},{"b":"PlatedBench.mUniverseJson","p":"n=512","ns":329382.3797728926,"ns_err":1835.7731961299544,"bop":699929.635653592},{"b":"PlatedBench.mUniverseJson","p":"n=64","ns":30921.863832424388,"ns_err":173.1498708956773,"bop":73208.6036345629},{"b":"PlatedBench.visitorTransformDeep","p":"n=4096","ns":50295.10356285508,"ns_err":213.7512423757923,"bop":163892.61001049008},{"b":"PlatedBench.visitorTransformDeep","p":"n=512","ns":5766.971808882486,"ns_err":12.667611278206712,"bop":20496.58889295592},{"b":"PlatedBench.visitorTransformDeep","p":"n=64","ns":602.746406905786,"ns_err":10.1600711804463,"bop":2576.0116773714562},{"b":"PlatedBench.visitorTransformExpr","p":"n=4096","ns":70401.59475169596,"ns_err":207.91612449003134,"bop":360475.2446651148},{"b":"PlatedBench.visitorTransformExpr","p":"n=512","ns":8522.242673712086,"ns_err":30.41032259625708,"bop":45032.87034238945},{"b":"PlatedBench.visitorTransformExpr","p":"n=64","ns":1077.808005029031,"ns_err":2.5445298639613285,"bop":5608.020886399129},{"b":"PlatedBench.visitorUniverseDeep","p":"n=4096","ns":72613.40260969572,"ns_err":247.6955081405108,"bop":196716.85003987857},{"b":"PlatedBench.visitorUniverseDeep","p":"n=512","ns":8894.016728570421,"ns_err":31.14374507322675,"bop":24632.908334536012},{"b":"PlatedBench.visitorUniverseDeep","p":"n=64","ns":945.2087634972123,"ns_err":3.6076371306112254,"bop":3128.01834992887},{"b":"PlatedBench.visitorUniverseExpr","p":"n=4096","ns":54045.59912062457,"ns_err":345.1617004551819,"bop":196655.33913828147},{"b":"PlatedBench.visitorUniverseExpr","p":"n=512","ns":6636.770754111921,"ns_err":26.62644164697233,"bop":24584.68133175036},{"b":"PlatedBench.visitorUniverseExpr","p":"n=64","ns":786.8807756903091,"ns_err":2.5107113302033306,"bop":3080.0157186818183},{"b":"PlatedBench.visitorUniverseJson","p":"n=4096","ns":194733.6660313672,"ns_err":12526.021088908496,"bop":469789.7335731558},{"b":"PlatedBench.visitorUniverseJson","p":"n=512","ns":20689.09403290621,"ns_err":155.82518850521228,"bop":40954.11311874301},{"b":"PlatedBench.visitorUniverseJson","p":"n=64","ns":1998.2248527098684,"ns_err":11.505584051905162,"bop":5096.039015733982},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=1024","ns":13584.826470663429,"ns_err":70.65116324532701,"bop":41414.391802483486},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=16","ns":259.0053719225677,"ns_err":1.180315111185386,"bop":1088.0036725917428},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=256","ns":3321.8343939803267,"ns_err":49.14524221287149,"bop":10688.531867400367},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=4","ns":117.67340244356136,"ns_err":1.7030322552983874,"bop":608.0011287536765},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=4096","ns":56063.233941901985,"ns_err":628.4669388779439,"bop":164379.28212590827},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=64","ns":868.3014886522986,"ns_err":7.675866569914291,"bop":3008.0289874662913},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=1024","ns":61195.04911273123,"ns_err":468.4819099362128,"bop":279433.6017900378},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=16","ns":720.1628644728482,"ns_err":18.437910501453313,"bop":3736.010067090421},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=256","ns":21811.215423869613,"ns_err":168.3245211668449,"bop":107331.3623551075},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=4","ns":248.76740145395598,"ns_err":2.9261211588909384,"bop":1176.0024150994275},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=4096","ns":214508.72216238562,"ns_err":4920.733847483973,"bop":967901.2992146465},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=64","ns":2556.8204342841027,"ns_err":14.777931549145253,"bop":14520.081013132209},{"b":"PowerSeriesBench.naive_powerEach","p":"size=1024","ns":5041.172587024358,"ns_err":37.55175775535443,"bop":28730.380696874447},{"b":"PowerSeriesBench.naive_powerEach","p":"size=16","ns":91.33748046689259,"ns_err":0.7837599082191775,"bop":504.00131636274966},{"b":"PowerSeriesBench.naive_powerEach","p":"size=256","ns":1309.2093399243822,"ns_err":10.805784165622999,"bop":7224.2099284445985},{"b":"PowerSeriesBench.naive_powerEach","p":"size=4","ns":28.248665692799893,"ns_err":0.21410911427318297,"bop":168.00027740752904},{"b":"PowerSeriesBench.naive_powerEach","p":"size=4096","ns":20488.858563545138,"ns_err":229.99262794481933,"bop":114777.40872724811},{"b":"PowerSeriesBench.naive_powerEach","p":"size=64","ns":341.47455414393704,"ns_err":5.377143732646964,"bop":1848.0113488962515},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=1024","ns":77988.51974790743,"ns_err":726.8123869927266,"bop":210563.2919744548},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=16","ns":1557.306809309427,"ns_err":18.430632910910116,"bop":4768.057865319927},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=256","ns":19125.6006023625,"ns_err":309.1163786631635,"bop":53676.05142108484},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=4","ns":717.7002600601184,"ns_err":12.89527105074779,"bop":2264.0131185552277},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=64","ns":5025.316529909227,"ns_err":106.29554569776498,"bop":14616.576664829034},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=1024","ns":251617.19738632854,"ns_err":1069.9935682558887,"bop":1118858.0506351194},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=16","ns":3110.7942407763608,"ns_err":90.89048351335184,"bop":15776.111995783334},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=256","ns":96756.50578873117,"ns_err":1251.4646796822144,"bop":430210.8394055021},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=4","ns":1428.468518667533,"ns_err":82.39533834924802,"bop":5568.026140983038},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=64","ns":10315.792275109347,"ns_err":61.369954991030916,"bop":58902.45722199059},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=1024","ns":21567.315404036824,"ns_err":126.10657223075637,"bop":115071.2748500509},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=16","ns":376.19391253059246,"ns_err":3.738754215451325,"bop":2136.0143184199815},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=256","ns":5544.989406114101,"ns_err":58.339994708366845,"bop":29019.48935509364},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=4","ns":137.18038130933343,"ns_err":1.6188940732932406,"bop":792.0025846993443},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=64","ns":1331.5978495951595,"ns_err":13.424831719331955,"bop":7512.153823611184},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=128","ns":1482.6134747761637,"ns_err":152.18107082877995,"bop":4816.086275404747},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=2048","ns":26203.611993205628,"ns_err":999.732219272611,"bop":104685.31304871608},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=32","ns":377.1039759389224,"ns_err":11.83182618131013,"bop":1360.0075860261213},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=512","ns":6307.990668802596,"ns_err":139.5448269381819,"bop":24785.73127112184},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=8","ns":124.91072229707453,"ns_err":0.9051864868075363,"bop":496.0013433613172},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=128","ns":4765.595772742173,"ns_err":35.57394711600476,"bop":27784.23944697189},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=2048","ns":114148.37026194787,"ns_err":1084.1158574499025,"bop":523150.9415880315},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=32","ns":1249.6517550467809,"ns_err":8.714331525329957,"bop":7032.022949137561},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=512","ns":33984.88368838053,"ns_err":293.1442346501355,"bop":166685.71204276427},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=8","ns":372.3401020328774,"ns_err":4.990074575643543,"bop":1952.0038990527996},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=128","ns":343.61921451323894,"ns_err":3.5060761840091113,"bop":1568.0209954178922},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=2048","ns":5894.767004798745,"ns_err":72.65917027100338,"bop":24612.929866045906},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=32","ns":88.32115917848274,"ns_err":0.9561038643677301,"bop":416.0018505631521},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=512","ns":1407.112967425603,"ns_err":9.963958956550009,"bop":6176.403691740619},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=8","ns":24.831465296567483,"ns_err":0.1739597066800037,"bop":128.000276498799},{"b":"PrismBench.eoGetOptionAbsent","p":"-","ns":1.0098695575349455,"ns_err":0.000737851714589043,"bop":7.059451807612374e-06},{"b":"PrismBench.eoGetOptionPresent","p":"-","ns":1.0102519112365815,"ns_err":0.0010388047527547812,"bop":7.053485975430834e-06},{"b":"PrismBench.eoGetRightAbsent","p":"-","ns":1.1551495468625366,"ns_err":0.0020547983589267677,"bop":8.060269893549449e-06},{"b":"PrismBench.eoGetRightPresent","p":"-","ns":2.630816602804578,"ns_err":0.015859107480778383,"bop":16.00001849253879},{"b":"PrismBench.eoReverseGet","p":"-","ns":2.632091644970917,"ns_err":0.013404515955349765,"bop":16.00001850185652},{"b":"PrismBench.eoRightReverseGet","p":"-","ns":2.6322087945253014,"ns_err":0.008057771093695095,"bop":16.000018513648822},{"b":"PrismBench.mGetOptionAbsent","p":"-","ns":1.1544838373648667,"ns_err":0.0010474693082549648,"bop":8.072664544903765e-06},{"b":"PrismBench.mGetOptionPresent","p":"-","ns":1.1551094450745096,"ns_err":0.0045126708069174555,"bop":8.066922549014214e-06},{"b":"PrismBench.mGetRightAbsent","p":"-","ns":1.2985337668995753,"ns_err":0.000979537626587768,"bop":9.082666703257221e-06},{"b":"PrismBench.mGetRightPresent","p":"-","ns":2.791815255570988,"ns_err":0.01219755088733155,"bop":16.00001963541999},{"b":"PrismBench.mReverseGet","p":"-","ns":2.7314280250067253,"ns_err":0.0140944811557745,"bop":16.000019200001265},{"b":"PrismBench.mRightReverseGet","p":"-","ns":2.932133201825402,"ns_err":0.26675767355680735,"bop":16.000020617674313},{"b":"ReviewBench.eoReverseGet_0","p":"-","ns":3.1905946962813467,"ns_err":0.029074060608476705,"bop":24.00002241378293},{"b":"ReviewBench.eoReverseGet_3","p":"-","ns":18.19839552190685,"ns_err":0.1373111633250568,"bop":72.00012792241957},{"b":"ReviewBench.eoReverseGet_6","p":"-","ns":35.17187367891737,"ns_err":5.548913090765916,"bop":120.00024742355814},{"b":"ReviewBench.naiveBuild_0","p":"-","ns":3.272213006600155,"ns_err":0.028597792718193685,"bop":24.0000230083687},{"b":"ReviewBench.naiveBuild_3","p":"-","ns":10.692178939357344,"ns_err":0.09153094426818442,"bop":72.00007525112412},{"b":"ReviewBench.naiveBuild_6","p":"-","ns":18.571642427356853,"ns_err":0.1238144990059455,"bop":120.00013065745524},{"b":"SchemesBench.drosteAna","p":"-","ns":52136.36956388988,"ns_err":430.41257621939957,"bop":327632.368878023},{"b":"SchemesBench.drosteCata","p":"-","ns":40585.61336562965,"ns_err":347.8442225964206,"bop":164824.2869954142},{"b":"SchemesBench.drosteHylo","p":"-","ns":58662.23641378439,"ns_err":7580.458123704309,"bop":328640.41490535537},{"b":"SchemesBench.eoAna","p":"-","ns":102934.7220913317,"ns_err":771.876321463383,"bop":589712.7311074537},{"b":"SchemesBench.eoCata","p":"-","ns":71760.40692832068,"ns_err":531.9477481505545,"bop":197568.51005373884},{"b":"SchemesBench.eoHylo","p":"-","ns":84885.6907078893,"ns_err":723.200239513036,"bop":295848.6015419385},{"b":"SchemesBench.handAna","p":"-","ns":27919.021180727363,"ns_err":529.3156188522303,"bop":163816.1974944817},{"b":"SchemesBench.handCata","p":"-","ns":13641.803463395114,"ns_err":10.8384663664883,"bop":0.09544727583761813},{"b":"SchemesBench.handHylo","p":"-","ns":10983.885392842445,"ns_err":47.10824058464587,"bop":0.07682796057893608},{"b":"SetterBench.eoModify_0","p":"-","ns":3.31568046992187,"ns_err":0.04415018463051819,"bop":24.00002332842369},{"b":"SetterBench.eoModify_3","p":"-","ns":12.927217192542757,"ns_err":0.11876135384330955,"bop":72.00009097538445},{"b":"SetterBench.eoModify_6","p":"-","ns":25.66825001503648,"ns_err":0.08266384255205991,"bop":120.00018059098986},{"b":"SetterBench.eoModify_orderId","p":"-","ns":4.764556071070571,"ns_err":0.1070603175311599,"bop":40.00003349128932},{"b":"SetterBench.mModify_0","p":"-","ns":3.3031854715303237,"ns_err":0.025969168581061977,"bop":24.000023240262998},{"b":"SetterBench.mModify_3","p":"-","ns":29.92869123236205,"ns_err":0.12575347163025838,"bop":168.00021037140183},{"b":"SetterBench.mModify_6","p":"-","ns":59.43465584309964,"ns_err":0.6369928484398416,"bop":288.0004178974586},{"b":"SetterBench.mModify_orderId","p":"-","ns":4.725379840617033,"ns_err":0.07915392890320831,"bop":40.00003324569877},{"b":"TraversalBench.eoFoldNested","p":"size=512","ns":5490.766628002611,"ns_err":53.3951517515908,"bop":20200.871755631037},{"b":"TraversalBench.eoFoldNested","p":"size=64","ns":628.7775488277654,"ns_err":9.858072670544798,"bop":2680.0159775821635},{"b":"TraversalBench.eoFoldNested","p":"size=8","ns":56.31490559028559,"ns_err":0.4156795282799102,"bop":328.0005357064107},{"b":"TraversalBench.eoFoldPrices","p":"size=512","ns":2971.934207802223,"ns_err":25.517771127181785,"bop":12312.471880590763},{"b":"TraversalBench.eoFoldPrices","p":"size=64","ns":319.61436961156704,"ns_err":1.8677304533687982,"bop":1560.008118206731},{"b":"TraversalBench.eoFoldPrices","p":"size=8","ns":43.30538082237904,"ns_err":0.5494194372484935,"bop":216.00041143651904},{"b":"TraversalBench.eoModify","p":"size=512","ns":8225.534963779943,"ns_err":120.0628291117809,"bop":36897.3061330644},{"b":"TraversalBench.eoModify","p":"size=64","ns":895.6185856168745,"ns_err":4.515316622403768,"bop":4640.023046192384},{"b":"TraversalBench.eoModify","p":"size=8","ns":104.5572491340349,"ns_err":0.5186629751898127,"bop":608.0009940433231},{"b":"TraversalBench.mFoldPrices","p":"size=512","ns":31694.79584505824,"ns_err":257.9552219063754,"bop":162581.032842488},{"b":"TraversalBench.mFoldPrices","p":"size=64","ns":2744.438126580616,"ns_err":43.65436057158555,"bop":15424.06998349658},{"b":"TraversalBench.mFoldPrices","p":"size=8","ns":407.12609235269287,"ns_err":3.4981833736645753,"bop":2016.003885737699},{"b":"TraversalBench.mModify","p":"size=512","ns":34307.22900061759,"ns_err":249.98819801878628,"bop":176925.33523197984},{"b":"TraversalBench.mModify","p":"size=64","ns":2282.8981345524267,"ns_err":17.745948710656453,"bop":14448.058110762306},{"b":"TraversalBench.mModify","p":"size=8","ns":350.27059385370734,"ns_err":2.31293990456828,"bop":1936.0033293807635},{"b":"ZioDiBench.eoDrillGet","p":"-","ns":11.398479974359327,"ns_err":0.10662600295715997,"bop":7.970234762033856e-05},{"b":"ZioDiBench.eoDrillModify","p":"-","ns":124.55906976728963,"ns_err":1.2796360804020854,"bop":528.0008758240089},{"b":"ZioDiBench.eoServiceGet","p":"-","ns":4.590491144032266,"ns_err":0.004451844472751959,"bop":3.207874610949567e-05},{"b":"ZioDiBench.eoServiceReplace","p":"-","ns":99.5819811935177,"ns_err":0.6438057611906451,"bop":456.0006999816402},{"b":"ZioDiBench.handDrillGet","p":"-","ns":19.174268766991975,"ns_err":0.1794205055756568,"bop":120.0001347770213},{"b":"ZioDiBench.handDrillModify","p":"-","ns":121.36769714154744,"ns_err":0.7290740351773004,"bop":648.0008525493506},{"b":"ZioDiBench.handServiceGet","p":"-","ns":19.151552063074902,"ns_err":0.21210359576347393,"bop":120.00013466083753},{"b":"ZioDiBench.handServiceReplace","p":"-","ns":106.47838037802399,"ns_err":0.37150420110278926,"bop":576.0007486893361}]} {"source_sha":"188f10bd35c7a67fb18eaf4378398f98ec7c783e","date":"2026-10-01","jdk":"temurin-21","runner":"ubuntu-22.04","jmh_params":"-i 5 -wi 3 -f 3 -t 1 -foe true -prof gc -rf json -jvmArgsAppend -XX:-ResizeTLAB -jvmArgsAppend -Xms1g -jvmArgsAppend -Xmx1g","profile":"sweep:-i5-wi3-f3-t1-gc-rt1g","results":[{"b":"AffineFoldBench.eoGetOption_0","p":"-","ns":0.6721922315288479,"ns_err":0.006305728089650858,"bop":4.693831862221974e-06},{"b":"AffineFoldBench.eoGetOption_0_asAffineFold","p":"-","ns":0.6735662217328219,"ns_err":0.006321091941891661,"bop":4.700602565562778e-06},{"b":"AffineFoldBench.eoGetOption_0_asOptional","p":"-","ns":1.7704677826006217,"ns_err":0.0019904945435525825,"bop":16.00001243045804},{"b":"AffineFoldBench.eoGetOption_0_empty","p":"-","ns":0.6743628487178247,"ns_err":0.006853817235650209,"bop":4.710443784691602e-06},{"b":"AffineFoldBench.eoGetOption_3","p":"-","ns":11.595348775660112,"ns_err":0.02824681283342464,"bop":16.000081407940066},{"b":"AffineFoldBench.eoGetOption_6","p":"-","ns":22.265103680750236,"ns_err":0.01752993547400935,"bop":16.000156312943798},{"b":"AffineFoldBench.eoGetOption_loyalty","p":"-","ns":0.8094446976262015,"ns_err":0.004025375719832945,"bop":5.645963856263083e-06},{"b":"AffineFoldBench.eoGetOption_loyalty_empty","p":"-","ns":0.8154398765964271,"ns_err":0.006875380939727899,"bop":5.695754491763191e-06},{"b":"AffineFoldBench.mGetOption_0","p":"-","ns":0.699401523242267,"ns_err":0.004162915809634021,"bop":4.88566032360953e-06},{"b":"AffineFoldBench.mGetOption_0_empty","p":"-","ns":0.6971418591150186,"ns_err":0.0037667569635682152,"bop":4.866391333338915e-06},{"b":"AffineFoldBench.mGetOption_3","p":"-","ns":7.921693127298602,"ns_err":0.006557813355742528,"bop":5.5357385227208645e-05},{"b":"AffineFoldBench.mGetOption_6","p":"-","ns":19.272314153920128,"ns_err":0.6836058291845241,"bop":0.0001346771725778945},{"b":"AffineFoldBench.mGetOption_loyalty","p":"-","ns":0.8287877051230732,"ns_err":0.010482946038934822,"bop":5.789773019504978e-06},{"b":"AffineFoldBench.mGetOption_loyalty_empty","p":"-","ns":0.8176036482244572,"ns_err":0.005655598809895179,"bop":5.708272840773051e-06},{"b":"AvroBytesBench.eoGraftPayload","p":"-","ns":118.531449705176,"ns_err":1.1432598080363396,"bop":720.0021949474404},{"b":"AvroBytesBench.eoModifyCountry","p":"-","ns":223.15954145985944,"ns_err":4.857841649376486,"bop":928.0040233529397},{"b":"AvroBytesBench.eoModifyPartner","p":"-","ns":270.45661470541586,"ns_err":3.1059040720361266,"bop":984.0048425894976},{"b":"AvroBytesBench.eoReadCountry","p":"-","ns":140.56259517241585,"ns_err":1.8861344648984844,"bop":520.0023902531342},{"b":"AvroBytesBench.eoReadPartner","p":"-","ns":159.2745850287946,"ns_err":0.8118103036717615,"bop":480.00270604064707},{"b":"AvroBytesBench.eoSliceGraftPayload","p":"-","ns":232.36544379265223,"ns_err":0.7024968399662249,"bop":1192.0042331848958},{"b":"AvroBytesBench.naiveModifyCountry","p":"-","ns":2072.258094022368,"ns_err":15.886961492978273,"bop":7616.034699911162},{"b":"AvroBytesBench.naiveModifyPartner","p":"-","ns":2339.3362898648847,"ns_err":16.938798407950475,"bop":8696.039162591078},{"b":"AvroBytesBench.naivePassthroughPayload","p":"-","ns":3761.1596729773005,"ns_err":69.36219209540155,"bop":14088.062965140474},{"b":"AvroBytesBench.naiveReadCountry","p":"-","ns":1264.5017962296924,"ns_err":27.48289434921103,"bop":4256.021487373276},{"b":"AvroBytesBench.naiveReadPartner","p":"-","ns":1590.0161904805989,"ns_err":7.496335569277087,"bop":5424.027022282413},{"b":"AvroBytesBench.prunedReadCountry","p":"-","ns":681.299787559346,"ns_err":3.2405742968947155,"bop":1976.0115760141505},{"b":"AvroBytesBench.prunedReadPartner","p":"-","ns":441.0136517360057,"ns_err":1.0123730077997861,"bop":1592.0074950200515},{"b":"AvroDecodeReuseBench.cachedDecodeRecord","p":"-","ns":309.2767275002492,"ns_err":0.36466345749327367,"bop":1224.0033030430998},{"b":"AvroDecodeReuseBench.confluentRecordReader","p":"-","ns":331.78319756039923,"ns_err":0.6478602324172575,"bop":1560.0035455232216},{"b":"AvroDecodeReuseBench.confluentRecordReaderFresh","p":"-","ns":1050.2952395058658,"ns_err":4.048306479831533,"bop":3696.0112213277007},{"b":"AvroDecodeReuseBench.freshDecodeRecord","p":"-","ns":1040.401906754227,"ns_err":26.344769864851337,"bop":3344.0111223524173},{"b":"AvroEncodeRouteBench.eo_encodeToAny","p":"-","ns":43.328123122962225,"ns_err":0.11726095055344557,"bop":312.0003041337946},{"b":"AvroEncodeRouteBench.eo_encodeValue","p":"-","ns":492.59019756921765,"ns_err":3.838929338605546,"bop":568.0034593865746},{"b":"AvroEncodeRouteBench.handwritten_stream","p":"-","ns":116.02204495884057,"ns_err":0.5313042705840211,"bop":240.00081475538232},{"b":"AvroEncodeRouteBench.naive_freshPlumbing","p":"-","ns":563.6858572814747,"ns_err":19.612650341858952,"bop":2624.0039574841967},{"b":"AvroJsonBridgeBench.eoClickToAvro","p":"-","ns":2303.391918446495,"ns_err":12.448372178459595,"bop":4674.684015291526},{"b":"AvroJsonBridgeBench.eoClickToJson","p":"-","ns":2126.8324737612625,"ns_err":20.354356321333388,"bop":3984.01494046319},{"b":"AvroJsonBridgeBench.eoWideToAvro","p":"-","ns":561.9915386205448,"ns_err":25.729573467170816,"bop":2050.6711208308834},{"b":"AvroJsonBridgeBench.eoWideToJson","p":"-","ns":458.32948015446476,"ns_err":11.210722172278263,"bop":1472.0032176245595},{"b":"AvroJsonBridgeBench.naiveClickToAvro","p":"-","ns":1085.1227947627815,"ns_err":6.340088047733917,"bop":3928.0076206319213},{"b":"AvroJsonBridgeBench.naiveClickToJson","p":"-","ns":2297.97703803343,"ns_err":40.57159329716443,"bop":5856.016152911023},{"b":"AvroJsonBridgeBench.naiveWideToAvro","p":"-","ns":701.5134685129887,"ns_err":8.32930304399318,"bop":3504.004925157372},{"b":"AvroJsonBridgeBench.naiveWideToJson","p":"-","ns":1412.4497445076638,"ns_err":6.832200961011601,"bop":4376.009914177505},{"b":"AvroVulcanBench.decode_bridged","p":"-","ns":165.39479132056005,"ns_err":0.5018829880256714,"bop":880.0011607749367},{"b":"AvroVulcanBench.decode_native","p":"-","ns":13.194088797307376,"ns_err":0.05292494677759887,"bop":48.000092610426286},{"b":"AvroVulcanBench.decode_vulcanRaw","p":"-","ns":160.4344322548024,"ns_err":0.224370516143172,"bop":880.001126705323},{"b":"AvroVulcanBench.encode_bridged","p":"-","ns":174.5460661498573,"ns_err":1.0941630981117956,"bop":1224.0012249918684},{"b":"AvroVulcanBench.encode_native","p":"-","ns":9.254620371218868,"ns_err":0.010351814406689338,"bop":56.00006495180071},{"b":"AvroVulcanBench.encode_vulcanRaw","p":"-","ns":173.3265616613674,"ns_err":1.051051968919706,"bop":1224.001216067615},{"b":"AvroVulcanBench.fieldGet_bridged","p":"-","ns":78.66328766460563,"ns_err":0.37112820198459084,"bop":432.0005520706565},{"b":"AvroVulcanBench.fieldGet_native","p":"-","ns":78.92976615847638,"ns_err":1.8499284953919386,"bop":432.00055430520325},{"b":"AvroVulcanBench.rootGet_bridged","p":"-","ns":287.0436475519578,"ns_err":1.5088408739369061,"bop":1472.0020140226857},{"b":"AvroVulcanBench.rootGet_native","p":"-","ns":129.46098732786652,"ns_err":1.0012746727901296,"bop":600.0009088775291},{"b":"CapsBench.foldMapCap","p":"-","ns":16.362546092017638,"ns_err":0.01763020543749734,"bop":0.00011431109054343145},{"b":"CapsBench.foldMapDerivedHeld","p":"-","ns":16.574080932128492,"ns_err":0.014013625317627223,"bop":0.00011585401979981075},{"b":"CapsBench.foldMapDerivedPerCall","p":"-","ns":16.250409881530942,"ns_err":0.015545781534587647,"bop":0.00011347224355418015},{"b":"CapsBench.foldMapDirect","p":"-","ns":16.215918148511893,"ns_err":0.011250077313559845,"bop":0.00011324601357053178},{"b":"CapsBench.getCap","p":"-","ns":0.8844242358424038,"ns_err":0.005711271401345693,"bop":6.182524058580755e-06},{"b":"CapsBench.getDeepCap","p":"-","ns":1.126021540201465,"ns_err":0.003942992196209702,"bop":7.878576759921083e-06},{"b":"CapsBench.getDeepDirect","p":"-","ns":1.014401948524068,"ns_err":0.00874007821003486,"bop":7.093116735306629e-06},{"b":"CapsBench.getDerivedHeld","p":"-","ns":1.7559072262901059,"ns_err":0.0021886143433865086,"bop":1.2274580355888013e-05},{"b":"CapsBench.getDerivedPerCall","p":"-","ns":1.2260636967660996,"ns_err":0.0026531983313374105,"bop":8.570541926743929e-06},{"b":"CapsBench.getDirect","p":"-","ns":0.7855848463467964,"ns_err":0.008815991010259695,"bop":5.484546154673345e-06},{"b":"CapsBench.modifyCap","p":"-","ns":3.2238637155006034,"ns_err":0.008324631373952267,"bop":40.00002263985648},{"b":"CapsBench.modifyDeepCap","p":"-","ns":24.09708428867732,"ns_err":0.19990387712610572,"bop":176.00016922655647},{"b":"CapsBench.modifyDeepDirect","p":"-","ns":29.3717709472515,"ns_err":0.06186056926861217,"bop":152.0002062111761},{"b":"CapsBench.modifyDerivedHeld","p":"-","ns":3.994385243956862,"ns_err":0.010213046558780511,"bop":40.00002805168152},{"b":"CapsBench.modifyDerivedPerCall","p":"-","ns":3.650515084482032,"ns_err":0.015489324059100742,"bop":40.00002562930815},{"b":"CapsBench.modifyDirect","p":"-","ns":3.0809814137400466,"ns_err":0.011014352417629696,"bop":40.000021635791896},{"b":"ClickRecordBench.encode_derived","p":"-","ns":476.8382129934838,"ns_err":18.45334416409036,"bop":744.0033484963999},{"b":"ClickRecordBench.encode_derivedThroughPrism","p":"-","ns":452.99158968062585,"ns_err":6.515044971233379,"bop":744.0031812121244},{"b":"ClickRecordBench.encode_hand","p":"-","ns":111.22780217741624,"ns_err":0.1563037857483593,"bop":768.0007811304247},{"b":"ClickRecordBench.encode_positional","p":"-","ns":5171.368503240603,"ns_err":61.4568152366079,"bop":23912.03634965529},{"b":"ClickRecordBench.encode_vulcanFull","p":"-","ns":6135.676388133931,"ns_err":27.66692802122163,"bop":28408.04309270815},{"b":"CompositionBench.buildLens1","p":"-","ns":3.8964989938039905,"ns_err":0.017718915417019327,"bop":72.00002734778839},{"b":"CompositionBench.buildLens3","p":"-","ns":17.033330085539387,"ns_err":0.027659472137842384,"bop":184.00011958799755},{"b":"CompositionBench.buildLens6","p":"-","ns":31.641905884451774,"ns_err":0.06414017392334334,"bop":352.00022214779625},{"b":"CompositionBench.buildLensOptional3","p":"-","ns":16.763873209902293,"ns_err":0.02119665449647495,"bop":184.00011769433902},{"b":"CompositionBench.reuseLeaf","p":"-","ns":2.2672166218899066,"ns_err":0.0038729438424932277,"bop":24.000015912476453},{"b":"CompositionBench.reuseLens1","p":"-","ns":13.372532668429692,"ns_err":0.9277853109605636,"bop":40.00009391328956},{"b":"CompositionBench.reuseLens3","p":"-","ns":37.33754369782427,"ns_err":0.07558918289577769,"bop":72.0002622166522},{"b":"CompositionBench.reuseLens6","p":"-","ns":104.15007559638686,"ns_err":0.10976066578123767,"bop":120.00073098818305},{"b":"CompositionBench.reuseLensOptional3","p":"-","ns":47.43520364188556,"ns_err":0.3645401289523009,"bop":160.00033305217616},{"b":"FoldBench.eoFoldMap","p":"size=512","ns":3386.019273478586,"ns_err":4.40321253081446,"bop":14080.552279751837},{"b":"FoldBench.eoFoldMap","p":"size=64","ns":299.6402512223845,"ns_err":1.354834016275852,"bop":768.0070500844176},{"b":"FoldBench.eoFoldMap","p":"size=8","ns":16.25339593541596,"ns_err":0.028133944907158613,"bop":0.00014862113286009634},{"b":"FoldBench.eoFoldPrices","p":"size=512","ns":2428.9254067495253,"ns_err":15.010317940802704,"bop":12312.396169701138},{"b":"FoldBench.eoFoldPrices","p":"size=64","ns":287.3895074733843,"ns_err":0.2613252722900831,"bop":1560.0067543709993},{"b":"FoldBench.eoFoldPrices","p":"size=8","ns":37.22637274827054,"ns_err":0.039868504558954514,"bop":216.00034136852636},{"b":"FoldBench.mFoldMap","p":"size=512","ns":3371.4312741341796,"ns_err":3.854204770753683,"bop":14080.549834341879},{"b":"FoldBench.mFoldMap","p":"size=64","ns":294.24489620249176,"ns_err":0.5748991795420096,"bop":768.0069164614454},{"b":"FoldBench.mFoldMap","p":"size=8","ns":17.057162836413948,"ns_err":0.02322464511157561,"bop":0.0001559320435004864},{"b":"FoldBench.mFoldPrices","p":"size=512","ns":2422.553846204578,"ns_err":18.611379405590654,"bop":12312.395031536942},{"b":"FoldBench.mFoldPrices","p":"size=64","ns":287.33702236255823,"ns_err":0.26917452116814256,"bop":1560.006754387561},{"b":"FoldBench.mFoldPrices","p":"size=8","ns":37.20805595267357,"ns_err":0.0505147785463191,"bop":216.0003412845918},{"b":"GenericsBench.genLensGet","p":"-","ns":0.7812982914428854,"ns_err":0.0025043127581338594,"bop":5.451405251127198e-06},{"b":"GenericsBench.genLensModify","p":"-","ns":2.9135446178665787,"ns_err":0.0036624331667515224,"bop":24.000020455026995},{"b":"GenericsBench.genPrismGetHit","p":"-","ns":1.7615748457989586,"ns_err":0.007472024893307595,"bop":16.00001236320939},{"b":"GenericsBench.genPrismGetMiss","p":"-","ns":0.9246105606819933,"ns_err":0.00502998624123017,"bop":6.44414169892654e-06},{"b":"GenericsBench.genPrismModifyHit","p":"-","ns":2.3840736485473366,"ns_err":0.005371379382766734,"bop":24.000016743170196},{"b":"GenericsBench.genPrismModifyMiss","p":"-","ns":0.9083481418864744,"ns_err":0.0021954303790578185,"bop":6.335932664745966e-06},{"b":"GenericsBench.handLensGet","p":"-","ns":0.7812166118077438,"ns_err":0.003527275354357206,"bop":5.45423189923171e-06},{"b":"GenericsBench.handLensModify","p":"-","ns":2.3153540690317467,"ns_err":0.009497871556703024,"bop":24.00001625043548},{"b":"GenericsBench.handPrismGetHit","p":"-","ns":1.6488456608853759,"ns_err":0.002833892790574453,"bop":16.000011562028618},{"b":"GenericsBench.handPrismGetMiss","p":"-","ns":0.7960152337023381,"ns_err":0.0015173179196224709,"bop":5.559236624204386e-06},{"b":"GenericsBench.handPrismModifyHit","p":"-","ns":2.295957609172926,"ns_err":0.014550870881692182,"bop":24.000016123153696},{"b":"GenericsBench.handPrismModifyMiss","p":"-","ns":0.7735633580015958,"ns_err":0.005255325640770246,"bop":5.405744189076889e-06},{"b":"GenericsBench.rawLensGet","p":"-","ns":0.5465710487557097,"ns_err":0.00046219336713514435,"bop":3.8107553817869887e-06},{"b":"GenericsBench.rawLensModify","p":"-","ns":1.9793290057750537,"ns_err":0.004185394007856622,"bop":24.000013900701397},{"b":"GenericsBench.rawPrismGetHit","p":"-","ns":1.4339191816068033,"ns_err":0.0017566114591242544,"bop":16.000010066860263},{"b":"GenericsBench.rawPrismModifyHit","p":"-","ns":1.7423910616698413,"ns_err":0.001275032300275597,"bop":24.000012236750482},{"b":"GetterBench.eoGet_0","p":"-","ns":0.7073475530357786,"ns_err":0.01003322376210874,"bop":4.9397460297001535e-06},{"b":"GetterBench.eoGet_3","p":"-","ns":13.944528081268402,"ns_err":0.03478417070248267,"bop":9.735984019127663e-05},{"b":"GetterBench.eoGet_6","p":"-","ns":24.734491649493975,"ns_err":0.20886935188050115,"bop":0.00017284665430484535},{"b":"GetterBench.eoGet_orderId","p":"-","ns":0.702961466415767,"ns_err":0.0031632618320773854,"bop":4.909477917541334e-06},{"b":"GetterBench.mGet_0","p":"-","ns":0.42127884619782197,"ns_err":0.004988842113354329,"bop":2.9393739206766256e-06},{"b":"GetterBench.mGet_3","p":"-","ns":7.195821989183474,"ns_err":0.1433201211744533,"bop":5.0209281997347294e-05},{"b":"GetterBench.mGet_6","p":"-","ns":20.530576634748545,"ns_err":1.01287156699622,"bop":0.00014325924122105191},{"b":"GetterBench.mGet_orderId","p":"-","ns":0.42440566812864616,"ns_err":0.008788144063221471,"bop":2.9640164908395204e-06},{"b":"IsoBench.eoGet","p":"-","ns":2.7722515406620554,"ns_err":0.004558587949218709,"bop":32.00001946934832},{"b":"IsoBench.eoReverseGet","p":"-","ns":2.537263319326184,"ns_err":0.004538223456317122,"bop":32.00001781336835},{"b":"IsoBench.mGet","p":"-","ns":2.8766480458534853,"ns_err":0.003951550054881128,"bop":32.000020196388},{"b":"IsoBench.mReverseGet","p":"-","ns":2.528598591529283,"ns_err":0.0036364763233980068,"bop":32.000017756557675},{"b":"JsoniterBench.cModifyId","p":"size=512","ns":319436.9920302041,"ns_err":2025.8951397420444,"bop":1066682.8492576482},{"b":"JsoniterBench.cModifyId","p":"size=64","ns":41346.63669340424,"ns_err":348.82728356332984,"bop":136258.93032132328},{"b":"JsoniterBench.cModifyId","p":"size=8","ns":6755.990563185062,"ns_err":94.49806374918195,"bop":20704.06753759015},{"b":"JsoniterBench.cReadId","p":"size=512","ns":159126.64504654016,"ns_err":460.8098636300122,"bop":797917.2537144514},{"b":"JsoniterBench.cReadId","p":"size=64","ns":20031.37186217269,"ns_err":88.33365143897096,"bop":101288.57549981154},{"b":"JsoniterBench.cReadId","p":"size=8","ns":3078.9706760977706,"ns_err":5.376102225191111,"bop":15568.030757590233},{"b":"JsoniterBench.cReadStreet","p":"size=512","ns":159360.94602146806,"ns_err":366.7883257263518,"bop":797917.3218554982},{"b":"JsoniterBench.cReadStreet","p":"size=64","ns":20860.426908448,"ns_err":1265.7413537997218,"bop":101288.70228053593},{"b":"JsoniterBench.cReadStreet","p":"size=8","ns":3108.6137029490405,"ns_err":17.431056341461954,"bop":15568.031031106428},{"b":"JsoniterBench.cReplaceId","p":"size=512","ns":321046.64406541665,"ns_err":1427.628771435215,"bop":1066643.3250949197},{"b":"JsoniterBench.cReplaceId","p":"size=64","ns":41578.73434065379,"ns_err":287.219192137518,"bop":136218.84354509198},{"b":"JsoniterBench.cReplaceId","p":"size=8","ns":6784.4372325452605,"ns_err":95.91901410965617,"bop":20640.067737656842},{"b":"JsoniterBench.cSumPrices","p":"size=512","ns":264487.1304208235,"ns_err":1078.0654029694674,"bop":1240715.2111721088},{"b":"JsoniterBench.cSumPrices","p":"size=64","ns":32948.87108600827,"ns_err":126.25661557357716,"bop":157385.13731571168},{"b":"JsoniterBench.cSumPrices","p":"size=8","ns":4645.5917389220385,"ns_err":36.79269827930142,"bop":22682.713638622114},{"b":"JsoniterBench.jMiss","p":"size=512","ns":150.2540748588929,"ns_err":0.9323441074739552,"bop":0.04272509460838218},{"b":"JsoniterBench.jMiss","p":"size=64","ns":144.76419874343148,"ns_err":3.4957501606326233,"bop":0.004153069259130096},{"b":"JsoniterBench.jMiss","p":"size=8","ns":147.5253873811551,"ns_err":3.698410112647214,"bop":0.0014666604102226129},{"b":"JsoniterBench.jModifyId","p":"size=512","ns":2658.904681797669,"ns_err":5.957624924174246,"bop":41920.75613794952},{"b":"JsoniterBench.jModifyId","p":"size=64","ns":249.51146353782946,"ns_err":11.597463763604145,"bop":5328.007153968703},{"b":"JsoniterBench.jModifyId","p":"size=8","ns":80.94798291112019,"ns_err":2.62543117868041,"bop":984.0008079333467},{"b":"JsoniterBench.jReadId","p":"size=512","ns":28.676315018246676,"ns_err":1.815727196755042,"bop":48.008155149760306},{"b":"JsoniterBench.jReadId","p":"size=64","ns":28.59066579271736,"ns_err":1.9619819210711542,"bop":48.000820243726565},{"b":"JsoniterBench.jReadId","p":"size=8","ns":28.538464676283375,"ns_err":2.000877140088238,"bop":48.00028476099914},{"b":"JsoniterBench.jReadStreet","p":"size=512","ns":160.43279614739785,"ns_err":0.592479870300348,"bop":128.04562198921425},{"b":"JsoniterBench.jReadStreet","p":"size=64","ns":159.86766683325175,"ns_err":5.002723540339336,"bop":136.00458625658467},{"b":"JsoniterBench.jReadStreet","p":"size=8","ns":162.98202765435082,"ns_err":2.764691033765508,"bop":136.00162695639926},{"b":"JsoniterBench.jReplaceId","p":"size=512","ns":2658.687282560265,"ns_err":8.000912989812823,"bop":41896.75609973162},{"b":"JsoniterBench.jReplaceId","p":"size=64","ns":241.9496070564717,"ns_err":7.050468487409346,"bop":5296.006936990283},{"b":"JsoniterBench.jReplaceId","p":"size=8","ns":78.55706438146622,"ns_err":0.40646839912401733,"bop":936.0007841933003},{"b":"JsoniterBench.jSumPrices","p":"size=512","ns":68238.03851390883,"ns_err":140.74185351162834,"bop":63670.47864260234},{"b":"JsoniterBench.jSumPrices","p":"size=64","ns":8306.805325677475,"ns_err":21.506886159042516,"bop":8120.238456199064},{"b":"JsoniterBench.jSumPrices","p":"size=8","ns":1111.7915762808125,"ns_err":6.52822195418806,"bop":1176.0110981190599},{"b":"KyoDiBench.eoEnvFocus","p":"-","ns":51.777995117776,"ns_err":0.6691137094849169,"bop":312.00036352333547},{"b":"KyoDiBench.eoMapDrillModify","p":"-","ns":32.663431438018065,"ns_err":1.3973899178249978,"bop":216.00022907715345},{"b":"KyoDiBench.eoMapGet","p":"-","ns":1.9018199810354823,"ns_err":0.0026610845618235627,"bop":1.3270090118292464e-05},{"b":"KyoDiBench.eoVarUpdateFocus","p":"-","ns":40.30605799710915,"ns_err":0.22623325974522637,"bop":200.0002830515804},{"b":"KyoDiBench.handEnvUse","p":"-","ns":50.07152857630678,"ns_err":0.07147727560259545,"bop":304.00035142778614},{"b":"KyoDiBench.handMapDrillModify","p":"-","ns":26.955691786522056,"ns_err":0.5609323348759806,"bop":216.00018907997503},{"b":"KyoDiBench.handMapGet","p":"-","ns":1.553251307291049,"ns_err":0.0033771183150577964,"bop":1.0834730197201102e-05},{"b":"KyoDiBench.handVarUpdate","p":"-","ns":38.247028370502896,"ns_err":2.262301654011298,"bop":184.00026860349263},{"b":"LensBench.eoGet","p":"-","ns":0.7927332349931608,"ns_err":0.006720904664911256,"bop":5.531333379796086e-06},{"b":"LensBench.eoModify","p":"-","ns":3.079376374448087,"ns_err":0.005564841145693163,"bop":40.00002160666142},{"b":"LensBench.eoModifyDeep","p":"-","ns":29.846916602369323,"ns_err":0.5939535237350916,"bop":152.00020954702572},{"b":"LensBench.eoReplace","p":"-","ns":2.7014681927083024,"ns_err":0.0040949769371053015,"bop":40.000018968605055},{"b":"LensBench.mGet","p":"-","ns":0.8817238771871309,"ns_err":0.0021700399184798897,"bop":6.159809667294668e-06},{"b":"LensBench.mModify","p":"-","ns":3.4231153970771393,"ns_err":0.007427140423074579,"bop":40.000024025791355},{"b":"LensBench.mModifyDeep","p":"-","ns":23.215407238924147,"ns_err":0.04682860039554603,"bop":176.00016303252042},{"b":"LensBench.mReplace","p":"-","ns":2.637591339900416,"ns_err":0.008242231643636988,"bop":40.00001852320073},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=1024","ns":12832.41845653185,"ns_err":336.6061465121533,"bop":43035.331617744494},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=256","ns":2872.0562666781166,"ns_err":51.476488413567296,"bop":9240.196813520954},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=32","ns":299.38897768191924,"ns_err":1.5804937299190036,"bop":920.0043501210132},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=4","ns":60.75587886333092,"ns_err":0.31235245054515753,"bop":328.00048742620544},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=1024","ns":43998.18330195988,"ns_err":212.8969644147722,"bop":331141.2895447776},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=256","ns":10230.874400786743,"ns_err":46.93086451721897,"bop":76112.70124434568},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=32","ns":1066.2760114865487,"ns_err":1.7168198883041539,"bop":8600.015477576606},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=4","ns":159.78846612496966,"ns_err":1.1464766628194134,"bop":1320.0012819456058},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=1024","ns":30250.982604701345,"ns_err":423.07325305226584,"bop":115175.85486863936},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=256","ns":7049.119512982249,"ns_err":35.29106553362728,"bop":26080.48309437436},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=32","ns":793.3542203162559,"ns_err":0.9124390938439747,"bop":3152.011517464662},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=4","ns":143.6749080287748,"ns_err":0.2573579655009443,"bop":800.0011526501555},{"b":"MultiFocusBench.naive_listMap","p":"size=1024","ns":7723.930488203745,"ns_err":42.75543739916608,"bop":65578.00539073178},{"b":"MultiFocusBench.naive_listMap","p":"size=256","ns":1982.8009384548182,"ns_err":8.779212211897015,"bop":16424.13587040862},{"b":"MultiFocusBench.naive_listMap","p":"size=32","ns":212.88459277581757,"ns_err":0.18500622394000726,"bop":2088.0030899556955},{"b":"MultiFocusBench.naive_listMap","p":"size=4","ns":30.541016096181558,"ns_err":0.0703679380000024,"bop":296.000244878082},{"b":"MultiFocusBench.naive_sumQty","p":"size=1024","ns":3739.4192351697557,"ns_err":76.9222701572047,"bop":16128.970760300639},{"b":"MultiFocusBench.naive_sumQty","p":"size=256","ns":680.7297445646137,"ns_err":45.06820392206728,"bop":3840.046647154052},{"b":"MultiFocusBench.naive_sumQty","p":"size=32","ns":49.85120565604443,"ns_err":0.05298000171236028,"bop":256.0007233664818},{"b":"MultiFocusBench.naive_sumQty","p":"size=4","ns":5.539827963270219,"ns_err":0.038992799852694146,"bop":4.42297847854353e-05},{"b":"MultiFocusCollectBench.eoCollectList_listSum","p":"-","ns":52.85366312276334,"ns_err":0.08860723788620523,"bop":56.00037111589449},{"b":"MultiFocusCollectBench.eoCollectMap_constSum","p":"-","ns":1.5239954709365666,"ns_err":0.0048219714616541355,"bop":1.0633644938824557e-05},{"b":"MultiFocusCollectBench.eoCollectMap_zipMean","p":"-","ns":146.76359452300275,"ns_err":0.21508347153661186,"bop":880.00103058117},{"b":"MultiFocusCollectBench.eoModify_multiFocusTuple3","p":"-","ns":13.04310695195678,"ns_err":0.15475373616293636,"bop":128.0000915673552},{"b":"MultiFocusCollectBench.eoModify_multiFocusTuple6","p":"-","ns":21.407979762710067,"ns_err":0.03852097666366245,"bop":224.0001502081469},{"b":"MultiFocusCollectBench.naive_constSum","p":"-","ns":1.4218725592743668,"ns_err":0.0010570505118772766,"bop":16.000009982519575},{"b":"MultiFocusCollectBench.naive_listSum","p":"-","ns":25.682755257487447,"ns_err":0.07100636881345324,"bop":56.00018036594153},{"b":"MultiFocusCollectBench.naive_tuple3Rewrite","p":"-","ns":6.238717296018227,"ns_err":0.02313850204627982,"bop":96.00004378712019},{"b":"MultiFocusCollectBench.naive_tuple6Rewrite","p":"-","ns":11.405741501454072,"ns_err":0.009238175443627355,"bop":184.00008009637494},{"b":"MultiFocusCollectBench.naive_zipMeanBroadcast","p":"-","ns":127.40485958461518,"ns_err":0.18370128274436123,"bop":1176.0008947367778},{"b":"OpticBuildBench.build","p":"-","ns":36.66497163595215,"ns_err":0.3347449233513012,"bop":184.00030402076862},{"b":"OpticBuildBench.buildAndUse","p":"-","ns":793.3478371080129,"ns_err":3.538864454170757,"bop":2816.006280332106},{"b":"OpticBuildBench.reuseUse","p":"-","ns":759.8854787853832,"ns_err":24.529818425516513,"bop":2672.0053349945433},{"b":"OptionalBench.eoModify_0","p":"-","ns":19.700885214299962,"ns_err":3.0305820257293163,"bop":112.00013832001918},{"b":"OptionalBench.eoModify_0_empty","p":"-","ns":0.9656034073088586,"ns_err":0.0012947622403722922,"bop":6.7497232589572915e-06},{"b":"OptionalBench.eoModify_3","p":"-","ns":47.38911499936406,"ns_err":0.2318084836515301,"bop":160.00033280235468},{"b":"OptionalBench.eoModify_6","p":"-","ns":114.02495488526577,"ns_err":0.18362800175805746,"bop":208.00080030092914},{"b":"OptionalBench.eoModify_loyalty","p":"-","ns":13.409652705648876,"ns_err":0.02556381637444997,"bop":112.00009417458264},{"b":"OptionalBench.eoModify_loyalty_empty","p":"-","ns":1.0792628059340268,"ns_err":0.003076541180110065,"bop":7.5445084396593696e-06},{"b":"OptionalBench.eoReplace_0","p":"-","ns":3.5240852912019838,"ns_err":0.006477671136556915,"bop":40.00002472652846},{"b":"OptionalBench.eoReplace_loyalty","p":"-","ns":5.985005757720854,"ns_err":0.017515856384258684,"bop":88.00004203181531},{"b":"OptionalBench.mModify_0","p":"-","ns":17.583833740207368,"ns_err":0.024599670928627377,"bop":112.00012345129656},{"b":"OptionalBench.mModify_0_empty","p":"-","ns":1.092570285343151,"ns_err":0.0005285967033907679,"bop":7.636998891195554e-06},{"b":"OptionalBench.mModify_3","p":"-","ns":52.62077792086936,"ns_err":0.08481933907778864,"bop":304.00036931673156},{"b":"OptionalBench.mModify_6","p":"-","ns":86.78201503812943,"ns_err":0.3090924767310724,"bop":496.0006092757332},{"b":"OptionalBench.mModify_loyalty","p":"-","ns":13.008948822605864,"ns_err":0.09054529800634026,"bop":112.00009130564034},{"b":"OptionalBench.mModify_loyalty_empty","p":"-","ns":1.183287517380872,"ns_err":0.003546386836379127,"bop":8.264025302715212e-06},{"b":"OptionalBench.mReplace_0","p":"-","ns":2.863634648557659,"ns_err":0.007609152064811283,"bop":40.00002010504794},{"b":"OptionalBench.mReplace_loyalty","p":"-","ns":5.896955963712584,"ns_err":0.019677792639867138,"bop":88.0000414014278},{"b":"OrderAvroBench.eoModifyNames","p":"size=512","ns":26891.298559946816,"ns_err":206.37792518301492,"bop":97406.30522919002},{"b":"OrderAvroBench.eoModifyNames","p":"size=64","ns":3291.0191147496025,"ns_err":9.048112992298968,"bop":12584.114805753803},{"b":"OrderAvroBench.eoModifyNames","p":"size=8","ns":442.590344340841,"ns_err":3.031740114705124,"bop":2048.0047462391112},{"b":"OrderAvroBench.eoModifyStreet","p":"size=512","ns":93.25902469997887,"ns_err":0.5816813170642263,"bop":328.022318608488},{"b":"OrderAvroBench.eoModifyStreet","p":"size=64","ns":93.22176059359157,"ns_err":0.5631236840676251,"bop":328.0032543798981},{"b":"OrderAvroBench.eoModifyStreet","p":"size=8","ns":98.22781305898893,"ns_err":8.339923673718655,"bop":328.0010536132479},{"b":"OrderAvroBench.eoReadStreet","p":"size=512","ns":26.8574850180761,"ns_err":0.0912347482928183,"bop":88.00642763328999},{"b":"OrderAvroBench.eoReadStreet","p":"size=64","ns":27.16249553416791,"ns_err":0.6863221217446683,"bop":88.00094814070054},{"b":"OrderAvroBench.eoReadStreet","p":"size=8","ns":27.373975234116852,"ns_err":0.8353877550960781,"bop":88.00029362393592},{"b":"OrderAvroBench.monocleModifyNames","p":"size=512","ns":79596.4121944128,"ns_err":177.95050247869543,"bop":382782.6083777706},{"b":"OrderAvroBench.monocleModifyNames","p":"size=64","ns":7998.764142741103,"ns_err":396.6741076086062,"bop":39848.2705541287},{"b":"OrderAvroBench.monocleModifyNames","p":"size=8","ns":1059.631445515294,"ns_err":42.772897523697274,"bop":5416.011188058158},{"b":"OrderAvroBench.monocleModifyStreet","p":"size=512","ns":43496.63385436877,"ns_err":303.0068900349444,"bop":169079.01131810088},{"b":"OrderAvroBench.monocleModifyStreet","p":"size=64","ns":5374.026588394155,"ns_err":424.13442719642745,"bop":20896.18176442904},{"b":"OrderAvroBench.monocleModifyStreet","p":"size=8","ns":695.2637668982542,"ns_err":5.1470361142596115,"bop":2992.0073408281364},{"b":"OrderAvroBench.monocleReadStreet","p":"size=512","ns":26958.227644907493,"ns_err":242.9189288891558,"bop":69784.66444980334},{"b":"OrderAvroBench.monocleReadStreet","p":"size=64","ns":3442.99314701263,"ns_err":17.324423633843722,"bop":8848.12035280116},{"b":"OrderAvroBench.monocleReadStreet","p":"size=8","ns":386.91681607764707,"ns_err":1.3185227711409826,"bop":1208.004163871842},{"b":"OrderAvroBench.naiveModifyNames","p":"size=512","ns":54911.22612020489,"ns_err":174.80644162193963,"bop":226293.59741837374},{"b":"OrderAvroBench.naiveModifyNames","p":"size=64","ns":6696.849834133407,"ns_err":407.9205619876481,"bop":27928.226581945248},{"b":"OrderAvroBench.naiveModifyNames","p":"size=8","ns":829.91350162983,"ns_err":4.574558972580746,"bop":3752.00876064366},{"b":"OrderAvroBench.naiveModifyStreet","p":"size=512","ns":43090.32105626543,"ns_err":973.7692523452473,"bop":169055.92738116678},{"b":"OrderAvroBench.naiveModifyStreet","p":"size=64","ns":5387.62050403103,"ns_err":410.56556348148644,"bop":20872.18217635561},{"b":"OrderAvroBench.naiveModifyStreet","p":"size=8","ns":691.780094051824,"ns_err":2.851608156644359,"bop":2968.00730403882},{"b":"OrderAvroBench.naiveReadStreet","p":"size=512","ns":26924.90853614199,"ns_err":201.0519366107884,"bop":69784.4730256166},{"b":"OrderAvroBench.naiveReadStreet","p":"size=64","ns":3446.0644650409836,"ns_err":17.1949373472177,"bop":8848.12033445903},{"b":"OrderAvroBench.naiveReadStreet","p":"size=8","ns":388.41559804335304,"ns_err":4.253905318570606,"bop":1208.0041662519873},{"b":"OrderCirceBench.directNames","p":"size=512","ns":173434.85439146866,"ns_err":2166.7241022484186,"bop":613939.0300893175},{"b":"OrderCirceBench.directNames","p":"size=64","ns":21739.829304562587,"ns_err":772.9133562124749,"bop":77194.29138391528},{"b":"OrderCirceBench.directNames","p":"size=8","ns":2860.7619235087136,"ns_err":17.454942147033776,"bop":10688.062239977004},{"b":"OrderCirceBench.directStreet","p":"size=512","ns":744.6368373433278,"ns_err":8.46736214633397,"bop":2744.587771463821},{"b":"OrderCirceBench.directStreet","p":"size=64","ns":770.5924192718279,"ns_err":8.152852338549414,"bop":2728.0800547660483},{"b":"OrderCirceBench.directStreet","p":"size=8","ns":756.656635959774,"ns_err":4.4342696296983295,"bop":2728.0163527759055},{"b":"OrderCirceBench.eoNames","p":"size=512","ns":172696.31719868642,"ns_err":1454.2885933007074,"bop":605770.422928846},{"b":"OrderCirceBench.eoNames","p":"size=64","ns":22092.348287704073,"ns_err":770.6077659584469,"bop":78778.3278724772},{"b":"OrderCirceBench.eoNames","p":"size=8","ns":2966.3476297471084,"ns_err":29.287382886521126,"bop":10944.065112256572},{"b":"OrderCirceBench.eoNamesIor","p":"size=512","ns":180203.01564190505,"ns_err":2165.1140280394047,"bop":683488.4376323314},{"b":"OrderCirceBench.eoNamesIor","p":"size=64","ns":23250.450030795448,"ns_err":255.76342225193454,"bop":87530.38321277637},{"b":"OrderCirceBench.eoNamesIor","p":"size=8","ns":3066.149006633485,"ns_err":35.90701096997218,"bop":11592.066718817592},{"b":"OrderCirceBench.eoStreet","p":"size=512","ns":758.9103875847684,"ns_err":8.382643198608278,"bop":2720.599031260581},{"b":"OrderCirceBench.eoStreet","p":"size=64","ns":751.5945607602832,"ns_err":10.033434633103141,"bop":2720.078057535926},{"b":"OrderCirceBench.eoStreet","p":"size=8","ns":754.4780165865983,"ns_err":6.693113447352998,"bop":2720.016331032439},{"b":"OrderCirceBench.eoStreetIor","p":"size=512","ns":755.3201976809363,"ns_err":5.967295603406131,"bop":2736.5961997913087},{"b":"OrderCirceBench.eoStreetIor","p":"size=64","ns":757.1380515579115,"ns_err":7.905493820660224,"bop":2736.0788243133316},{"b":"OrderCirceBench.eoStreetIor","p":"size=8","ns":752.314836922441,"ns_err":6.488491385595242,"bop":2736.016280626127},{"b":"OrderCirceBench.hcursorNames","p":"size=512","ns":172674.7048404859,"ns_err":595.2098143902223,"bop":609834.4066591931},{"b":"OrderCirceBench.hcursorNames","p":"size=64","ns":21053.18485122981,"ns_err":206.21437328320482,"bop":77778.21843352463},{"b":"OrderCirceBench.hcursorNames","p":"size=8","ns":2928.3706194207243,"ns_err":49.134096159086894,"bop":10696.064549783017},{"b":"OrderCirceBench.hcursorStreet","p":"size=512","ns":786.8217074032295,"ns_err":6.139075187922687,"bop":3032.6210291883276},{"b":"OrderCirceBench.hcursorStreet","p":"size=64","ns":797.9903467457224,"ns_err":26.081771572028654,"bop":3032.082930826265},{"b":"OrderCirceBench.hcursorStreet","p":"size=8","ns":793.2186183533126,"ns_err":7.175313699006527,"bop":3032.017423233994},{"b":"OrderCirceBench.monocleNames","p":"size=512","ns":176456.18430035826,"ns_err":1095.973144922564,"bop":1121726.5511271183},{"b":"OrderCirceBench.monocleNames","p":"size=64","ns":19087.58683481576,"ns_err":32.048294091347444,"bop":132751.04076525106},{"b":"OrderCirceBench.monocleNames","p":"size=8","ns":2844.552415230217,"ns_err":15.11867433931097,"bop":19514.721148684366},{"b":"OrderCirceBench.monocleStreet","p":"size=512","ns":132970.72313884913,"ns_err":885.3438183854723,"bop":908004.0035041401},{"b":"OrderCirceBench.monocleStreet","p":"size=64","ns":16323.79158431012,"ns_err":32.49229089153216,"bop":113820.13226302844},{"b":"OrderCirceBench.monocleStreet","p":"size=8","ns":2412.500518338939,"ns_err":5.961339256735688,"bop":17053.37953775043},{"b":"OrderCirceBench.naiveNames","p":"size=512","ns":144378.53693619702,"ns_err":1138.162867933048,"bop":965230.3553787568},{"b":"OrderCirceBench.naiveNames","p":"size=64","ns":17638.453946874568,"ns_err":49.44036762210725,"bop":120852.24481304805},{"b":"OrderCirceBench.naiveNames","p":"size=8","ns":2549.620853194672,"ns_err":5.659058737041012,"bop":17813.38217003699},{"b":"OrderCirceBench.naiveStreet","p":"size=512","ns":133744.66192633577,"ns_err":794.3142220252037,"bop":908020.5448722953},{"b":"OrderCirceBench.naiveStreet","p":"size=64","ns":16364.48046067088,"ns_err":40.54701887636891,"bop":113769.46594942523},{"b":"OrderCirceBench.naiveStreet","p":"size=8","ns":2412.8751005288964,"ns_err":11.838645092394064,"bop":17040.04620382758},{"b":"OrderJsoniterBench.eoModifyStreet","p":"size=512","ns":2837.74931074636,"ns_err":5.2291670365499145,"bop":42026.530215173756},{"b":"OrderJsoniterBench.eoModifyStreet","p":"size=64","ns":381.9608093304677,"ns_err":3.0461275496390736,"bop":5432.044376778223},{"b":"OrderJsoniterBench.eoModifyStreet","p":"size=8","ns":229.60441319283228,"ns_err":0.4977209004530574,"bop":1072.0052850566074},{"b":"OrderJsoniterBench.eoReadStreet","p":"size=512","ns":161.91900262836543,"ns_err":1.966118564875295,"bop":109.47888673260918},{"b":"OrderJsoniterBench.eoReadStreet","p":"size=64","ns":162.15942660692,"ns_err":0.7657704145820561,"bop":128.01883908774184},{"b":"OrderJsoniterBench.eoReadStreet","p":"size=8","ns":161.16416619748745,"ns_err":2.850446743379029,"bop":72.00370802407971},{"b":"OrderJsoniterBench.eoSumPrices","p":"size=512","ns":67638.3641302421,"ns_err":959.086764644837,"bop":63712.477376210205},{"b":"OrderJsoniterBench.eoSumPrices","p":"size=64","ns":8243.177201519109,"ns_err":45.56802313127422,"bop":8120.953753441817},{"b":"OrderJsoniterBench.eoSumPrices","p":"size=8","ns":1113.9831861164453,"ns_err":4.2150229411347615,"bop":1176.0256418208414},{"b":"OrderJsoniterBench.monocleModifyStreet","p":"size=512","ns":127045.69412429,"ns_err":667.2813722141009,"bop":333562.6735717506},{"b":"OrderJsoniterBench.monocleModifyStreet","p":"size=64","ns":15368.014998673865,"ns_err":51.227736493267386,"bop":30081.54804474196},{"b":"OrderJsoniterBench.monocleModifyStreet","p":"size=8","ns":2517.241514148084,"ns_err":13.004557893514908,"bop":4664.053115378085},{"b":"OrderJsoniterBench.monocleReadStreet","p":"size=512","ns":72222.43692059017,"ns_err":657.5427051579745,"bop":193213.83230089812},{"b":"OrderJsoniterBench.monocleReadStreet","p":"size=64","ns":9175.535982661724,"ns_err":45.50451815727874,"bop":24704.93833478472},{"b":"OrderJsoniterBench.monocleReadStreet","p":"size=8","ns":1399.3822648836103,"ns_err":13.346227922758594,"bop":3648.029800876716},{"b":"OrderJsoniterBench.monocleSumPrices","p":"size=512","ns":346613.1128457782,"ns_err":1052.4784723873233,"bop":1190680.6798328469},{"b":"OrderJsoniterBench.monocleSumPrices","p":"size=64","ns":12607.480471717821,"ns_err":33.78035142336423,"bop":47387.956364971666},{"b":"OrderJsoniterBench.monocleSumPrices","p":"size=8","ns":1923.6077550824657,"ns_err":12.311644139533506,"bop":6640.040924216949},{"b":"OrderJsoniterBench.naiveModifyStreet","p":"size=512","ns":127107.65442731716,"ns_err":857.4783511686578,"bop":333537.67855737003},{"b":"OrderJsoniterBench.naiveModifyStreet","p":"size=64","ns":15458.45488087981,"ns_err":141.17550631742535,"bop":30057.557000706853},{"b":"OrderJsoniterBench.naiveModifyStreet","p":"size=8","ns":2509.864490522822,"ns_err":7.363883482429984,"bop":4640.052975750816},{"b":"OrderJsoniterBench.naiveReadStreet","p":"size=512","ns":72131.88593536742,"ns_err":476.1876208224893,"bop":193213.7505976301},{"b":"OrderJsoniterBench.naiveReadStreet","p":"size=64","ns":9137.658312489015,"ns_err":98.58892537672575,"bop":24704.934551371985},{"b":"OrderJsoniterBench.naiveReadStreet","p":"size=8","ns":1395.61713427747,"ns_err":5.691719117104034,"bop":3648.0297103278194},{"b":"OrderJsoniterBench.naiveSumPrices","p":"size=512","ns":76418.57293969952,"ns_err":826.8809552229169,"bop":230105.41099452096},{"b":"OrderJsoniterBench.naiveSumPrices","p":"size=64","ns":9617.527586494061,"ns_err":41.94903865301289,"bop":29336.983888597577},{"b":"OrderJsoniterBench.naiveSumPrices","p":"size=8","ns":1464.3417689440705,"ns_err":12.397541344823669,"bop":4248.031160702605},{"b":"OrderJsoniterBench.nativeReadStreet","p":"size=512","ns":27504.243274737724,"ns_err":1383.0479813879824,"bop":446.80958413925566},{"b":"OrderJsoniterBench.nativeReadStreet","p":"size=64","ns":3794.2183326969944,"ns_err":131.63741366295753,"bop":424.40991932874414},{"b":"OrderJsoniterBench.nativeReadStreet","p":"size=8","ns":674.7587574004431,"ns_err":4.766102038145973,"bop":424.014575078288},{"b":"OrderJsoniterBench.nativeSumPrices","p":"size=512","ns":50756.259844049746,"ns_err":203.66719547524326,"bop":86268.26167851982},{"b":"OrderJsoniterBench.nativeSumPrices","p":"size=64","ns":6238.728626003703,"ns_err":15.799351665430185,"bop":10920.67437973523},{"b":"OrderJsoniterBench.nativeSumPrices","p":"size=8","ns":912.1337330959502,"ns_err":2.485889938705037,"bop":1512.0197388695206},{"b":"PlatedBench.eoTransformDeep","p":"n=4096","ns":98230.87852588379,"ns_err":652.3175342922691,"bop":624367.4999194489},{"b":"PlatedBench.eoTransformDeep","p":"n=512","ns":10238.264331052393,"ns_err":44.70470833001172,"bop":57361.04550139318},{"b":"PlatedBench.eoTransformDeep","p":"n=64","ns":1133.9184202912427,"ns_err":6.0462946797804715,"bop":7184.021957539804},{"b":"PlatedBench.eoTransformExpr","p":"n=4096","ns":102584.77638792442,"ns_err":350.7473052280558,"bop":655338.6688227662},{"b":"PlatedBench.eoTransformExpr","p":"n=512","ns":12655.184463303174,"ns_err":30.184829397624476,"bop":81825.29221417928},{"b":"PlatedBench.eoTransformExpr","p":"n=64","ns":1560.2925557694546,"ns_err":2.6538807575535777,"bop":10144.031893936022},{"b":"PlatedBench.eoUniverseDeep","p":"n=4096","ns":101411.19667858513,"ns_err":2959.771229924505,"bop":786577.8131613525},{"b":"PlatedBench.eoUniverseDeep","p":"n=512","ns":12640.872870001047,"ns_err":38.903703987103874,"bop":98377.29108683935},{"b":"PlatedBench.eoUniverseDeep","p":"n=64","ns":1510.4064294824639,"ns_err":2.0638915322778226,"bop":12360.029277587555},{"b":"PlatedBench.eoUniverseExpr","p":"n=4096","ns":96801.24365377313,"ns_err":758.2184095520915,"bop":786382.4597243861},{"b":"PlatedBench.eoUniverseExpr","p":"n=512","ns":12228.890634218982,"ns_err":22.67541836959963,"bop":98185.25576306546},{"b":"PlatedBench.eoUniverseExpr","p":"n=64","ns":1471.2416196468914,"ns_err":3.5065484131140474,"bop":12168.029158645926},{"b":"PlatedBench.eoUniverseJson","p":"n=4096","ns":186596.94901951044,"ns_err":3480.052832064276,"bop":786447.8070130384},{"b":"PlatedBench.eoUniverseJson","p":"n=512","ns":20968.450495285746,"ns_err":70.12627817971024,"bop":98186.14131198064},{"b":"PlatedBench.eoUniverseJson","p":"n=64","ns":2454.9900243388133,"ns_err":4.780234874944559,"bop":12168.04863245406},{"b":"PlatedBench.mTransformExpr","p":"n=4096","ns":134250.00804569462,"ns_err":127.22927059141729,"bop":753713.715296758},{"b":"PlatedBench.mTransformExpr","p":"n=512","ns":12588.795678173832,"ns_err":30.300027593737713,"bop":69585.28559150684},{"b":"PlatedBench.mTransformExpr","p":"n=64","ns":2058.4343960330107,"ns_err":2.7936342999685864,"bop":11728.039865658719},{"b":"PlatedBench.mUniverseExpr","p":"n=4096","ns":2261662.3301137825,"ns_err":201336.26051159482,"bop":4687324.714360473},{"b":"PlatedBench.mUniverseExpr","p":"n=512","ns":127478.50175445802,"ns_err":7966.878312291533,"bop":475005.0938455591},{"b":"PlatedBench.mUniverseExpr","p":"n=64","ns":11213.487839682186,"ns_err":35.68719333961559,"bop":45424.21738486436},{"b":"PlatedBench.mUniverseJson","p":"n=4096","ns":2485508.690461113,"ns_err":197941.2201003976,"bop":6489350.646647937},{"b":"PlatedBench.mUniverseJson","p":"n=512","ns":151652.69081406563,"ns_err":871.6271813592278,"bop":699911.486780999},{"b":"PlatedBench.mUniverseJson","p":"n=64","ns":14457.222465683828,"ns_err":95.7581595672956,"bop":73208.28169702762},{"b":"PlatedBench.visitorTransformDeep","p":"n=4096","ns":35804.632662505675,"ns_err":515.5860537439173,"bop":163882.06266329184},{"b":"PlatedBench.visitorTransformDeep","p":"n=512","ns":3499.6951331270984,"ns_err":54.985385025046234,"bop":20496.3572396254},{"b":"PlatedBench.visitorTransformDeep","p":"n=64","ns":345.4965380982925,"ns_err":0.6448482464057681,"bop":2576.006693096436},{"b":"PlatedBench.visitorTransformExpr","p":"n=4096","ns":52289.39889284434,"ns_err":241.1302430695771,"bop":360462.0616404096},{"b":"PlatedBench.visitorTransformExpr","p":"n=512","ns":6467.174895913074,"ns_err":21.78046619572617,"bop":45032.660331005034},{"b":"PlatedBench.visitorTransformExpr","p":"n=64","ns":789.0045552132492,"ns_err":1.3502000486087722,"bop":5608.01527867951},{"b":"PlatedBench.visitorUniverseDeep","p":"n=4096","ns":46897.27844587083,"ns_err":935.5560930452957,"bop":196698.1368279284},{"b":"PlatedBench.visitorUniverseDeep","p":"n=512","ns":5627.338972354323,"ns_err":22.651139759161865,"bop":24632.574546256747},{"b":"PlatedBench.visitorUniverseDeep","p":"n=64","ns":616.8512406236017,"ns_err":5.801086809864033,"bop":3128.012234717474},{"b":"PlatedBench.visitorUniverseExpr","p":"n=4096","ns":44867.293090513595,"ns_err":889.4315170869918,"bop":196648.6594492211},{"b":"PlatedBench.visitorUniverseExpr","p":"n=512","ns":5466.0605449159475,"ns_err":10.202281768493902,"bop":24584.558072648048},{"b":"PlatedBench.visitorUniverseExpr","p":"n=64","ns":628.9414365085162,"ns_err":1.1343716025308717,"bop":3080.0121998079135},{"b":"PlatedBench.visitorUniverseJson","p":"n=4096","ns":148780.60781035593,"ns_err":2978.9980045104126,"bop":524372.28922012},{"b":"PlatedBench.visitorUniverseJson","p":"n=512","ns":16372.558155166878,"ns_err":58.33744218622853,"bop":40953.67202167092},{"b":"PlatedBench.visitorUniverseJson","p":"n=64","ns":1577.3810758209545,"ns_err":36.470710309740916,"bop":4424.03065353579},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=1024","ns":10585.796487962092,"ns_err":74.06204642099542,"bop":41413.014432021504},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=16","ns":208.6317894373494,"ns_err":1.3129452666444597,"bop":1088.0029510712882},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=256","ns":2657.0678351589213,"ns_err":44.40506794907874,"bop":10688.425499464583},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=4","ns":90.20738469340797,"ns_err":0.3680836130805681,"bop":608.0008632635513},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=4096","ns":42049.12873479231,"ns_err":1185.64038216259,"bop":164356.54570975414},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=64","ns":629.360984393922,"ns_err":7.768067454060609,"bop":3008.0209694618693},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=1024","ns":46192.471697677756,"ns_err":317.17917174754206,"bop":279423.39737754234},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=16","ns":460.2088118417639,"ns_err":25.513795426244297,"bop":3736.0064333234714},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=256","ns":16615.616938744653,"ns_err":99.67081343036605,"bop":107338.56127875582},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=4","ns":181.54415391112641,"ns_err":0.40347099871628417,"bop":1176.0017550478217},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=4096","ns":141577.02526022014,"ns_err":3519.3122093366937,"bop":967782.5444522757},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=64","ns":1707.1204494798417,"ns_err":22.55708229544119,"bop":14520.054105530326},{"b":"PowerSeriesBench.naive_powerEach","p":"size=1024","ns":4418.39332968988,"ns_err":16.167461380162802,"bop":28730.093897643816},{"b":"PowerSeriesBench.naive_powerEach","p":"size=16","ns":83.4711318041968,"ns_err":0.24210530660676044,"bop":504.00120071422697},{"b":"PowerSeriesBench.naive_powerEach","p":"size=256","ns":1328.651116511502,"ns_err":6.9646871561246675,"bop":7224.213021326394},{"b":"PowerSeriesBench.naive_powerEach","p":"size=4","ns":20.660986277420488,"ns_err":0.047556731928376,"bop":168.0002028080334},{"b":"PowerSeriesBench.naive_powerEach","p":"size=4096","ns":17545.40950309471,"ns_err":72.56812308945686,"bop":114772.59756267906},{"b":"PowerSeriesBench.naive_powerEach","p":"size=64","ns":328.45191083026725,"ns_err":0.9478910197103678,"bop":1848.0110185806395},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=1024","ns":58627.13730062363,"ns_err":831.1073293260174,"bop":210442.72039547257},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=16","ns":1092.044840104698,"ns_err":21.640953002501337,"bop":4744.040539597512},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=256","ns":15108.822726653152,"ns_err":40.84114609634377,"bop":53753.47257650813},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=4","ns":495.19613726323405,"ns_err":7.212245497632023,"bop":2240.0091223541986},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=64","ns":3871.697149487908,"ns_err":17.35879695827885,"bop":14669.778454953124},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=1024","ns":189566.4461191784,"ns_err":2414.396634355236,"bop":1118745.0551417018},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=16","ns":2089.9546275154676,"ns_err":42.634900489096744,"bop":15776.075213624023},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=256","ns":69855.81479741333,"ns_err":201.88416979743695,"bop":430202.33283405507},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=4","ns":1010.0132934403973,"ns_err":73.27502696127176,"bop":5568.018441564098},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=64","ns":7605.410070211796,"ns_err":207.9434988146796,"bop":58907.49543238187},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=1024","ns":18285.69212828823,"ns_err":225.66691803068275,"bop":115065.29689586288},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=16","ns":298.53905959973156,"ns_err":4.155217201944488,"bop":2136.011353480118},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=256","ns":4932.706948694335,"ns_err":9.867161995081013,"bop":29019.07149225612},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=4","ns":109.31631588019805,"ns_err":6.950704309146814,"bop":792.0020580817846},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=64","ns":1164.864376163475,"ns_err":10.510234588978136,"bop":7512.134348088792},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=128","ns":1075.4341791344411,"ns_err":32.025539716981214,"bop":4816.062484652365},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=2048","ns":20396.373727076065,"ns_err":707.7546399987136,"bop":104688.09042012523},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=32","ns":276.95085995092774,"ns_err":1.6143446823537464,"bop":1360.0055430651194},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=512","ns":4990.786932653805,"ns_err":19.828352789873605,"bop":24785.36957208996},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=8","ns":93.17104255676662,"ns_err":0.3477090210866218,"bop":496.00100022128737},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=128","ns":3403.2409885714683,"ns_err":24.291688207007883,"bop":27784.17096183397},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=2048","ns":78608.58071098867,"ns_err":2673.9680205965606,"bop":523132.679389455},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=32","ns":809.1330389917786,"ns_err":36.60389617431462,"bop":7024.0148405136115},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=512","ns":25613.15225976028,"ns_err":81.06158310115788,"bop":166679.38964467886},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=8","ns":222.9958915326163,"ns_err":5.440177067503336,"bop":1952.00233377884},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=128","ns":245.0097339084147,"ns_err":0.48792174785407383,"bop":1568.0148999209184},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=2048","ns":4089.45030183347,"ns_err":17.91621293922071,"bop":24611.48656844476},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=32","ns":62.75686517685968,"ns_err":0.08451032535987582,"bop":416.00131655770645},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=512","ns":1029.42976219118,"ns_err":3.4675574207141526,"bop":6176.295333615484},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=8","ns":18.924537472902863,"ns_err":0.02834331974531535,"bop":128.00021116332601},{"b":"PrismBench.eoGetOptionAbsent","p":"-","ns":0.673933533183597,"ns_err":0.0029918652506638463,"bop":4.703893613406793e-06},{"b":"PrismBench.eoGetOptionPresent","p":"-","ns":0.6749431975553909,"ns_err":0.002636616850198367,"bop":4.706688226928261e-06},{"b":"PrismBench.eoGetRightAbsent","p":"-","ns":0.7930335609158425,"ns_err":0.0019669025471085056,"bop":5.541857938689933e-06},{"b":"PrismBench.eoGetRightPresent","p":"-","ns":1.9504295896875858,"ns_err":0.005830443157372817,"bop":16.000013693459046},{"b":"PrismBench.eoReverseGet","p":"-","ns":1.9413297673620724,"ns_err":0.00752209017458211,"bop":16.000013625529736},{"b":"PrismBench.eoRightReverseGet","p":"-","ns":1.942565442943462,"ns_err":0.0036571554286165537,"bop":16.000013638280112},{"b":"PrismBench.mGetOptionAbsent","p":"-","ns":0.7948716843862532,"ns_err":0.002872822652370958,"bop":5.542866109543456e-06},{"b":"PrismBench.mGetOptionPresent","p":"-","ns":0.7960303987135519,"ns_err":0.0023537455507347976,"bop":5.561116755443061e-06},{"b":"PrismBench.mGetRightAbsent","p":"-","ns":0.921997726603464,"ns_err":0.0016049389311756914,"bop":6.4411676817972005e-06},{"b":"PrismBench.mGetRightPresent","p":"-","ns":2.093998087921576,"ns_err":0.007411107203365259,"bop":16.000014696948714},{"b":"PrismBench.mReverseGet","p":"-","ns":2.012280529902098,"ns_err":0.006635567750219424,"bop":16.000014123382677},{"b":"PrismBench.mRightReverseGet","p":"-","ns":2.009398741615337,"ns_err":0.005661704285729937,"bop":16.00001411185483},{"b":"ReviewBench.eoReverseGet_0","p":"-","ns":1.9843258628886353,"ns_err":0.0052191090764881565,"bop":24.00001393166519},{"b":"ReviewBench.eoReverseGet_3","p":"-","ns":15.890061534140424,"ns_err":0.012211915957040763,"bop":72.00011155497054},{"b":"ReviewBench.eoReverseGet_6","p":"-","ns":27.663780095967965,"ns_err":0.07372204086171606,"bop":120.00019427831465},{"b":"ReviewBench.naiveBuild_0","p":"-","ns":1.8952496670905765,"ns_err":0.004673143302297085,"bop":24.000013302100278},{"b":"ReviewBench.naiveBuild_3","p":"-","ns":5.297722147087523,"ns_err":0.011325993706879353,"bop":72.00003719421268},{"b":"ReviewBench.naiveBuild_6","p":"-","ns":8.830340692052086,"ns_err":0.012836934319693637,"bop":120.00006201441548},{"b":"SchemesBench.drosteAna","p":"-","ns":35731.5204500091,"ns_err":68.29598542533093,"bop":327632.25266404386},{"b":"SchemesBench.drosteCata","p":"-","ns":31273.792037118874,"ns_err":115.58817455897275,"bop":164824.2210791183},{"b":"SchemesBench.drosteHylo","p":"-","ns":38706.3785392663,"ns_err":112.22129546756453,"bop":328640.27369794174},{"b":"SchemesBench.eoAna","p":"-","ns":77932.08180363705,"ns_err":1060.6805725314007,"bop":589712.5534679379},{"b":"SchemesBench.eoCata","p":"-","ns":58588.199808825644,"ns_err":469.1252847220697,"bop":197568.41635684474},{"b":"SchemesBench.eoHylo","p":"-","ns":64833.97141293045,"ns_err":1236.6618090933198,"bop":295848.4608024243},{"b":"SchemesBench.handAna","p":"-","ns":18828.11768332785,"ns_err":19.918199786330284,"bop":163816.1326278326},{"b":"SchemesBench.handCata","p":"-","ns":10469.686166361984,"ns_err":10.821513312669687,"bop":0.07320707936791405},{"b":"SchemesBench.handHylo","p":"-","ns":7911.530930540987,"ns_err":573.3028847052682,"bop":0.05530308674262977},{"b":"SetterBench.eoModify_0","p":"-","ns":1.8916864063675702,"ns_err":0.002316339319876353,"bop":24.00001328125706},{"b":"SetterBench.eoModify_3","p":"-","ns":9.480789471745187,"ns_err":0.014044740951103,"bop":72.00006656252559},{"b":"SetterBench.eoModify_6","p":"-","ns":18.52186546556852,"ns_err":0.0726544083903327,"bop":120.0001300773215},{"b":"SetterBench.eoModify_orderId","p":"-","ns":2.5964924231574753,"ns_err":0.005014338952396711,"bop":40.00001822637201},{"b":"SetterBench.mModify_0","p":"-","ns":1.8957488034288328,"ns_err":0.004198730756363476,"bop":24.000013313765177},{"b":"SetterBench.mModify_3","p":"-","ns":21.498627095154472,"ns_err":0.1791930672887217,"bop":168.00015093775474},{"b":"SetterBench.mModify_6","p":"-","ns":44.589345323328416,"ns_err":0.04476818452221883,"bop":288.00031304227934},{"b":"SetterBench.mModify_orderId","p":"-","ns":2.599166022290417,"ns_err":0.007765744343586534,"bop":40.00001825360378},{"b":"TraversalBench.eoFoldNested","p":"size=512","ns":4420.327282509555,"ns_err":34.232651603768566,"bop":20200.701901683507},{"b":"TraversalBench.eoFoldNested","p":"size=64","ns":417.7305951098638,"ns_err":0.5039626328049559,"bop":2680.010610502274},{"b":"TraversalBench.eoFoldNested","p":"size=8","ns":39.57069802785977,"ns_err":0.05064363731940072,"bop":328.0003755840485},{"b":"TraversalBench.eoFoldPrices","p":"size=512","ns":2450.0535567258107,"ns_err":9.197979504096699,"bop":12312.388944937493},{"b":"TraversalBench.eoFoldPrices","p":"size=64","ns":287.45154808507255,"ns_err":0.34231094555636665,"bop":1560.0073001357587},{"b":"TraversalBench.eoFoldPrices","p":"size=8","ns":37.209534239770946,"ns_err":0.0319270069046028,"bop":216.0003529638773},{"b":"TraversalBench.eoModify","p":"size=512","ns":6529.837398429034,"ns_err":165.25025717884083,"bop":36897.03898248464},{"b":"TraversalBench.eoModify","p":"size=64","ns":654.9079709635918,"ns_err":0.8933659559077698,"bop":4640.016651325705},{"b":"TraversalBench.eoModify","p":"size=8","ns":79.22473936047767,"ns_err":0.06954628932223583,"bop":608.0007521966745},{"b":"TraversalBench.mFoldPrices","p":"size=512","ns":24531.85422842939,"ns_err":612.2040437184938,"bop":162579.89587106477},{"b":"TraversalBench.mFoldPrices","p":"size=64","ns":1735.9542927349698,"ns_err":47.38943237208541,"bop":15424.044163286368},{"b":"TraversalBench.mFoldPrices","p":"size=8","ns":235.1893434215779,"ns_err":0.42224064649475,"bop":2016.002231966884},{"b":"TraversalBench.mModify","p":"size=512","ns":25945.664917858478,"ns_err":129.6314613029044,"bop":176924.03460708677},{"b":"TraversalBench.mModify","p":"size=64","ns":1491.3600569037153,"ns_err":22.689665163366087,"bop":14448.037936845207},{"b":"TraversalBench.mModify","p":"size=8","ns":209.34261973120252,"ns_err":2.229007245298529,"bop":1936.0019876144906},{"b":"ZioDiBench.eoDrillGet","p":"-","ns":9.147373182858761,"ns_err":0.6825206933410896,"bop":6.392316785891736e-05},{"b":"ZioDiBench.eoDrillModify","p":"-","ns":83.78244559429895,"ns_err":0.6193002947988498,"bop":528.0005881627242},{"b":"ZioDiBench.eoServiceGet","p":"-","ns":3.613452742605238,"ns_err":0.005852396573092082,"bop":2.5228799409080825e-05},{"b":"ZioDiBench.eoServiceReplace","p":"-","ns":61.472618781627105,"ns_err":0.14044680987050676,"bop":456.0004317148627},{"b":"ZioDiBench.handDrillGet","p":"-","ns":12.220904122903011,"ns_err":0.03450376120407955,"bop":120.00008582619425},{"b":"ZioDiBench.handDrillModify","p":"-","ns":77.74707151185748,"ns_err":0.23237997964249227,"bop":648.0005460171374},{"b":"ZioDiBench.handServiceGet","p":"-","ns":12.17506739489272,"ns_err":0.037828216653900855,"bop":120.00008550417452},{"b":"ZioDiBench.handServiceReplace","p":"-","ns":64.62352762129794,"ns_err":0.08506144169058158,"bop":576.0004538461395}]} {"source_sha":"6e53b8574a3ff5c233303325e94c5d910496ad4b","date":"2026-10-02","jdk":"temurin-21","runner":"ubuntu-22.04","jmh_params":"-i 5 -wi 3 -f 3 -t 1 -foe true -prof gc -rf json -jvmArgsAppend -XX:-ResizeTLAB -jvmArgsAppend -Xms1g -jvmArgsAppend -Xmx1g","profile":"sweep:-i5-wi3-f3-t1-gc-rt1g","results":[{"b":"AffineFoldBench.eoGetOption_0","p":"-","ns":0.661240791514032,"ns_err":0.031789529936628,"bop":4.6167362693751e-06},{"b":"AffineFoldBench.eoGetOption_0_asAffineFold","p":"-","ns":0.6620716923484171,"ns_err":0.036690830710030244,"bop":4.62550617161849e-06},{"b":"AffineFoldBench.eoGetOption_0_asOptional","p":"-","ns":1.847447108628398,"ns_err":0.10475673277226837,"bop":16.00001297656934},{"b":"AffineFoldBench.eoGetOption_0_empty","p":"-","ns":0.6700249709223411,"ns_err":0.027014764049749642,"bop":4.677649176797849e-06},{"b":"AffineFoldBench.eoGetOption_3","p":"-","ns":8.980196986300085,"ns_err":0.19715782140481405,"bop":16.00006315429509},{"b":"AffineFoldBench.eoGetOption_6","p":"-","ns":16.242028757109242,"ns_err":0.34761519277793806,"bop":16.00011427136978},{"b":"AffineFoldBench.eoGetOption_loyalty","p":"-","ns":0.682949994349268,"ns_err":0.019478068936049434,"bop":4.770921272559553e-06},{"b":"AffineFoldBench.eoGetOption_loyalty_empty","p":"-","ns":0.6800780408627447,"ns_err":0.017430007715241874,"bop":4.748155034793973e-06},{"b":"AffineFoldBench.mGetOption_0","p":"-","ns":0.5792775518998761,"ns_err":0.015001739791680138,"bop":4.045572186893797e-06},{"b":"AffineFoldBench.mGetOption_0_empty","p":"-","ns":0.5741305938608143,"ns_err":0.010604251344820383,"bop":4.011623638927617e-06},{"b":"AffineFoldBench.mGetOption_3","p":"-","ns":5.470379778022001,"ns_err":0.09973510239308787,"bop":3.828543165008422e-05},{"b":"AffineFoldBench.mGetOption_6","p":"-","ns":13.989499947966866,"ns_err":0.38445192320053256,"bop":9.753176990283812e-05},{"b":"AffineFoldBench.mGetOption_loyalty","p":"-","ns":0.6790316137850759,"ns_err":0.016324826977320395,"bop":4.7436127285051546e-06},{"b":"AffineFoldBench.mGetOption_loyalty_empty","p":"-","ns":0.6805342868287448,"ns_err":0.01945047222646675,"bop":4.7555347903714e-06},{"b":"AvroBytesBench.eoGraftPayload","p":"-","ns":94.27081092900956,"ns_err":2.7433564106509274,"bop":720.001782264464},{"b":"AvroBytesBench.eoModifyCountry","p":"-","ns":211.76305025802748,"ns_err":7.278883701576568,"bop":933.3371685317992},{"b":"AvroBytesBench.eoModifyPartner","p":"-","ns":274.8811395157381,"ns_err":10.88647442860802,"bop":984.004915772714},{"b":"AvroBytesBench.eoReadCountry","p":"-","ns":119.96883541185295,"ns_err":5.108462922664832,"bop":520.0020402514369},{"b":"AvroBytesBench.eoReadPartner","p":"-","ns":131.256217739526,"ns_err":6.104992853116521,"bop":480.0022306086691},{"b":"AvroBytesBench.eoSliceGraftPayload","p":"-","ns":186.66436470385034,"ns_err":6.831483367051397,"bop":1192.003461399609},{"b":"AvroBytesBench.naiveModifyCountry","p":"-","ns":1909.2485988687974,"ns_err":66.7533893629141,"bop":7616.031972237933},{"b":"AvroBytesBench.naiveModifyPartner","p":"-","ns":2192.8359365827137,"ns_err":70.3552427793496,"bop":8696.036723606989},{"b":"AvroBytesBench.naivePassthroughPayload","p":"-","ns":3558.568433232886,"ns_err":87.52047646599165,"bop":14088.059596392755},{"b":"AvroBytesBench.naiveReadCountry","p":"-","ns":1162.1495365886806,"ns_err":57.92491932425548,"bop":4256.019760368298},{"b":"AvroBytesBench.naiveReadPartner","p":"-","ns":1434.3818128908727,"ns_err":63.14283390782209,"bop":5424.024400756582},{"b":"AvroBytesBench.prunedReadCountry","p":"-","ns":709.6030282416855,"ns_err":8.646328013537309,"bop":1976.0120703503608},{"b":"AvroBytesBench.prunedReadPartner","p":"-","ns":473.419129904254,"ns_err":17.1329954402839,"bop":1592.008049550196},{"b":"AvroDecodeReuseBench.cachedDecodeRecord","p":"-","ns":246.15742455274642,"ns_err":10.705902644990317,"bop":1224.0026326953425},{"b":"AvroDecodeReuseBench.confluentRecordReader","p":"-","ns":266.4731989857821,"ns_err":4.133139517113037,"bop":1560.0028492401818},{"b":"AvroDecodeReuseBench.confluentRecordReaderFresh","p":"-","ns":1125.966416243772,"ns_err":18.614057790207287,"bop":3696.0120486673704},{"b":"AvroDecodeReuseBench.freshDecodeRecord","p":"-","ns":1068.6929893915296,"ns_err":27.772400303354015,"bop":3344.011430738428},{"b":"AvroEncodeRouteBench.eo_encodeToAny","p":"-","ns":37.59167419353323,"ns_err":1.3127680255598373,"bop":312.0002642381665},{"b":"AvroEncodeRouteBench.eo_encodeValue","p":"-","ns":417.94234928619807,"ns_err":49.35405288945581,"bop":568.0029357719691},{"b":"AvroEncodeRouteBench.handwritten_stream","p":"-","ns":124.02821783962531,"ns_err":5.515464271550709,"bop":240.00087153809082},{"b":"AvroEncodeRouteBench.naive_freshPlumbing","p":"-","ns":684.9248477631571,"ns_err":19.371484193587843,"bop":2624.0048159332086},{"b":"AvroJsonBridgeBench.eoClickToAvro","p":"-","ns":2136.0080175129574,"ns_err":83.83090619650358,"bop":4664.016203410255},{"b":"AvroJsonBridgeBench.eoClickToJson","p":"-","ns":1902.260504848949,"ns_err":44.98330674667303,"bop":3984.0133589744687},{"b":"AvroJsonBridgeBench.eoWideToAvro","p":"-","ns":526.7320484861074,"ns_err":9.508421742186092,"bop":2040.00421333155},{"b":"AvroJsonBridgeBench.eoWideToJson","p":"-","ns":399.58367559321573,"ns_err":18.267362549434374,"bop":1472.0028060051798},{"b":"AvroJsonBridgeBench.naiveClickToAvro","p":"-","ns":1105.5340103944493,"ns_err":40.15101810999012,"bop":3928.0077706691804},{"b":"AvroJsonBridgeBench.naiveClickToJson","p":"-","ns":2104.701127786933,"ns_err":83.67227907857989,"bop":5856.014798820554},{"b":"AvroJsonBridgeBench.naiveWideToAvro","p":"-","ns":868.2881339202519,"ns_err":24.959806728037414,"bop":3504.0061068896507},{"b":"AvroJsonBridgeBench.naiveWideToJson","p":"-","ns":1376.5798118105429,"ns_err":21.89533297047899,"bop":4376.009668330971},{"b":"AvroVulcanBench.decode_bridged","p":"-","ns":127.50649710004963,"ns_err":2.230115000363955,"bop":832.0008954147365},{"b":"AvroVulcanBench.decode_native","p":"-","ns":14.802967702593607,"ns_err":0.25105127440723657,"bop":48.00010411739353},{"b":"AvroVulcanBench.decode_vulcanRaw","p":"-","ns":124.91965486978613,"ns_err":1.935099004711014,"bop":832.0008777843063},{"b":"AvroVulcanBench.encode_bridged","p":"-","ns":155.5259269700843,"ns_err":4.328440963513145,"bop":1234.6677603660744},{"b":"AvroVulcanBench.encode_native","p":"-","ns":11.13210135049204,"ns_err":0.7950759129398229,"bop":56.00007824686432},{"b":"AvroVulcanBench.encode_vulcanRaw","p":"-","ns":151.20927541626315,"ns_err":6.498330834096992,"bop":1229.3343943937764},{"b":"AvroVulcanBench.fieldGet_bridged","p":"-","ns":68.83894174475861,"ns_err":1.0493893075323792,"bop":432.00048414288995},{"b":"AvroVulcanBench.fieldGet_native","p":"-","ns":71.97644923657501,"ns_err":5.096428168462675,"bop":432.0005067200755},{"b":"AvroVulcanBench.rootGet_bridged","p":"-","ns":237.92842878968102,"ns_err":7.047875037335072,"bop":1424.0016729697822},{"b":"AvroVulcanBench.rootGet_native","p":"-","ns":112.28879137554715,"ns_err":2.7994881663880724,"bop":600.0007893163851},{"b":"CapsBench.foldMapCap","p":"-","ns":13.637464840224746,"ns_err":0.28356049691693896,"bop":9.50531909951034e-05},{"b":"CapsBench.foldMapDerivedHeld","p":"-","ns":14.884255138712568,"ns_err":0.45919254443968877,"bop":0.00010407594621438246},{"b":"CapsBench.foldMapDerivedPerCall","p":"-","ns":14.000904016931665,"ns_err":0.6223708861579321,"bop":9.781196072845499e-05},{"b":"CapsBench.foldMapDirect","p":"-","ns":13.649028186551728,"ns_err":0.4169064226682397,"bop":9.537411099622066e-05},{"b":"CapsBench.getCap","p":"-","ns":0.7481373652908158,"ns_err":0.02435248518790414,"bop":5.22634779414732e-06},{"b":"CapsBench.getDeepCap","p":"-","ns":0.9942267612452497,"ns_err":0.0255134551290424,"bop":6.949584375089295e-06},{"b":"CapsBench.getDeepDirect","p":"-","ns":0.9065057212808353,"ns_err":0.029491875414060814,"bop":6.329053575017044e-06},{"b":"CapsBench.getDerivedHeld","p":"-","ns":1.467058869353111,"ns_err":0.0674263892334272,"bop":1.0260876176468872e-05},{"b":"CapsBench.getDerivedPerCall","p":"-","ns":0.9661484212256715,"ns_err":0.01739954239237598,"bop":6.745381483505e-06},{"b":"CapsBench.getDirect","p":"-","ns":0.6894273786904327,"ns_err":0.016665131277222137,"bop":4.814788784908219e-06},{"b":"CapsBench.modifyCap","p":"-","ns":3.1666639169232065,"ns_err":0.1064166866667825,"bop":40.0000222443464},{"b":"CapsBench.modifyDeepCap","p":"-","ns":19.832146700414544,"ns_err":0.2726699712604331,"bop":176.00013940465143},{"b":"CapsBench.modifyDeepDirect","p":"-","ns":21.06113577254659,"ns_err":0.673914809682422,"bop":152.0001479885715},{"b":"CapsBench.modifyDerivedHeld","p":"-","ns":3.6171366158337768,"ns_err":0.1472506405008943,"bop":40.00002541302389},{"b":"CapsBench.modifyDerivedPerCall","p":"-","ns":3.513993966265211,"ns_err":0.1830762432113259,"bop":40.00002464547723},{"b":"CapsBench.modifyDirect","p":"-","ns":3.2182723717237485,"ns_err":0.12732140166541817,"bop":40.000022635158686},{"b":"ClickRecordBench.encode_derived","p":"-","ns":337.2068429629514,"ns_err":9.528289597123361,"bop":744.0023702114329},{"b":"ClickRecordBench.encode_derivedThroughPrism","p":"-","ns":336.8884653541583,"ns_err":7.287189118032272,"bop":744.0023672232768},{"b":"ClickRecordBench.encode_hand","p":"-","ns":114.11202746475918,"ns_err":1.651153060045813,"bop":768.0008025719039},{"b":"ClickRecordBench.encode_positional","p":"-","ns":4183.838680122679,"ns_err":156.95904620189552,"bop":23912.029435415927},{"b":"ClickRecordBench.encode_vulcanFull","p":"-","ns":4693.54874576758,"ns_err":105.08434601234886,"bop":28408.033050164067},{"b":"CompositionBench.buildLens1","p":"-","ns":5.849067256604198,"ns_err":0.10192162833010543,"bop":72.00004118946825},{"b":"CompositionBench.buildLens3","p":"-","ns":16.93072779639263,"ns_err":0.45053353947403224,"bop":184.00011917724584},{"b":"CompositionBench.buildLens6","p":"-","ns":35.06416095406037,"ns_err":4.356813826631195,"bop":352.00024700263646},{"b":"CompositionBench.buildLensOptional3","p":"-","ns":16.642024976048685,"ns_err":0.2659773297558892,"bop":184.00011694352892},{"b":"CompositionBench.reuseLeaf","p":"-","ns":2.362372393076078,"ns_err":0.1978581970770857,"bop":24.000016615953026},{"b":"CompositionBench.reuseLens1","p":"-","ns":15.999176863240248,"ns_err":0.4812683403151469,"bop":40.000112410654474},{"b":"CompositionBench.reuseLens3","p":"-","ns":33.56320855908753,"ns_err":0.6208853700473586,"bop":72.0002361321016},{"b":"CompositionBench.reuseLens6","p":"-","ns":73.56305952063265,"ns_err":2.9881420116398942,"bop":120.000517079149},{"b":"CompositionBench.reuseLensOptional3","p":"-","ns":35.54623862341801,"ns_err":1.4286509162811145,"bop":160.000249861036},{"b":"FoldBench.eoFoldMap","p":"size=512","ns":1329.1525397905766,"ns_err":20.883749811212112,"bop":7936.216418105484},{"b":"FoldBench.eoFoldMap","p":"size=64","ns":157.2228602474316,"ns_err":3.4811151360860872,"bop":768.0036975752064},{"b":"FoldBench.eoFoldMap","p":"size=8","ns":13.497034471958274,"ns_err":0.2815942328296902,"bop":0.00012332937608918224},{"b":"FoldBench.eoFoldPrices","p":"size=512","ns":2044.4479943317688,"ns_err":80.1214614190534,"bop":12312.332875460108},{"b":"FoldBench.eoFoldPrices","p":"size=64","ns":148.74138956876402,"ns_err":3.6101182211866782,"bop":1560.003500009821},{"b":"FoldBench.eoFoldPrices","p":"size=8","ns":19.27108213696648,"ns_err":0.5162167959009583,"bop":216.0001771530438},{"b":"FoldBench.mFoldMap","p":"size=512","ns":1344.7662410596017,"ns_err":29.841973724970032,"bop":7936.218961943544},{"b":"FoldBench.mFoldMap","p":"size=64","ns":157.46305453536286,"ns_err":4.507768550270851,"bop":768.0037062537988},{"b":"FoldBench.mFoldMap","p":"size=8","ns":13.9914057850199,"ns_err":0.784928718416135,"bop":0.00012832759904279637},{"b":"FoldBench.mFoldPrices","p":"size=512","ns":2064.3263084373075,"ns_err":103.82790860509846,"bop":12312.336080431942},{"b":"FoldBench.mFoldPrices","p":"size=64","ns":151.65841958453248,"ns_err":4.963804438019333,"bop":1560.0035667645452},{"b":"FoldBench.mFoldPrices","p":"size=8","ns":19.154656143937462,"ns_err":0.43474342041623665,"bop":216.00017610196105},{"b":"GenericsBench.genLensGet","p":"-","ns":0.6666537000478499,"ns_err":0.021493682052025353,"bop":4.661589618994953e-06},{"b":"GenericsBench.genLensModify","p":"-","ns":3.474843268724884,"ns_err":0.09907287302100669,"bop":24.000024413925516},{"b":"GenericsBench.genPrismGetHit","p":"-","ns":1.8150054336726298,"ns_err":0.07149280103822683,"bop":16.000012774488717},{"b":"GenericsBench.genPrismGetMiss","p":"-","ns":0.7465585906142168,"ns_err":0.01600252023203668,"bop":5.2168979168108854e-06},{"b":"GenericsBench.genPrismModifyHit","p":"-","ns":2.4519622351795136,"ns_err":0.08468268313623195,"bop":24.000017254785686},{"b":"GenericsBench.genPrismModifyMiss","p":"-","ns":0.7692654787057047,"ns_err":0.016467978714869644,"bop":5.3706586872603125e-06},{"b":"GenericsBench.handLensGet","p":"-","ns":0.6912553408501197,"ns_err":0.03494145509155237,"bop":4.830624838407599e-06},{"b":"GenericsBench.handLensModify","p":"-","ns":2.0416127703759477,"ns_err":0.08350192466305628,"bop":24.00001434582972},{"b":"GenericsBench.handPrismGetHit","p":"-","ns":1.4886108640493834,"ns_err":0.06514479937340839,"bop":16.000010483095597},{"b":"GenericsBench.handPrismGetMiss","p":"-","ns":0.6823851904478123,"ns_err":0.016967917259553298,"bop":4.766856840153018e-06},{"b":"GenericsBench.handPrismModifyHit","p":"-","ns":2.1192581097184724,"ns_err":0.07692950028825399,"bop":24.000014927372472},{"b":"GenericsBench.handPrismModifyMiss","p":"-","ns":0.6703517985055247,"ns_err":0.010840118127478893,"bop":4.679839630174583e-06},{"b":"GenericsBench.rawLensGet","p":"-","ns":0.4340881564108282,"ns_err":0.022361159039860048,"bop":3.0321013746980884e-06},{"b":"GenericsBench.rawLensModify","p":"-","ns":2.1135912140528608,"ns_err":0.09660641130163976,"bop":24.0000148756208},{"b":"GenericsBench.rawPrismGetHit","p":"-","ns":1.3506483310334312,"ns_err":0.033535976045748345,"bop":16.00000949947225},{"b":"GenericsBench.rawPrismModifyHit","p":"-","ns":2.059828538858947,"ns_err":0.051378828880594515,"bop":24.0000144959181},{"b":"GetterBench.eoGet_0","p":"-","ns":0.5715522371963281,"ns_err":0.013915884327708208,"bop":3.997696778119766e-06},{"b":"GetterBench.eoGet_3","p":"-","ns":8.883441200415076,"ns_err":0.2776900666922434,"bop":6.206015064736017e-05},{"b":"GetterBench.eoGet_6","p":"-","ns":17.195174322519968,"ns_err":0.507477154013398,"bop":0.00012023614628262472},{"b":"GetterBench.eoGet_orderId","p":"-","ns":0.5759404798569747,"ns_err":0.016670227719445065,"bop":4.028437867766801e-06},{"b":"GetterBench.mGet_0","p":"-","ns":0.3297125183276913,"ns_err":0.008185493828947584,"bop":2.302715944562897e-06},{"b":"GetterBench.mGet_3","p":"-","ns":4.726578524313206,"ns_err":0.4557728625390922,"bop":3.3000651152213654e-05},{"b":"GetterBench.mGet_6","p":"-","ns":14.512419503065836,"ns_err":0.4797100155246286,"bop":0.00010141358893656283},{"b":"GetterBench.mGet_orderId","p":"-","ns":0.32817676188175554,"ns_err":0.009705074173547528,"bop":2.2940225028338142e-06},{"b":"IsoBench.eoGet","p":"-","ns":2.5810451284888116,"ns_err":0.08536636025136715,"bop":32.00001815721147},{"b":"IsoBench.eoReverseGet","p":"-","ns":2.745011825298584,"ns_err":0.09311589905921938,"bop":32.000019295301776},{"b":"IsoBench.mGet","p":"-","ns":2.6889406134308946,"ns_err":0.09199583635458307,"bop":32.00001888947336},{"b":"IsoBench.mReverseGet","p":"-","ns":2.485683352045139,"ns_err":0.08854418536009616,"bop":32.00001749290555},{"b":"JsoniterBench.cModifyId","p":"size=512","ns":275758.8102385399,"ns_err":4909.13951648435,"bop":1066670.4192944895},{"b":"JsoniterBench.cModifyId","p":"size=64","ns":32031.540575791947,"ns_err":810.6272872561791,"bop":136254.21723105427},{"b":"JsoniterBench.cModifyId","p":"size=8","ns":5355.195674625581,"ns_err":186.16410789162146,"bop":20696.053502897303},{"b":"JsoniterBench.cReadId","p":"size=512","ns":133028.9211125412,"ns_err":6973.595054068951,"bop":797909.8341863385},{"b":"JsoniterBench.cReadId","p":"size=64","ns":16142.035062562065,"ns_err":480.52572975800825,"bop":101288.46381519113},{"b":"JsoniterBench.cReadId","p":"size=8","ns":2627.880438237244,"ns_err":64.80926193736443,"bop":15568.02625359162},{"b":"JsoniterBench.cReadStreet","p":"size=512","ns":128720.65647842453,"ns_err":3048.3325738485732,"bop":797908.6094393104},{"b":"JsoniterBench.cReadStreet","p":"size=64","ns":16178.445282911294,"ns_err":436.8240945321688,"bop":101288.46479839648},{"b":"JsoniterBench.cReadStreet","p":"size=8","ns":2652.5295431576233,"ns_err":81.7743357369407,"bop":15568.026501077893},{"b":"JsoniterBench.cReplaceId","p":"size=512","ns":281168.33144415205,"ns_err":9007.368153090967,"bop":1066623.9801546936},{"b":"JsoniterBench.cReplaceId","p":"size=64","ns":33580.60332950027,"ns_err":1704.8287514898163,"bop":136206.64606496657},{"b":"JsoniterBench.cReplaceId","p":"size=8","ns":5422.242680713663,"ns_err":161.97682810674087,"bop":20656.054125053055},{"b":"JsoniterBench.cSumPrices","p":"size=512","ns":242440.4954310789,"ns_err":8774.334618833782,"bop":1240708.9373059694},{"b":"JsoniterBench.cSumPrices","p":"size=64","ns":27660.61528042999,"ns_err":794.5108937475261,"bop":157582.04600022204},{"b":"JsoniterBench.cSumPrices","p":"size=8","ns":4343.609804150634,"ns_err":73.02821739897487,"bop":22720.043431535563},{"b":"JsoniterBench.jMiss","p":"size=512","ns":132.14661751516212,"ns_err":5.710420737309417,"bop":0.03757693554948154},{"b":"JsoniterBench.jMiss","p":"size=64","ns":130.84032950049755,"ns_err":4.656372196888351,"bop":0.0037511272876112212},{"b":"JsoniterBench.jMiss","p":"size=8","ns":129.74556840943623,"ns_err":4.39490727185911,"bop":0.0012907370295158528},{"b":"JsoniterBench.jModifyId","p":"size=512","ns":5380.763581888894,"ns_err":104.28018449311311,"bop":41921.530345240586},{"b":"JsoniterBench.jModifyId","p":"size=64","ns":676.2377489053141,"ns_err":6.32600827858036,"bop":5328.019395177626},{"b":"JsoniterBench.jModifyId","p":"size=8","ns":147.5234653468592,"ns_err":4.981872678873306,"bop":992.0014738477529},{"b":"JsoniterBench.jReadId","p":"size=512","ns":29.97329463408263,"ns_err":4.936244651772835,"bop":48.008524172115706},{"b":"JsoniterBench.jReadId","p":"size=64","ns":32.90912473152994,"ns_err":6.911771737971364,"bop":56.00094504789574},{"b":"JsoniterBench.jReadId","p":"size=8","ns":30.49517879535518,"ns_err":5.565580384111871,"bop":48.00030438359012},{"b":"JsoniterBench.jReadStreet","p":"size=512","ns":133.02658278315,"ns_err":7.771197994141312,"bop":144.03783124025875},{"b":"JsoniterBench.jReadStreet","p":"size=64","ns":126.48370937701773,"ns_err":2.990273044360565,"bop":144.00362918236254},{"b":"JsoniterBench.jReadStreet","p":"size=8","ns":130.77510465955038,"ns_err":5.144476909184561,"bop":136.00130534876035},{"b":"JsoniterBench.jReplaceId","p":"size=512","ns":5291.320546926654,"ns_err":63.55827930494845,"bop":41889.50490132764},{"b":"JsoniterBench.jReplaceId","p":"size=64","ns":670.4869127871682,"ns_err":12.090423080234723,"bop":5296.019230542203},{"b":"JsoniterBench.jReplaceId","p":"size=8","ns":146.81098071310996,"ns_err":2.8552780524053816,"bop":960.0014665301734},{"b":"JsoniterBench.jSumPrices","p":"size=512","ns":58899.73208322918,"ns_err":1778.0338485734753,"bop":63676.64301104904},{"b":"JsoniterBench.jSumPrices","p":"size=64","ns":7499.483932069426,"ns_err":211.35330200151978,"bop":8120.215371339379},{"b":"JsoniterBench.jSumPrices","p":"size=8","ns":979.0042080921629,"ns_err":23.005118934984022,"bop":1176.009776335463},{"b":"KyoDiBench.eoEnvFocus","p":"-","ns":73.28394537629025,"ns_err":2.275848361087365,"bop":320.00051447585645},{"b":"KyoDiBench.eoMapDrillModify","p":"-","ns":25.535054108734013,"ns_err":0.690271624650705,"bop":216.00017949221575},{"b":"KyoDiBench.eoMapGet","p":"-","ns":1.5978115525434153,"ns_err":0.03300743157442481,"bop":1.1155550781854936e-05},{"b":"KyoDiBench.eoVarUpdateFocus","p":"-","ns":61.330596674391046,"ns_err":1.5722211646275677,"bop":216.00043070289414},{"b":"KyoDiBench.handEnvUse","p":"-","ns":71.06916574295009,"ns_err":1.312345358560145,"bop":312.0004992528919},{"b":"KyoDiBench.handMapDrillModify","p":"-","ns":23.238323193263273,"ns_err":0.8636009408940689,"bop":216.00016332816813},{"b":"KyoDiBench.handMapGet","p":"-","ns":1.2146733238421372,"ns_err":0.03134870553056276,"bop":8.488395127765275e-06},{"b":"KyoDiBench.handVarUpdate","p":"-","ns":55.86124808539247,"ns_err":1.5860191635785494,"bop":200.00039286255105},{"b":"LensBench.eoGet","p":"-","ns":0.6955526973435131,"ns_err":0.028410077632967545,"bop":4.860406588139662e-06},{"b":"LensBench.eoModify","p":"-","ns":3.5225532577592635,"ns_err":0.12694711141385734,"bop":40.000024800373616},{"b":"LensBench.eoModifyDeep","p":"-","ns":21.37712055432502,"ns_err":0.509537645853585,"bop":152.0001502975212},{"b":"LensBench.eoReplace","p":"-","ns":3.204177476571145,"ns_err":0.13767707443861854,"bop":40.00002252221434},{"b":"LensBench.mGet","p":"-","ns":0.7569428129209326,"ns_err":0.028817317611039086,"bop":5.2975917260194646e-06},{"b":"LensBench.mModify","p":"-","ns":3.1658200408145816,"ns_err":0.13756175069685028,"bop":40.00002224647291},{"b":"LensBench.mModifyDeep","p":"-","ns":19.696139541040644,"ns_err":0.914604912380678,"bop":176.0001382783609},{"b":"LensBench.mReplace","p":"-","ns":3.177887846880427,"ns_err":0.06273610955529316,"bop":40.00002234417561},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=1024","ns":13486.574723738106,"ns_err":639.8055435068032,"bop":43035.49656391199},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=256","ns":2473.33751686885,"ns_err":34.20896199196731,"bop":9240.169523465902},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=32","ns":290.2040901757922,"ns_err":34.508203212967544,"bop":920.0042155675263},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=4","ns":48.56121755113933,"ns_err":0.5032373434638556,"bop":328.0003892731645},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=1024","ns":51824.682116749565,"ns_err":1257.824477882706,"bop":331137.5477808408},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=256","ns":11249.39601251068,"ns_err":198.5427848094772,"bop":76112.7711457948},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=32","ns":1516.69181794831,"ns_err":15.540384644974173,"bop":8600.022075205312},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=4","ns":155.43276325068638,"ns_err":4.758825967228808,"bop":1320.0012489643636},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=1024","ns":26492.47221157635,"ns_err":2139.818087069062,"bop":115174.86888626244},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=256","ns":6149.35369732759,"ns_err":94.74239815702893,"bop":26080.421407606013},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=32","ns":798.4398626154086,"ns_err":25.7962779929034,"bop":3152.0116031055572},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=4","ns":117.99120805613084,"ns_err":1.8957742811702305,"bop":800.0009485881131},{"b":"MultiFocusBench.naive_listMap","p":"size=1024","ns":8404.53154368146,"ns_err":652.0463506666698,"bop":65578.17863185133},{"b":"MultiFocusBench.naive_listMap","p":"size=256","ns":1876.0963318992524,"ns_err":40.13408041033996,"bop":16424.128586316416},{"b":"MultiFocusBench.naive_listMap","p":"size=32","ns":243.8891290427233,"ns_err":11.43177520969023,"bop":2088.0035430506696},{"b":"MultiFocusBench.naive_listMap","p":"size=4","ns":29.252129055928897,"ns_err":0.43291976617310224,"bop":296.00023504157184},{"b":"MultiFocusBench.naive_sumQty","p":"size=1024","ns":3994.2324466228956,"ns_err":178.280138853531,"bop":16129.035505769358},{"b":"MultiFocusBench.naive_sumQty","p":"size=256","ns":613.0275640921268,"ns_err":10.200410816957739,"bop":3840.0420122967757},{"b":"MultiFocusBench.naive_sumQty","p":"size=32","ns":52.360264014544526,"ns_err":0.8403999947885427,"bop":256.0007605959747},{"b":"MultiFocusBench.naive_sumQty","p":"size=4","ns":4.742998549682321,"ns_err":0.15917304411165742,"bop":3.7867476183225584e-05},{"b":"MultiFocusCollectBench.eoCollectList_listSum","p":"-","ns":24.117910116942944,"ns_err":0.7025145253155773,"bop":56.0001695064604},{"b":"MultiFocusCollectBench.eoCollectMap_constSum","p":"-","ns":1.2651140490477573,"ns_err":0.03336245409986285,"bop":8.843416283206861e-06},{"b":"MultiFocusCollectBench.eoCollectMap_zipMean","p":"-","ns":100.93438801577082,"ns_err":1.1246257499980377,"bop":880.0007107394518},{"b":"MultiFocusCollectBench.eoModify_multiFocusTuple3","p":"-","ns":12.512208871782633,"ns_err":0.3845920485302991,"bop":128.00008800346612},{"b":"MultiFocusCollectBench.eoModify_multiFocusTuple6","p":"-","ns":20.84813981641992,"ns_err":0.48925986121751813,"bop":224.00014645520196},{"b":"MultiFocusCollectBench.naive_constSum","p":"-","ns":1.3278607423580564,"ns_err":0.038932408769983946,"bop":16.000009344821162},{"b":"MultiFocusCollectBench.naive_listSum","p":"-","ns":20.90216264458627,"ns_err":0.3482486269657374,"bop":56.000146887695124},{"b":"MultiFocusCollectBench.naive_tuple3Rewrite","p":"-","ns":7.443607146694827,"ns_err":0.13280157887949415,"bop":96.00005245063473},{"b":"MultiFocusCollectBench.naive_tuple6Rewrite","p":"-","ns":14.165544078612681,"ns_err":0.331284203338145,"bop":184.00009971951724},{"b":"MultiFocusCollectBench.naive_zipMeanBroadcast","p":"-","ns":160.5556667797205,"ns_err":9.197509847720337,"bop":1176.001129896133},{"b":"OpticBuildBench.build","p":"-","ns":38.06494419738432,"ns_err":1.1641253411419734,"bop":184.00031331079154},{"b":"OpticBuildBench.buildAndUse","p":"-","ns":696.4943413278053,"ns_err":47.126821772103256,"bop":2840.005600265484},{"b":"OpticBuildBench.reuseUse","p":"-","ns":627.0262187532179,"ns_err":17.674619171206,"bop":2696.0044088445215},{"b":"OptionalBench.eoModify_0","p":"-","ns":14.177763851327718,"ns_err":0.46275804874688176,"bop":112.00009970389421},{"b":"OptionalBench.eoModify_0_empty","p":"-","ns":0.8471638259204488,"ns_err":0.01184606492560406,"bop":5.909307437550152e-06},{"b":"OptionalBench.eoModify_3","p":"-","ns":34.46373390389613,"ns_err":1.198515278378546,"bop":160.00024196167897},{"b":"OptionalBench.eoModify_6","p":"-","ns":77.09244062258502,"ns_err":1.9699134598489316,"bop":208.0005409162937},{"b":"OptionalBench.eoModify_loyalty","p":"-","ns":12.642358759224518,"ns_err":0.8731084012629179,"bop":112.00008897120772},{"b":"OptionalBench.eoModify_loyalty_empty","p":"-","ns":0.8673360191629121,"ns_err":0.02674686785492477,"bop":6.059276966827493e-06},{"b":"OptionalBench.eoReplace_0","p":"-","ns":3.472966840511859,"ns_err":0.34591589909618287,"bop":40.00002438286386},{"b":"OptionalBench.eoReplace_loyalty","p":"-","ns":6.900484844978134,"ns_err":0.06007705644406388,"bop":88.00004862275516},{"b":"OptionalBench.mModify_0","p":"-","ns":14.179525326616309,"ns_err":0.5564774090943836,"bop":112.00009964252914},{"b":"OptionalBench.mModify_0_empty","p":"-","ns":1.0992441810673705,"ns_err":0.04997053117724403,"bop":7.683998718336925e-06},{"b":"OptionalBench.mModify_3","p":"-","ns":44.536283055042624,"ns_err":1.4415492601853384,"bop":304.000312468749},{"b":"OptionalBench.mModify_6","p":"-","ns":75.3483174871791,"ns_err":1.6298655161186604,"bop":496.0005294894158},{"b":"OptionalBench.mModify_loyalty","p":"-","ns":12.396400161287177,"ns_err":0.8362937657467696,"bop":112.0000871866953},{"b":"OptionalBench.mModify_loyalty_empty","p":"-","ns":1.1062203462493891,"ns_err":0.0390328913809773,"bop":7.72645738996173e-06},{"b":"OptionalBench.mReplace_0","p":"-","ns":3.3941323157033474,"ns_err":0.11308582778235639,"bop":40.000023916018435},{"b":"OptionalBench.mReplace_loyalty","p":"-","ns":6.883097515201151,"ns_err":0.15273413104931569,"bop":88.00004848377338},{"b":"OrderAvroBench.eoModifyNames","p":"size=512","ns":22685.42517296901,"ns_err":1193.593781099824,"bop":97421.42942521993},{"b":"OrderAvroBench.eoModifyNames","p":"size=64","ns":2756.0827056247244,"ns_err":95.56201121568408,"bop":12616.096215084424},{"b":"OrderAvroBench.eoModifyNames","p":"size=8","ns":381.57813548947644,"ns_err":18.91780604898303,"bop":2048.0040995816594},{"b":"OrderAvroBench.eoModifyStreet","p":"size=512","ns":79.9334862310104,"ns_err":1.482356976032489,"bop":328.0191300418366},{"b":"OrderAvroBench.eoModifyStreet","p":"size=64","ns":79.39625319255917,"ns_err":2.32542234616416,"bop":328.00277863654514},{"b":"OrderAvroBench.eoModifyStreet","p":"size=8","ns":81.56476374624532,"ns_err":3.7336599195469535,"bop":328.0008750420167},{"b":"OrderAvroBench.eoReadStreet","p":"size=512","ns":23.63087955806149,"ns_err":0.795455107764683,"bop":88.00565552427655},{"b":"OrderAvroBench.eoReadStreet","p":"size=64","ns":23.53934368085311,"ns_err":0.610368050667711,"bop":88.00082411873787},{"b":"OrderAvroBench.eoReadStreet","p":"size=8","ns":23.33074154575344,"ns_err":0.3046489685607081,"bop":88.00025058520629},{"b":"OrderAvroBench.monocleModifyNames","p":"size=512","ns":74146.69803029895,"ns_err":2185.2051437500168,"bop":382786.85374578554},{"b":"OrderAvroBench.monocleModifyNames","p":"size=64","ns":6755.228404694232,"ns_err":263.94752662161574,"bop":39840.22861430017},{"b":"OrderAvroBench.monocleModifyNames","p":"size=8","ns":1007.8576693304746,"ns_err":33.47497770643006,"bop":5400.010657888315},{"b":"OrderAvroBench.monocleModifyStreet","p":"size=512","ns":35020.74418696902,"ns_err":1424.2614130041482,"bop":169071.12966645797},{"b":"OrderAvroBench.monocleModifyStreet","p":"size=64","ns":4447.369284257106,"ns_err":117.05062452998273,"bop":20904.150458866374},{"b":"OrderAvroBench.monocleModifyStreet","p":"size=8","ns":605.5871065332965,"ns_err":26.902204411052402,"bop":2992.006401800526},{"b":"OrderAvroBench.monocleReadStreet","p":"size=512","ns":17410.56145124586,"ns_err":261.9935158332891,"bop":69780.1670599026},{"b":"OrderAvroBench.monocleReadStreet","p":"size=64","ns":2841.2118432116176,"ns_err":251.9409599401187,"bop":8848.099306703003},{"b":"OrderAvroBench.monocleReadStreet","p":"size=8","ns":403.0992549455414,"ns_err":75.12929184850346,"bop":1208.0043237220777},{"b":"OrderAvroBench.naiveModifyNames","p":"size=512","ns":43150.85365193488,"ns_err":366.77630767259825,"bop":226287.1261871694},{"b":"OrderAvroBench.naiveModifyNames","p":"size=64","ns":5464.461439758783,"ns_err":182.59192480168755,"bop":27936.18490256883},{"b":"OrderAvroBench.naiveModifyNames","p":"size=8","ns":712.1516877444091,"ns_err":25.50193540165106,"bop":3752.0075233162784},{"b":"OrderAvroBench.naiveModifyStreet","p":"size=512","ns":33568.44898039818,"ns_err":436.9493669623986,"bop":169047.28205282416},{"b":"OrderAvroBench.naiveModifyStreet","p":"size=64","ns":4396.716642551544,"ns_err":139.92847023845746,"bop":20880.148737755426},{"b":"OrderAvroBench.naiveModifyStreet","p":"size=8","ns":605.8866674925557,"ns_err":37.5801115428342,"bop":2968.0064020720015},{"b":"OrderAvroBench.naiveReadStreet","p":"size=512","ns":17507.40278834349,"ns_err":173.46239140918536,"bop":69780.19033608973},{"b":"OrderAvroBench.naiveReadStreet","p":"size=64","ns":3038.7442176134205,"ns_err":314.0742681794161,"bop":8848.106152404098},{"b":"OrderAvroBench.naiveReadStreet","p":"size=8","ns":295.4288428757452,"ns_err":12.040909681378562,"bop":1208.0031793759542},{"b":"OrderCirceBench.directNames","p":"size=512","ns":136137.29769987843,"ns_err":5706.7365018931005,"bop":613909.1346035803},{"b":"OrderCirceBench.directNames","p":"size=64","ns":16900.417128857152,"ns_err":271.83002791592446,"bop":77177.78072472679},{"b":"OrderCirceBench.directNames","p":"size=8","ns":2349.1429379707624,"ns_err":89.18982521526702,"bop":10688.051456746363},{"b":"OrderCirceBench.directStreet","p":"size=512","ns":635.4738400079633,"ns_err":18.907465263418008,"bop":2728.5015947091742},{"b":"OrderCirceBench.directStreet","p":"size=64","ns":652.871279696027,"ns_err":60.710224008146206,"bop":2736.067832837468},{"b":"OrderCirceBench.directStreet","p":"size=8","ns":653.1684351784971,"ns_err":37.3087224526771,"bop":2736.014175558185},{"b":"OrderCirceBench.eoNames","p":"size=512","ns":136508.6591432944,"ns_err":5885.69987909365,"bop":613949.4131315466},{"b":"OrderCirceBench.eoNames","p":"size=64","ns":17688.03340264149,"ns_err":813.7577735435866,"bop":78777.86379972768},{"b":"OrderCirceBench.eoNames","p":"size=8","ns":2436.864418868428,"ns_err":107.9490729150093,"bop":10944.053058919155},{"b":"OrderCirceBench.eoNamesIor","p":"size=512","ns":154436.94832242132,"ns_err":3554.692032169605,"bop":683467.780821011},{"b":"OrderCirceBench.eoNamesIor","p":"size=64","ns":19873.59893419836,"ns_err":531.2387172305154,"bop":87487.42755970437},{"b":"OrderCirceBench.eoNamesIor","p":"size=8","ns":2554.074995474574,"ns_err":77.10794389765115,"bop":11576.055591473352},{"b":"OrderCirceBench.eoStreet","p":"size=512","ns":659.7883416456682,"ns_err":50.46445323944896,"bop":2720.520785804226},{"b":"OrderCirceBench.eoStreet","p":"size=64","ns":659.6276083355201,"ns_err":52.218339834067095,"bop":2720.0685150153377},{"b":"OrderCirceBench.eoStreet","p":"size=8","ns":613.2948052161396,"ns_err":8.382213684008462,"bop":2720.013415564485},{"b":"OrderCirceBench.eoStreetIor","p":"size=512","ns":615.507240099026,"ns_err":16.65057096434994,"bop":2736.485842635636},{"b":"OrderCirceBench.eoStreetIor","p":"size=64","ns":623.8504949610958,"ns_err":13.822342963967488,"bop":2736.0648524342605},{"b":"OrderCirceBench.eoStreetIor","p":"size=8","ns":609.5858462926682,"ns_err":8.848132022639696,"bop":2736.013335859067},{"b":"OrderCirceBench.hcursorNames","p":"size=512","ns":135867.96728901786,"ns_err":3572.9139853631445,"bop":609804.8947989043},{"b":"OrderCirceBench.hcursorNames","p":"size=64","ns":17339.277444818268,"ns_err":651.39406697249,"bop":77257.82776974449},{"b":"OrderCirceBench.hcursorNames","p":"size=8","ns":2356.9742534644693,"ns_err":79.47794674630556,"bop":10696.052313332537},{"b":"OrderCirceBench.hcursorStreet","p":"size=512","ns":711.7013184531047,"ns_err":53.17276860577767,"bop":3032.5617758740404},{"b":"OrderCirceBench.hcursorStreet","p":"size=64","ns":691.7127055455259,"ns_err":22.828349974611132,"bop":3032.0719000528215},{"b":"OrderCirceBench.hcursorStreet","p":"size=8","ns":673.6922556718542,"ns_err":11.498440032106524,"bop":3032.0147613166578},{"b":"OrderCirceBench.monocleNames","p":"size=512","ns":189273.98890567909,"ns_err":2993.7679659757996,"bop":1121735.1738813657},{"b":"OrderCirceBench.monocleNames","p":"size=64","ns":18595.447668449233,"ns_err":535.2224106052863,"bop":132766.99707402015},{"b":"OrderCirceBench.monocleNames","p":"size=8","ns":3119.850724834089,"ns_err":56.72410607397926,"bop":19477.393140661818},{"b":"OrderCirceBench.monocleStreet","p":"size=512","ns":146025.19770017077,"ns_err":1402.9427285031506,"bop":908002.1282910063},{"b":"OrderCirceBench.monocleStreet","p":"size=64","ns":15821.433338792687,"ns_err":378.33411533900045,"bop":113809.41592086633},{"b":"OrderCirceBench.monocleStreet","p":"size=8","ns":2700.5056853230785,"ns_err":75.47389229822508,"bop":17053.385093679793},{"b":"OrderCirceBench.naiveNames","p":"size=512","ns":163938.0700053517,"ns_err":7360.959718255185,"bop":965246.1643062009},{"b":"OrderCirceBench.naiveNames","p":"size=64","ns":16912.12441880703,"ns_err":305.8396573735099,"bop":120825.51270288476},{"b":"OrderCirceBench.naiveNames","p":"size=8","ns":2810.1005727712636,"ns_err":59.89285801838023,"bop":17808.05394030635},{"b":"OrderCirceBench.naiveStreet","p":"size=512","ns":149523.75444608854,"ns_err":2282.8443998288717,"bop":908009.8127091707},{"b":"OrderCirceBench.naiveStreet","p":"size=64","ns":16091.243577305015,"ns_err":453.9261328242431,"bop":113801.43984786114},{"b":"OrderCirceBench.naiveStreet","p":"size=8","ns":2727.5990953070373,"ns_err":63.95666297356571,"bop":17040.05225233535},{"b":"OrderJsoniterBench.eoModifyStreet","p":"size=512","ns":5497.161793367551,"ns_err":83.64953238807145,"bop":42028.941079595235},{"b":"OrderJsoniterBench.eoModifyStreet","p":"size=64","ns":830.6824595449875,"ns_err":16.257109061313802,"bop":5432.096335510993},{"b":"OrderJsoniterBench.eoModifyStreet","p":"size=8","ns":213.82557586294013,"ns_err":11.089960779596142,"bop":1080.0049227272393},{"b":"OrderJsoniterBench.eoReadStreet","p":"size=512","ns":129.99896663560122,"ns_err":5.559645267022624,"bop":109.45028097821411},{"b":"OrderJsoniterBench.eoReadStreet","p":"size=64","ns":128.89438639171823,"ns_err":4.378107389097411,"bop":109.34830090300669},{"b":"OrderJsoniterBench.eoReadStreet","p":"size=8","ns":125.87742887889921,"ns_err":2.30912276909913,"bop":90.66956498415377},{"b":"OrderJsoniterBench.eoSumPrices","p":"size=512","ns":59361.464277168394,"ns_err":1761.6569964961518,"bop":63711.8789427889},{"b":"OrderJsoniterBench.eoSumPrices","p":"size=64","ns":7662.413079632455,"ns_err":375.2227096724838,"bop":8120.886285495659},{"b":"OrderJsoniterBench.eoSumPrices","p":"size=8","ns":998.107525674284,"ns_err":32.70295669210989,"bop":1176.0229870109722},{"b":"OrderJsoniterBench.monocleModifyStreet","p":"size=512","ns":106445.44431584673,"ns_err":4506.550913390244,"bop":333473.64177505235},{"b":"OrderJsoniterBench.monocleModifyStreet","p":"size=64","ns":12360.37304167289,"ns_err":434.68350158095285,"bop":30081.24509579381},{"b":"OrderJsoniterBench.monocleModifyStreet","p":"size=8","ns":1988.863228752651,"ns_err":33.39653155841127,"bop":4664.041982634104},{"b":"OrderJsoniterBench.monocleReadStreet","p":"size=512","ns":55727.5219312718,"ns_err":2747.3955273586967,"bop":193199.7089502715},{"b":"OrderJsoniterBench.monocleReadStreet","p":"size=64","ns":6845.953578067273,"ns_err":225.32937033436878,"bop":24704.700261861333},{"b":"OrderJsoniterBench.monocleReadStreet","p":"size=8","ns":1106.9254737960116,"ns_err":22.493826578244427,"bop":3648.023573997151},{"b":"OrderJsoniterBench.monocleSumPrices","p":"size=512","ns":302491.18152958783,"ns_err":18291.478367481628,"bop":1178338.8995676476},{"b":"OrderJsoniterBench.monocleSumPrices","p":"size=64","ns":10097.38206318961,"ns_err":333.591218676442,"bop":45841.032966774525},{"b":"OrderJsoniterBench.monocleSumPrices","p":"size=8","ns":1620.9035876197236,"ns_err":59.82131801688485,"bop":6445.367828894823},{"b":"OrderJsoniterBench.naiveModifyStreet","p":"size=512","ns":107342.74242802129,"ns_err":4232.602668414913,"bop":333466.31725139305},{"b":"OrderJsoniterBench.naiveModifyStreet","p":"size=64","ns":12129.878426061461,"ns_err":323.76384402094726,"bop":30057.221772693305},{"b":"OrderJsoniterBench.naiveModifyStreet","p":"size=8","ns":2015.1083214847515,"ns_err":53.039523947142925,"bop":4640.04254466129},{"b":"OrderJsoniterBench.naiveReadStreet","p":"size=512","ns":55926.84170761096,"ns_err":2328.3723258953783,"bop":193199.87242726388},{"b":"OrderJsoniterBench.naiveReadStreet","p":"size=64","ns":7037.722062484407,"ns_err":358.9609405348171,"bop":24704.72001604613},{"b":"OrderJsoniterBench.naiveReadStreet","p":"size=8","ns":1131.6502278258797,"ns_err":50.45948524447567,"bop":3648.024104946661},{"b":"OrderJsoniterBench.naiveSumPrices","p":"size=512","ns":58612.23381277546,"ns_err":1852.9263614156546,"bop":230090.21194184697},{"b":"OrderJsoniterBench.naiveSumPrices","p":"size=64","ns":7395.956772366981,"ns_err":175.90795071502757,"bop":29336.756489156935},{"b":"OrderJsoniterBench.naiveSumPrices","p":"size=8","ns":1164.6020987617192,"ns_err":19.53977467259037,"bop":4248.0247882283575},{"b":"OrderJsoniterBench.nativeReadStreet","p":"size=512","ns":25173.2892938806,"ns_err":782.5361493680743,"bop":445.0471189515421},{"b":"OrderJsoniterBench.nativeReadStreet","p":"size=64","ns":3200.0971374060396,"ns_err":116.75958536213123,"bop":424.3451149560281},{"b":"OrderJsoniterBench.nativeReadStreet","p":"size=8","ns":569.7406284943528,"ns_err":14.816149805707225,"bop":424.012321475337},{"b":"OrderJsoniterBench.nativeSumPrices","p":"size=512","ns":43656.29764093118,"ns_err":2037.9714980717254,"bop":86268.10297442073},{"b":"OrderJsoniterBench.nativeSumPrices","p":"size=64","ns":5282.615093250046,"ns_err":229.6364977509952,"bop":10920.570965645935},{"b":"OrderJsoniterBench.nativeSumPrices","p":"size=8","ns":748.895056762947,"ns_err":32.952479890201936,"bop":1512.016233037691},{"b":"PlatedBench.eoTransformDeep","p":"n=4096","ns":113326.86329751558,"ns_err":2754.6142796706904,"bop":624378.4831253196},{"b":"PlatedBench.eoTransformDeep","p":"n=512","ns":10667.51334600209,"ns_err":288.77278870825256,"bop":57361.08922839556},{"b":"PlatedBench.eoTransformDeep","p":"n=64","ns":1196.8028769454488,"ns_err":27.05573248529966,"bop":7184.023876857154},{"b":"PlatedBench.eoTransformExpr","p":"n=4096","ns":108826.06734007079,"ns_err":7367.475199360674,"bop":655343.2095323768},{"b":"PlatedBench.eoTransformExpr","p":"n=512","ns":13313.634240039855,"ns_err":265.03953857433754,"bop":81825.36710313718},{"b":"PlatedBench.eoTransformExpr","p":"n=64","ns":1701.4444991619825,"ns_err":23.088711728647947,"bop":10144.03352473673},{"b":"PlatedBench.eoUniverseDeep","p":"n=4096","ns":145025.35454452582,"ns_err":3131.27810191204,"bop":786609.5533544781},{"b":"PlatedBench.eoUniverseDeep","p":"n=512","ns":14161.139897525658,"ns_err":537.3539521434523,"bop":98377.44685237459},{"b":"PlatedBench.eoUniverseDeep","p":"n=64","ns":1580.6287568528717,"ns_err":56.949201100587615,"bop":12360.030645458655},{"b":"PlatedBench.eoUniverseExpr","p":"n=4096","ns":145392.69866734184,"ns_err":3046.3702934345324,"bop":786417.8226061481},{"b":"PlatedBench.eoUniverseExpr","p":"n=512","ns":14006.630015951481,"ns_err":308.20765402234736,"bop":98185.43798016824},{"b":"PlatedBench.eoUniverseExpr","p":"n=64","ns":1597.6432290615653,"ns_err":81.03345128586669,"bop":12168.031056379632},{"b":"PlatedBench.eoUniverseJson","p":"n=4096","ns":200009.62155790636,"ns_err":6961.683815445055,"bop":786457.5638885382},{"b":"PlatedBench.eoUniverseJson","p":"n=512","ns":20510.454078897736,"ns_err":519.2104785573895,"bop":98186.10600482395},{"b":"PlatedBench.eoUniverseJson","p":"n=64","ns":2520.932908563539,"ns_err":107.5513547362464,"bop":12168.049025981754},{"b":"PlatedBench.mTransformExpr","p":"n=4096","ns":114486.64247984774,"ns_err":3342.9019291195173,"bop":753699.3311247504},{"b":"PlatedBench.mTransformExpr","p":"n=512","ns":10687.409059027419,"ns_err":179.05110022205554,"bop":69585.09146956455},{"b":"PlatedBench.mTransformExpr","p":"n=64","ns":1875.5510519649624,"ns_err":89.00247964771555,"bop":11728.036320352714},{"b":"PlatedBench.mUniverseExpr","p":"n=4096","ns":3858618.694672252,"ns_err":208770.9635493467,"bop":4688483.203125511},{"b":"PlatedBench.mUniverseExpr","p":"n=512","ns":256141.0113601419,"ns_err":7774.925771980915,"bop":475018.1638828731},{"b":"PlatedBench.mUniverseExpr","p":"n=64","ns":22972.415347527687,"ns_err":527.2094092252885,"bop":45424.44621832085},{"b":"PlatedBench.mUniverseJson","p":"n=4096","ns":4183490.9687565393,"ns_err":222157.68001240888,"bop":6490581.532516218},{"b":"PlatedBench.mUniverseJson","p":"n=512","ns":298099.65506466606,"ns_err":10105.468502788433,"bop":699926.4488199939},{"b":"PlatedBench.mUniverseJson","p":"n=64","ns":26607.1681225128,"ns_err":691.3490450589223,"bop":73208.51917630428},{"b":"PlatedBench.visitorTransformDeep","p":"n=4096","ns":28478.57934799382,"ns_err":730.9242339432931,"bop":163876.72945633193},{"b":"PlatedBench.visitorTransformDeep","p":"n=512","ns":3335.768019515214,"ns_err":85.9237455181272,"bop":20496.342334300552},{"b":"PlatedBench.visitorTransformDeep","p":"n=64","ns":388.62671017285595,"ns_err":11.703003542962861,"bop":2576.0075320980523},{"b":"PlatedBench.visitorTransformExpr","p":"n=4096","ns":53102.54536143544,"ns_err":716.4680155275288,"bop":360462.6529653266},{"b":"PlatedBench.visitorTransformExpr","p":"n=512","ns":5965.491240719854,"ns_err":159.6143212188898,"bop":45032.609341554766},{"b":"PlatedBench.visitorTransformExpr","p":"n=64","ns":809.7262671231695,"ns_err":21.02576275038854,"bop":5608.015683687886},{"b":"PlatedBench.visitorUniverseDeep","p":"n=4096","ns":48077.12195380631,"ns_err":783.59878410929,"bop":196698.99514605384},{"b":"PlatedBench.visitorUniverseDeep","p":"n=512","ns":5400.2076042256285,"ns_err":111.46078442487011,"bop":24632.55442614816},{"b":"PlatedBench.visitorUniverseDeep","p":"n=64","ns":607.2512442307382,"ns_err":20.884834466058468,"bop":3128.011783731878},{"b":"PlatedBench.visitorUniverseExpr","p":"n=4096","ns":52303.395956813154,"ns_err":1145.9447675055546,"bop":196654.07089227327},{"b":"PlatedBench.visitorUniverseExpr","p":"n=512","ns":6284.338610883802,"ns_err":162.10322793327845,"bop":24584.644885061905},{"b":"PlatedBench.visitorUniverseExpr","p":"n=64","ns":605.0746401531567,"ns_err":10.727389328787737,"bop":3080.0117429675056},{"b":"PlatedBench.visitorUniverseJson","p":"n=4096","ns":119428.02838450644,"ns_err":36166.3189021144,"bop":374558.92618920346},{"b":"PlatedBench.visitorUniverseJson","p":"n=512","ns":21600.73205383396,"ns_err":500.1548966225451,"bop":40954.205327765034},{"b":"PlatedBench.visitorUniverseJson","p":"n=64","ns":1725.3274272049864,"ns_err":54.377733404348184,"bop":4424.033408389246},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=1024","ns":9886.903553545058,"ns_err":200.8207593432894,"bop":41412.68405968187},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=16","ns":171.7775964671853,"ns_err":9.4046767952636,"bop":1088.0024340069237},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=256","ns":2661.291340746434,"ns_err":138.54407287092545,"bop":10688.426246995736},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=4","ns":76.91557518453008,"ns_err":2.1561080850438925,"bop":608.0007369715563},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=4096","ns":41538.48808031622,"ns_err":1898.2823593009011,"bop":164355.9534734016},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=64","ns":551.5574548341689,"ns_err":11.847385021190332,"bop":3008.0183776256613},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=1024","ns":49643.00936264896,"ns_err":838.4067978196697,"bop":279425.67004389176},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=16","ns":504.52263915929217,"ns_err":10.362149965684006,"bop":3720.0070386780294},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=256","ns":16763.25671444325,"ns_err":388.5842151605266,"bop":107338.58407992678},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=4","ns":130.94711055792172,"ns_err":4.9581765781747285,"bop":1176.00127233528},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=4096","ns":194302.59781929184,"ns_err":4965.909791738475,"bop":967868.3930469467},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=64","ns":2150.615728811223,"ns_err":37.77253373144294,"bop":14520.068148981156},{"b":"PowerSeriesBench.naive_powerEach","p":"size=1024","ns":5159.86136966966,"ns_err":108.27646525660346,"bop":28730.445365277334},{"b":"PowerSeriesBench.naive_powerEach","p":"size=16","ns":71.41390115079761,"ns_err":1.1280016037861167,"bop":504.0010281525158},{"b":"PowerSeriesBench.naive_powerEach","p":"size=256","ns":1262.781644957125,"ns_err":16.611723973868855,"bop":7224.202512821224},{"b":"PowerSeriesBench.naive_powerEach","p":"size=4","ns":19.49974781725556,"ns_err":0.6666768252991331,"bop":168.00019193022098},{"b":"PowerSeriesBench.naive_powerEach","p":"size=4096","ns":23758.904852823678,"ns_err":760.9067137969253,"bop":114783.00598419734},{"b":"PowerSeriesBench.naive_powerEach","p":"size=64","ns":336.2020993895988,"ns_err":4.844904439815341,"bop":1848.0111771903341},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=1024","ns":49951.57583719673,"ns_err":1641.57943919226,"bop":210533.60779359489},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=16","ns":970.3782410121499,"ns_err":27.24990506902386,"bop":4744.03603373497},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=256","ns":14139.472708125444,"ns_err":281.2055642443981,"bop":53696.9095024115},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=4","ns":441.6230087400239,"ns_err":12.443069096475368,"bop":2264.0080654173335},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=64","ns":3800.520522102501,"ns_err":170.28080641691557,"bop":14616.435974943939},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=1024","ns":221339.49958108107,"ns_err":6741.545744011926,"bop":1118802.9400819284},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=16","ns":2462.493681961436,"ns_err":111.28111402068062,"bop":15776.088656198875},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=256","ns":71544.36667006364,"ns_err":1584.1187095168932,"bop":430203.3018589328},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=4","ns":908.218681306709,"ns_err":24.21978964088619,"bop":5536.016584164488},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=64","ns":8092.029612704589,"ns_err":268.3124683843752,"bop":58859.548140108796},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=1024","ns":19826.424165189146,"ns_err":650.6467205021083,"bop":115068.10425595104},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=16","ns":309.9058288265854,"ns_err":11.473710328491352,"bop":2136.0116962454667},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=256","ns":4900.489857879714,"ns_err":120.25511038489114,"bop":29019.10002615233},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=4","ns":95.00717270722949,"ns_err":3.2509239123476514,"bop":792.0017912839041},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=64","ns":1230.1260369871302,"ns_err":26.064451927726466,"bop":7512.141847565977},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=128","ns":1238.6818417823054,"ns_err":95.16764864406643,"bop":4816.0717428933585},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=2048","ns":19756.048617149234,"ns_err":405.9359431955765,"bop":104687.91655085103},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=32","ns":298.23143545663737,"ns_err":7.425590687683493,"bop":1360.0059527618116},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=512","ns":5004.917329425053,"ns_err":104.02124708499737,"bop":24785.373690863133},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=8","ns":87.75327435612537,"ns_err":2.510869442060576,"bop":496.00094316656913},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=128","ns":3997.0538902857106,"ns_err":136.14378978207816,"bop":27808.200828411635},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=2048","ns":97801.61816865187,"ns_err":8555.552523427452,"bop":523143.68051827507},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=32","ns":1131.4045584222467,"ns_err":27.346793441005822,"bop":7024.020760816641},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=512","ns":27484.73595112586,"ns_err":720.6382913353785,"bop":166680.5219645309},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=8","ns":294.5263924355277,"ns_err":20.724907819926745,"bop":1952.0030867104313},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=128","ns":323.5740122089893,"ns_err":9.726779452354355,"bop":1568.019698540001},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=2048","ns":3810.4282829574618,"ns_err":94.07324951200931,"bop":24611.22403102026},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=32","ns":82.70900742259704,"ns_err":1.6289262015692854,"bop":416.0017341554394},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=512","ns":1163.6598036248572,"ns_err":41.86627913619592,"bop":6176.333854196705},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=8","ns":17.014284848528423,"ns_err":0.38059239759239166,"bop":128.00018979174232},{"b":"PrismBench.eoGetOptionAbsent","p":"-","ns":0.5990317799825728,"ns_err":0.013828198443928222,"bop":4.183616493533332e-06},{"b":"PrismBench.eoGetOptionPresent","p":"-","ns":0.5965243495678137,"ns_err":0.018773629210606508,"bop":4.1684355597946165e-06},{"b":"PrismBench.eoGetRightAbsent","p":"-","ns":0.6668732821868926,"ns_err":0.016652713196594664,"bop":4.658848126361513e-06},{"b":"PrismBench.eoGetRightPresent","p":"-","ns":2.116511557149468,"ns_err":0.07282820625087581,"bop":16.000014891278024},{"b":"PrismBench.eoReverseGet","p":"-","ns":2.339798390765709,"ns_err":0.056856317040022725,"bop":16.000016436899397},{"b":"PrismBench.eoRightReverseGet","p":"-","ns":2.3130606728800753,"ns_err":0.1105411556740808,"bop":16.000016262306513},{"b":"PrismBench.mGetOptionAbsent","p":"-","ns":0.6650775771375484,"ns_err":0.01431419330661165,"bop":4.643459257942742e-06},{"b":"PrismBench.mGetOptionPresent","p":"-","ns":0.6614875730583842,"ns_err":0.014359301011158879,"bop":4.618382820362227e-06},{"b":"PrismBench.mGetRightAbsent","p":"-","ns":0.7443308494500825,"ns_err":0.016182883571905254,"bop":5.199834189184758e-06},{"b":"PrismBench.mGetRightPresent","p":"-","ns":2.1812816336100367,"ns_err":0.050725982978448624,"bop":16.00001534390213},{"b":"PrismBench.mReverseGet","p":"-","ns":2.2704879780769978,"ns_err":0.12214012511258664,"bop":16.000015984252123},{"b":"PrismBench.mRightReverseGet","p":"-","ns":2.264515024179781,"ns_err":0.06405739300519907,"bop":16.000015912281675},{"b":"ReviewBench.eoReverseGet_0","p":"-","ns":2.147342255795131,"ns_err":0.05435828078045455,"bop":24.000015135766276},{"b":"ReviewBench.eoReverseGet_3","p":"-","ns":19.352204448779617,"ns_err":0.3856150161836157,"bop":72.00013593868646},{"b":"ReviewBench.eoReverseGet_6","p":"-","ns":32.27713312292395,"ns_err":0.5252494201052833,"bop":120.00022674873716},{"b":"ReviewBench.naiveBuild_0","p":"-","ns":2.0316744482015494,"ns_err":0.04206883169839931,"bop":24.000014307235162},{"b":"ReviewBench.naiveBuild_3","p":"-","ns":5.975845527426267,"ns_err":0.054880127179077025,"bop":72.00004209479044},{"b":"ReviewBench.naiveBuild_6","p":"-","ns":9.755879468580417,"ns_err":0.18695122786751686,"bop":120.00006861692427},{"b":"SchemesBench.drosteAna","p":"-","ns":47082.23078247081,"ns_err":3478.9416130894665,"bop":327632.3328259582},{"b":"SchemesBench.drosteCata","p":"-","ns":41900.65059962542,"ns_err":1702.6676708304203,"bop":164824.2965036812},{"b":"SchemesBench.drosteHylo","p":"-","ns":49002.283762023304,"ns_err":3275.7522880524593,"bop":328640.346755968},{"b":"SchemesBench.eoAna","p":"-","ns":83808.19733699574,"ns_err":2296.997792022209,"bop":589712.5950470959},{"b":"SchemesBench.eoCata","p":"-","ns":66151.1201234879,"ns_err":1339.6719505969472,"bop":197568.47004189403},{"b":"SchemesBench.eoHylo","p":"-","ns":69268.71807489463,"ns_err":6246.761637454342,"bop":295848.4915036655},{"b":"SchemesBench.handAna","p":"-","ns":29080.79508204234,"ns_err":1333.5681012828836,"bop":163816.20567312874},{"b":"SchemesBench.handCata","p":"-","ns":9223.95689095937,"ns_err":178.3636244263236,"bop":0.06443968419368469},{"b":"SchemesBench.handHylo","p":"-","ns":6835.246639893958,"ns_err":179.9928620130268,"bop":0.04780938508120948},{"b":"SetterBench.eoModify_0","p":"-","ns":2.3143308948143195,"ns_err":0.22425567729252757,"bop":24.00001629095201},{"b":"SetterBench.eoModify_3","p":"-","ns":8.631480239942672,"ns_err":0.21165115049432112,"bop":72.00006070838798},{"b":"SetterBench.eoModify_6","p":"-","ns":17.894684143710215,"ns_err":0.7162656912977052,"bop":120.00012595592742},{"b":"SetterBench.eoModify_orderId","p":"-","ns":3.0314582877935465,"ns_err":0.1803371875211043,"bop":40.00002132682657},{"b":"SetterBench.mModify_0","p":"-","ns":2.2042977933435943,"ns_err":0.03961588387340353,"bop":24.00001552193056},{"b":"SetterBench.mModify_3","p":"-","ns":21.725456867499915,"ns_err":1.0093401931411752,"bop":168.00015275984342},{"b":"SetterBench.mModify_6","p":"-","ns":41.492195693924835,"ns_err":1.4344172412782104,"bop":288.0002916555772},{"b":"SetterBench.mModify_orderId","p":"-","ns":3.052759712257742,"ns_err":0.38342499558325627,"bop":40.00002148648546},{"b":"TraversalBench.eoFoldNested","p":"size=512","ns":4042.4562722190103,"ns_err":67.78414866646744,"bop":20200.641788115434},{"b":"TraversalBench.eoFoldNested","p":"size=64","ns":464.955145720755,"ns_err":7.885190573648702,"bop":2680.0118149793516},{"b":"TraversalBench.eoFoldNested","p":"size=8","ns":40.476034094501564,"ns_err":6.099589818354245,"bop":360.00038455868105},{"b":"TraversalBench.eoFoldPrices","p":"size=512","ns":1699.8754261384736,"ns_err":21.884716719539778,"bop":12312.269906781505},{"b":"TraversalBench.eoFoldPrices","p":"size=64","ns":149.76087889928073,"ns_err":1.613439685182996,"bop":1560.0038061412074},{"b":"TraversalBench.eoFoldPrices","p":"size=8","ns":18.534473243160086,"ns_err":0.3611843258617739,"bop":216.0001762757711},{"b":"TraversalBench.eoModify","p":"size=512","ns":6353.545940489272,"ns_err":104.66446245851506,"bop":36897.010046018106},{"b":"TraversalBench.eoModify","p":"size=64","ns":723.0483416654315,"ns_err":17.490868912341988,"bop":4640.0183686072705},{"b":"TraversalBench.eoModify","p":"size=8","ns":77.72776294383517,"ns_err":2.644721832847091,"bop":608.0007389851457},{"b":"TraversalBench.mFoldPrices","p":"size=512","ns":24631.93702932583,"ns_err":313.4672993406105,"bop":162563.91098844743},{"b":"TraversalBench.mFoldPrices","p":"size=64","ns":2183.9705954577707,"ns_err":16.824044918681626,"bop":15408.05551066715},{"b":"TraversalBench.mFoldPrices","p":"size=8","ns":265.50382249610965,"ns_err":9.397932481647583,"bop":2000.002525392794},{"b":"TraversalBench.mModify","p":"size=512","ns":28880.667396213874,"ns_err":400.6338580138734,"bop":176887.0124841099},{"b":"TraversalBench.mModify","p":"size=64","ns":2024.9836409791612,"ns_err":37.87691072590304,"bop":14408.051472866979},{"b":"TraversalBench.mModify","p":"size=8","ns":240.9473801694091,"ns_err":8.794758401976228,"bop":1896.002291338889},{"b":"ZioDiBench.eoDrillGet","p":"-","ns":6.549018251339132,"ns_err":0.15352485619095763,"bop":4.579286240850702e-05},{"b":"ZioDiBench.eoDrillModify","p":"-","ns":76.63819333576193,"ns_err":4.76199921853922,"bop":472.0005395392225},{"b":"ZioDiBench.eoServiceGet","p":"-","ns":3.5316380630719366,"ns_err":0.06398450507300103,"bop":2.4679959462106775e-05},{"b":"ZioDiBench.eoServiceReplace","p":"-","ns":68.83396418403314,"ns_err":0.3649794939738565,"bop":400.00048443809123},{"b":"ZioDiBench.handDrillGet","p":"-","ns":10.70144043373347,"ns_err":0.23996595741612767,"bop":120.00007529280191},{"b":"ZioDiBench.handDrillModify","p":"-","ns":92.52960708549334,"ns_err":0.6355911087557794,"bop":592.000651193266},{"b":"ZioDiBench.handServiceGet","p":"-","ns":10.304575385742229,"ns_err":0.2539283250480368,"bop":120.00007245153968},{"b":"ZioDiBench.handServiceReplace","p":"-","ns":85.02086094462457,"ns_err":5.25560063687429,"bop":520.0005983552344}]} +{"source_sha":"462e037b7df74c393ecb5ad4a2d0b8b7d2b4bf96","date":"2026-10-03","jdk":"temurin-21","runner":"ubuntu-22.04","jmh_params":"-i 5 -wi 3 -f 3 -t 1 -foe true -prof gc -rf json -jvmArgsAppend -XX:-ResizeTLAB -jvmArgsAppend -Xms1g -jvmArgsAppend -Xmx1g","profile":"sweep:-i5-wi3-f3-t1-gc-rt1g","results":[{"b":"AffineFoldBench.eoGetOption_0","p":"-","ns":0.8132662169842294,"ns_err":0.008494667793129242,"bop":5.682762573914563e-06},{"b":"AffineFoldBench.eoGetOption_0_asAffineFold","p":"-","ns":0.6995692404785633,"ns_err":0.05024467682465422,"bop":4.88366026233335e-06},{"b":"AffineFoldBench.eoGetOption_0_asOptional","p":"-","ns":2.477893794052311,"ns_err":0.01574238373111811,"bop":16.000017406831525},{"b":"AffineFoldBench.eoGetOption_0_empty","p":"-","ns":0.7731419494554793,"ns_err":0.051404144493887444,"bop":5.40746292287013e-06},{"b":"AffineFoldBench.eoGetOption_3","p":"-","ns":9.208711375720863,"ns_err":0.05592344031731883,"bop":16.000064740588204},{"b":"AffineFoldBench.eoGetOption_6","p":"-","ns":18.660184078930108,"ns_err":0.09454255256270733,"bop":16.000131403023513},{"b":"AffineFoldBench.eoGetOption_loyalty","p":"-","ns":0.7859296028743293,"ns_err":0.005148529456071295,"bop":5.490156390942932e-06},{"b":"AffineFoldBench.eoGetOption_loyalty_empty","p":"-","ns":0.7943154066265018,"ns_err":0.0074579634240906625,"bop":5.5522636623280735e-06},{"b":"AffineFoldBench.mGetOption_0","p":"-","ns":0.6841184327271596,"ns_err":0.010000142053870764,"bop":4.774888106253086e-06},{"b":"AffineFoldBench.mGetOption_0_empty","p":"-","ns":0.6775658499067383,"ns_err":0.011804261718931135,"bop":4.7350565987328e-06},{"b":"AffineFoldBench.mGetOption_3","p":"-","ns":6.204606160971813,"ns_err":0.061835107791631386,"bop":4.3368453929027235e-05},{"b":"AffineFoldBench.mGetOption_6","p":"-","ns":16.32572729777316,"ns_err":0.41131198858447715,"bop":0.00011404964009741124},{"b":"AffineFoldBench.mGetOption_loyalty","p":"-","ns":0.7857403544436689,"ns_err":0.006146668878073095,"bop":5.487295974201764e-06},{"b":"AffineFoldBench.mGetOption_loyalty_empty","p":"-","ns":0.784800969106662,"ns_err":0.006889050390799394,"bop":5.490867181552481e-06},{"b":"AvroBytesBench.eoGraftPayload","p":"-","ns":110.11111447169988,"ns_err":0.2246528111451977,"bop":720.0020517918085},{"b":"AvroBytesBench.eoModifyCountry","p":"-","ns":236.903026505369,"ns_err":4.916431085373885,"bop":928.0042612807476},{"b":"AvroBytesBench.eoModifyPartner","p":"-","ns":278.19410193059906,"ns_err":1.3459945731205798,"bop":984.0049829600824},{"b":"AvroBytesBench.eoReadCountry","p":"-","ns":133.55508265539837,"ns_err":2.611971618200567,"bop":520.0022731471234},{"b":"AvroBytesBench.eoReadPartner","p":"-","ns":144.89345630489098,"ns_err":1.6332302577705498,"bop":480.00246445570605},{"b":"AvroBytesBench.eoSliceGraftPayload","p":"-","ns":211.92409916612198,"ns_err":2.1742098708030326,"bop":1192.003892683592},{"b":"AvroBytesBench.naiveModifyCountry","p":"-","ns":2131.4085484922534,"ns_err":20.563331544181654,"bop":7616.035699667899},{"b":"AvroBytesBench.naiveModifyPartner","p":"-","ns":2513.8813627580957,"ns_err":49.05373670751524,"bop":8696.04211808139},{"b":"AvroBytesBench.naivePassthroughPayload","p":"-","ns":4091.175482319299,"ns_err":30.894440640950037,"bop":14088.068542385527},{"b":"AvroBytesBench.naiveReadCountry","p":"-","ns":1278.558565478393,"ns_err":11.636388425088837,"bop":4256.021739753169},{"b":"AvroBytesBench.naiveReadPartner","p":"-","ns":1638.2801683400112,"ns_err":45.12361257192958,"bop":5424.027867255948},{"b":"AvroBytesBench.prunedReadCountry","p":"-","ns":772.334970420759,"ns_err":12.616741359428417,"bop":1976.013138297067},{"b":"AvroBytesBench.prunedReadPartner","p":"-","ns":538.1765627827099,"ns_err":5.411096481909644,"bop":1592.00915094081},{"b":"AvroDecodeReuseBench.cachedDecodeRecord","p":"-","ns":273.955407815618,"ns_err":1.3545790799670467,"bop":1224.002930979548},{"b":"AvroDecodeReuseBench.confluentRecordReader","p":"-","ns":311.9988829681867,"ns_err":5.610856487249602,"bop":1541.3366735085253},{"b":"AvroDecodeReuseBench.confluentRecordReaderFresh","p":"-","ns":1161.3048199194316,"ns_err":21.65640858497599,"bop":3696.012419881207},{"b":"AvroDecodeReuseBench.freshDecodeRecord","p":"-","ns":1090.6828114674697,"ns_err":11.8632573959393,"bop":3344.011666297771},{"b":"AvroEncodeRouteBench.eo_encodeToAny","p":"-","ns":48.411271599001154,"ns_err":0.5088121950252162,"bop":312.0003403953919},{"b":"AvroEncodeRouteBench.eo_encodeValue","p":"-","ns":448.63162188252767,"ns_err":11.597320614416471,"bop":568.0031563706393},{"b":"AvroEncodeRouteBench.handwritten_stream","p":"-","ns":143.57403566073788,"ns_err":6.836083151032024,"bop":240.00100945902386},{"b":"AvroEncodeRouteBench.naive_freshPlumbing","p":"-","ns":704.5118408613251,"ns_err":7.1861386164723,"bop":2624.0049551467464},{"b":"AvroJsonBridgeBench.eoClickToAvro","p":"-","ns":2276.7552125319403,"ns_err":14.447329088302421,"bop":4674.683830519442},{"b":"AvroJsonBridgeBench.eoClickToJson","p":"-","ns":2138.0518268282954,"ns_err":28.847452435255462,"bop":3962.681711331624},{"b":"AvroJsonBridgeBench.eoWideToAvro","p":"-","ns":650.6663508218414,"ns_err":7.40069216880996,"bop":2024.0050835123882},{"b":"AvroJsonBridgeBench.eoWideToJson","p":"-","ns":472.30675467111087,"ns_err":13.028700029996163,"bop":1472.0033280080825},{"b":"AvroJsonBridgeBench.naiveClickToAvro","p":"-","ns":1314.3619382761292,"ns_err":20.94697959183955,"bop":3928.009244557798},{"b":"AvroJsonBridgeBench.naiveClickToJson","p":"-","ns":2322.8852158452623,"ns_err":27.83053223086735,"bop":5856.016345050114},{"b":"AvroJsonBridgeBench.naiveWideToAvro","p":"-","ns":963.2118991343856,"ns_err":10.141066014144629,"bop":3504.006776783559},{"b":"AvroJsonBridgeBench.naiveWideToJson","p":"-","ns":1427.3530126701776,"ns_err":10.450403325234113,"bop":4376.010036258545},{"b":"AvroVulcanBench.decode_bridged","p":"-","ns":141.52377420438881,"ns_err":0.8471753854471575,"bop":832.0009948601412},{"b":"AvroVulcanBench.decode_native","p":"-","ns":11.289096812535272,"ns_err":0.033494569199885346,"bop":48.00007935327536},{"b":"AvroVulcanBench.decode_vulcanRaw","p":"-","ns":139.24460564833277,"ns_err":0.5022232196923885,"bop":832.0009793835358},{"b":"AvroVulcanBench.encode_bridged","p":"-","ns":182.22258991534466,"ns_err":1.1966747424700142,"bop":1224.0012830651167},{"b":"AvroVulcanBench.encode_native","p":"-","ns":9.975145273694856,"ns_err":0.2791662180366138,"bop":56.00007010896818},{"b":"AvroVulcanBench.encode_vulcanRaw","p":"-","ns":183.13638340292735,"ns_err":2.243201695111591,"bop":1224.001288847394},{"b":"AvroVulcanBench.fieldGet_bridged","p":"-","ns":77.14834503371813,"ns_err":1.7892309262919712,"bop":432.00054261406297},{"b":"AvroVulcanBench.fieldGet_native","p":"-","ns":78.00517690447016,"ns_err":2.0586404732435657,"bop":432.00054895453377},{"b":"AvroVulcanBench.rootGet_bridged","p":"-","ns":274.34658100814994,"ns_err":5.722695341710595,"bop":1424.0019313283278},{"b":"AvroVulcanBench.rootGet_native","p":"-","ns":119.79214625937996,"ns_err":1.9256013292214922,"bop":600.0008433425719},{"b":"CapsBench.foldMapCap","p":"-","ns":16.582467366584403,"ns_err":0.08111730956525166,"bop":0.00011587641246693193},{"b":"CapsBench.foldMapDerivedHeld","p":"-","ns":17.698360434365267,"ns_err":0.025497647137887235,"bop":0.00012374748926619907},{"b":"CapsBench.foldMapDerivedPerCall","p":"-","ns":16.709835549331846,"ns_err":0.12707095250211997,"bop":0.00011673709231818701},{"b":"CapsBench.foldMapDirect","p":"-","ns":16.54637926732042,"ns_err":0.15221557523358473,"bop":0.00011573666559575874},{"b":"CapsBench.getCap","p":"-","ns":0.8534615524940871,"ns_err":0.002475259181041106,"bop":5.964124959466588e-06},{"b":"CapsBench.getDeepCap","p":"-","ns":1.1433855076749748,"ns_err":0.005210812068256686,"bop":7.985320995192597e-06},{"b":"CapsBench.getDeepDirect","p":"-","ns":1.0155583400843047,"ns_err":0.0043109680453412,"bop":7.0926549090408944e-06},{"b":"CapsBench.getDerivedHeld","p":"-","ns":1.6335425954879896,"ns_err":0.007791538605713705,"bop":1.1418770598948787e-05},{"b":"CapsBench.getDerivedPerCall","p":"-","ns":1.1359671736102925,"ns_err":0.008571127492215518,"bop":7.940727759529467e-06},{"b":"CapsBench.getDirect","p":"-","ns":0.7897480132521737,"ns_err":0.004751544095158379,"bop":5.518742019883346e-06},{"b":"CapsBench.modifyCap","p":"-","ns":5.5922320408094155,"ns_err":0.018221631566152155,"bop":40.00003932770871},{"b":"CapsBench.modifyDeepCap","p":"-","ns":27.73437584334028,"ns_err":0.5126192619282456,"bop":176.00019518026667},{"b":"CapsBench.modifyDeepDirect","p":"-","ns":26.143644516151998,"ns_err":0.09652005413492303,"bop":152.00018388559337},{"b":"CapsBench.modifyDerivedHeld","p":"-","ns":5.700959261528907,"ns_err":0.04668342958779676,"bop":40.00004015780017},{"b":"CapsBench.modifyDerivedPerCall","p":"-","ns":5.618594891976058,"ns_err":0.048138721481700106,"bop":40.00003954184493},{"b":"CapsBench.modifyDirect","p":"-","ns":5.5697734655292095,"ns_err":0.05504948391281572,"bop":40.00003921128969},{"b":"ClickRecordBench.encode_derived","p":"-","ns":379.81341131991945,"ns_err":9.711522562389133,"bop":744.0026706493243},{"b":"ClickRecordBench.encode_derivedThroughPrism","p":"-","ns":392.27654466371257,"ns_err":2.8466707058010248,"bop":744.0027607208668},{"b":"ClickRecordBench.encode_hand","p":"-","ns":113.57579531171588,"ns_err":0.6573089988794599,"bop":768.0007988411134},{"b":"ClickRecordBench.encode_positional","p":"-","ns":4302.589690099054,"ns_err":54.8794287947845,"bop":23912.03028879179},{"b":"ClickRecordBench.encode_vulcanFull","p":"-","ns":5153.745861148781,"ns_err":101.94452211303842,"bop":28408.0363021896},{"b":"CompositionBench.buildLens1","p":"-","ns":10.16420988872239,"ns_err":0.20220776804542254,"bop":72.00007150918073},{"b":"CompositionBench.buildLens3","p":"-","ns":27.045393416773962,"ns_err":0.11546128387229716,"bop":184.00019039779588},{"b":"CompositionBench.buildLens6","p":"-","ns":51.90373123840276,"ns_err":0.5141609920632199,"bop":352.00036528636366},{"b":"CompositionBench.buildLensOptional3","p":"-","ns":26.962294419942346,"ns_err":0.24592483675548277,"bop":184.0001896434677},{"b":"CompositionBench.reuseLeaf","p":"-","ns":3.519518185468568,"ns_err":0.06151373926244169,"bop":24.000024762507852},{"b":"CompositionBench.reuseLens1","p":"-","ns":10.31783761747736,"ns_err":0.1960943956823267,"bop":40.00007259022079},{"b":"CompositionBench.reuseLens3","p":"-","ns":28.274906502926406,"ns_err":0.3349837282009868,"bop":72.0001988712874},{"b":"CompositionBench.reuseLens6","p":"-","ns":77.49767855004984,"ns_err":0.557132979190134,"bop":120.0005455720242},{"b":"CompositionBench.reuseLensOptional3","p":"-","ns":38.780601771884534,"ns_err":0.24072594159891486,"bop":160.00027301477047},{"b":"FoldBench.eoFoldMap","p":"size=512","ns":1303.8395285068736,"ns_err":12.004809374820992,"bop":7936.2123029554805},{"b":"FoldBench.eoFoldMap","p":"size=64","ns":138.19414952784805,"ns_err":3.508117420082798,"bop":768.003250762081},{"b":"FoldBench.eoFoldMap","p":"size=8","ns":16.633604833243844,"ns_err":0.11266619596955428,"bop":0.00015256881054127132},{"b":"FoldBench.eoFoldPrices","p":"size=512","ns":2278.8149771156673,"ns_err":27.006826347443504,"bop":12312.370952904477},{"b":"FoldBench.eoFoldPrices","p":"size=64","ns":219.69313316136115,"ns_err":2.530634824614216,"bop":1560.0051681288448},{"b":"FoldBench.eoFoldPrices","p":"size=8","ns":29.944321152104276,"ns_err":0.09756274403857501,"bop":216.00027608199133},{"b":"FoldBench.mFoldMap","p":"size=512","ns":1288.8594300368636,"ns_err":10.535857071067841,"bop":7936.209851875358},{"b":"FoldBench.mFoldMap","p":"size=64","ns":134.77559159064282,"ns_err":1.6671597622788743,"bop":768.0031698617378},{"b":"FoldBench.mFoldMap","p":"size=8","ns":16.296522592651435,"ns_err":0.05843057139434353,"bop":0.00014898468614686346},{"b":"FoldBench.mFoldPrices","p":"size=512","ns":2276.2769256021566,"ns_err":23.836055341037795,"bop":12312.370586039347},{"b":"FoldBench.mFoldPrices","p":"size=64","ns":217.45493271045248,"ns_err":1.9747698279225154,"bop":1560.0051142543743},{"b":"FoldBench.mFoldPrices","p":"size=8","ns":29.685973985866198,"ns_err":0.490509156543796,"bop":216.00027286578913},{"b":"GenericsBench.genLensGet","p":"-","ns":0.7584697696255451,"ns_err":0.0020559999982411874,"bop":5.30042007584642e-06},{"b":"GenericsBench.genLensModify","p":"-","ns":3.7075614651032875,"ns_err":0.023736095485687426,"bop":24.000026061385928},{"b":"GenericsBench.genPrismGetHit","p":"-","ns":2.3552330154493473,"ns_err":0.0068287803164785495,"bop":16.00001656558691},{"b":"GenericsBench.genPrismGetMiss","p":"-","ns":0.8570403375871972,"ns_err":0.0026411557818219957,"bop":5.98540144073404e-06},{"b":"GenericsBench.genPrismModifyHit","p":"-","ns":3.3503215038295724,"ns_err":0.01615030700607897,"bop":24.000023586284957},{"b":"GenericsBench.genPrismModifyMiss","p":"-","ns":0.862299938625583,"ns_err":0.0040010076728635375,"bop":6.031470379399359e-06},{"b":"GenericsBench.handLensGet","p":"-","ns":0.759417073499346,"ns_err":0.005634572021627546,"bop":5.308602117038585e-06},{"b":"GenericsBench.handLensModify","p":"-","ns":3.491085696240298,"ns_err":0.01784441545002197,"bop":24.00002455448106},{"b":"GenericsBench.handPrismGetHit","p":"-","ns":2.3406059783807507,"ns_err":0.028926234186668006,"bop":16.0000164728613},{"b":"GenericsBench.handPrismGetMiss","p":"-","ns":0.7754172970279068,"ns_err":0.003583033900361593,"bop":5.4219952958702056e-06},{"b":"GenericsBench.handPrismModifyHit","p":"-","ns":3.3352197210529004,"ns_err":0.031227079302949132,"bop":24.0000234720497},{"b":"GenericsBench.handPrismModifyMiss","p":"-","ns":0.7728733055102562,"ns_err":0.00673081501660797,"bop":5.406477323052468e-06},{"b":"GenericsBench.rawLensGet","p":"-","ns":0.560697420183833,"ns_err":0.001483823771748864,"bop":3.915876782578388e-06},{"b":"GenericsBench.rawLensModify","p":"-","ns":3.3920881032824615,"ns_err":0.02705463348120927,"bop":24.00002388030866},{"b":"GenericsBench.rawPrismGetHit","p":"-","ns":2.51109550096424,"ns_err":0.03155282924559094,"bop":16.00001766227084},{"b":"GenericsBench.rawPrismModifyHit","p":"-","ns":3.326740263289721,"ns_err":0.03379321138027841,"bop":24.0000234061974},{"b":"GetterBench.eoGet_0","p":"-","ns":0.6745090630244367,"ns_err":0.006994309219071616,"bop":4.713729059184805e-06},{"b":"GetterBench.eoGet_3","p":"-","ns":10.155687367024354,"ns_err":0.13333953032474827,"bop":7.085389995458058e-05},{"b":"GetterBench.eoGet_6","p":"-","ns":19.59388115600239,"ns_err":0.06265678794762702,"bop":0.00013696748786883986},{"b":"GetterBench.eoGet_orderId","p":"-","ns":0.6730854224838296,"ns_err":0.005745950340921909,"bop":4.706355779763644e-06},{"b":"GetterBench.mGet_0","p":"-","ns":0.38384037606115007,"ns_err":0.010385740245352364,"bop":2.6839763926395437e-06},{"b":"GetterBench.mGet_3","p":"-","ns":5.251613308034466,"ns_err":0.3375100965819252,"bop":3.6674760718304e-05},{"b":"GetterBench.mGet_6","p":"-","ns":16.66579021485683,"ns_err":0.2379669555666801,"bop":0.0001164089972075546},{"b":"GetterBench.mGet_orderId","p":"-","ns":0.3766693939108255,"ns_err":0.0032291744334518296,"bop":2.633879907301443e-06},{"b":"IsoBench.eoGet","p":"-","ns":4.511468018048431,"ns_err":0.023893297379624038,"bop":32.00003170234615},{"b":"IsoBench.eoReverseGet","p":"-","ns":4.432238018993824,"ns_err":0.02042304830490885,"bop":32.000031174624354},{"b":"IsoBench.mGet","p":"-","ns":4.584338207492616,"ns_err":0.05506601158691662,"bop":32.00003228378932},{"b":"IsoBench.mReverseGet","p":"-","ns":4.507901292216603,"ns_err":0.011051493072927927,"bop":32.00003172591828},{"b":"JsoniterBench.cModifyId","p":"size=512","ns":281082.7614342532,"ns_err":2777.1175583983227,"bop":1066679.9624252664},{"b":"JsoniterBench.cModifyId","p":"size=64","ns":35897.23881102427,"ns_err":250.85549788786682,"bop":136264.49375182684},{"b":"JsoniterBench.cModifyId","p":"size=8","ns":6220.704158166783,"ns_err":125.67674772096804,"bop":20704.062230591622},{"b":"JsoniterBench.cReadId","p":"size=512","ns":148919.68091518793,"ns_err":1886.563772230235,"bop":797914.3531056264},{"b":"JsoniterBench.cReadId","p":"size=64","ns":18725.82926267393,"ns_err":155.723980210788,"bop":101288.53805613828},{"b":"JsoniterBench.cReadId","p":"size=8","ns":2912.088404232808,"ns_err":13.939795564052751,"bop":15568.02911914336},{"b":"JsoniterBench.cReadStreet","p":"size=512","ns":149872.6928021003,"ns_err":2125.412171309253,"bop":797914.6247583744},{"b":"JsoniterBench.cReadStreet","p":"size=64","ns":18757.394933303447,"ns_err":165.75148166900453,"bop":101288.538658433},{"b":"JsoniterBench.cReadStreet","p":"size=8","ns":2963.0872140423403,"ns_err":50.68895856314943,"bop":15568.029648699416},{"b":"JsoniterBench.cReplaceId","p":"size=512","ns":281300.1450039811,"ns_err":3052.1988237151418,"bop":1066615.9947818439},{"b":"JsoniterBench.cReplaceId","p":"size=64","ns":36251.01211606833,"ns_err":716.7717486993778,"bop":136216.59569420616},{"b":"JsoniterBench.cReplaceId","p":"size=8","ns":6053.644153554939,"ns_err":27.397793609112178,"bop":20656.060572063678},{"b":"JsoniterBench.cSumPrices","p":"size=512","ns":243908.19804183661,"ns_err":2294.69712880391,"bop":1240709.3636161864},{"b":"JsoniterBench.cSumPrices","p":"size=64","ns":30276.83080911151,"ns_err":111.4324673794005,"bop":157486.85616603587},{"b":"JsoniterBench.cSumPrices","p":"size=8","ns":4616.838595100914,"ns_err":34.48638825222249,"bop":22720.046179191},{"b":"JsoniterBench.jMiss","p":"size=512","ns":143.21940070573828,"ns_err":2.965653160042864,"bop":0.04072496793360148},{"b":"JsoniterBench.jMiss","p":"size=64","ns":142.65665608845399,"ns_err":2.62891216709344,"bop":0.004092062501568403},{"b":"JsoniterBench.jMiss","p":"size=8","ns":144.93773546748062,"ns_err":1.082806067607269,"bop":0.0014418297249720762},{"b":"JsoniterBench.jModifyId","p":"size=512","ns":5342.665475376069,"ns_err":120.90655423325245,"bop":41921.519651267285},{"b":"JsoniterBench.jModifyId","p":"size=64","ns":669.0439126484006,"ns_err":14.308243814437587,"bop":5336.019195269129},{"b":"JsoniterBench.jModifyId","p":"size=8","ns":146.08826387680537,"ns_err":2.3373790569345174,"bop":992.0014601870549},{"b":"JsoniterBench.jReadId","p":"size=512","ns":32.72088603743555,"ns_err":4.32682595648702,"bop":64.00930618564293},{"b":"JsoniterBench.jReadId","p":"size=64","ns":30.549673399435598,"ns_err":5.5374110879925365,"bop":48.000876332757265},{"b":"JsoniterBench.jReadId","p":"size=8","ns":32.93665581424628,"ns_err":4.268825420806407,"bop":64.00032913438349},{"b":"JsoniterBench.jReadStreet","p":"size=512","ns":145.7101287524725,"ns_err":1.1534266488318632,"bop":136.04143990574542},{"b":"JsoniterBench.jReadStreet","p":"size=64","ns":147.51661765233078,"ns_err":1.786525629663283,"bop":128.0042316419077},{"b":"JsoniterBench.jReadStreet","p":"size=8","ns":148.07203190936173,"ns_err":1.4320870673819954,"bop":136.00148002530955},{"b":"JsoniterBench.jReplaceId","p":"size=512","ns":5295.178853393412,"ns_err":74.07117357999037,"bop":41889.50598965623},{"b":"JsoniterBench.jReplaceId","p":"size=64","ns":650.634014426879,"ns_err":10.28710512481413,"bop":5304.0186694497925},{"b":"JsoniterBench.jReplaceId","p":"size=8","ns":143.78936060290837,"ns_err":0.8687787354433597,"bop":960.0014386786136},{"b":"JsoniterBench.jSumPrices","p":"size=512","ns":67706.80731761671,"ns_err":571.7080769208152,"bop":63671.3416717465},{"b":"JsoniterBench.jSumPrices","p":"size=64","ns":8504.48429063342,"ns_err":106.25744361834904,"bop":8120.244418903405},{"b":"JsoniterBench.jSumPrices","p":"size=8","ns":1132.2817947990518,"ns_err":15.735435256868303,"bop":1176.011314884491},{"b":"KyoDiBench.eoEnvFocus","p":"-","ns":83.75348665323516,"ns_err":1.0148817726899577,"bop":320.0005888708831},{"b":"KyoDiBench.eoMapDrillModify","p":"-","ns":34.449988041275894,"ns_err":0.4314287911348096,"bop":216.00024234062582},{"b":"KyoDiBench.eoMapGet","p":"-","ns":1.8448042972038279,"ns_err":0.0053031232138280645,"bop":1.2892032169510399e-05},{"b":"KyoDiBench.eoVarUpdateFocus","p":"-","ns":66.41651765024216,"ns_err":2.904378628172621,"bop":216.00046771366203},{"b":"KyoDiBench.handEnvUse","p":"-","ns":82.54395610718464,"ns_err":1.1546077593280797,"bop":312.00058069813787},{"b":"KyoDiBench.handMapDrillModify","p":"-","ns":32.956111053840104,"ns_err":0.15753385062513275,"bop":216.00023220878242},{"b":"KyoDiBench.handMapGet","p":"-","ns":1.3901242068124602,"ns_err":0.0027442418749642245,"bop":9.714569756433084e-06},{"b":"KyoDiBench.handVarUpdate","p":"-","ns":64.99401179531324,"ns_err":3.024844187885952,"bop":200.00045679789454},{"b":"LensBench.eoGet","p":"-","ns":0.7818214924787079,"ns_err":0.004860844323481373,"bop":5.4668048957998375e-06},{"b":"LensBench.eoModify","p":"-","ns":5.629644940187434,"ns_err":0.08362598849147028,"bop":40.00003957263122},{"b":"LensBench.eoModifyDeep","p":"-","ns":26.05641068542989,"ns_err":0.0978877446903051,"bop":152.0001834373057},{"b":"LensBench.eoReplace","p":"-","ns":5.5327065781863105,"ns_err":0.08002381376983107,"bop":40.00003898101815},{"b":"LensBench.mGet","p":"-","ns":0.8547847642044755,"ns_err":0.0064727047978726995,"bop":5.975010610267234e-06},{"b":"LensBench.mModify","p":"-","ns":5.577404613528267,"ns_err":0.05668725055203039,"bop":40.00003921710648},{"b":"LensBench.mModifyDeep","p":"-","ns":26.855789363026204,"ns_err":0.11342179901008319,"bop":176.00018871939446},{"b":"LensBench.mReplace","p":"-","ns":5.37004426964555,"ns_err":0.023311513268903163,"bop":40.00003780485128},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=1024","ns":15494.672837417189,"ns_err":1970.6358127965448,"bop":43036.01610647593},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=256","ns":2638.149032079124,"ns_err":10.15200720184164,"bop":9240.180829208555},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=32","ns":273.8530714378334,"ns_err":0.8380018478782213,"bop":920.0039791276681},{"b":"MultiFocusBench.eoFold_powerEach","p":"size=4","ns":56.66800119037507,"ns_err":0.16864661023806563,"bop":328.00045498484377},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=1024","ns":56453.4441324942,"ns_err":929.282054533578,"bop":331134.5482933451},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=256","ns":12672.141684289632,"ns_err":123.76118362441649,"bop":76112.86858957022},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=32","ns":1461.3297777768687,"ns_err":5.324189150064743,"bop":8600.021262358454},{"b":"MultiFocusBench.eoModify_multiFocus","p":"size=4","ns":190.68633478748623,"ns_err":0.8116229172233295,"bop":1320.0015311299755},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=1024","ns":29220.849643533926,"ns_err":746.1593943101499,"bop":115175.57582806681},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=256","ns":6024.912195057941,"ns_err":474.2445065667451,"bop":26080.412960531754},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=32","ns":758.0790109116733,"ns_err":15.584673800952901,"bop":3152.0110095147847},{"b":"MultiFocusBench.eoModify_powerEach","p":"size=4","ns":129.50097806280075,"ns_err":1.4154902440380046,"bop":800.0010399916019},{"b":"MultiFocusBench.naive_listMap","p":"size=1024","ns":10123.504440132707,"ns_err":28.149461538727014,"bop":65578.62478911654},{"b":"MultiFocusBench.naive_listMap","p":"size=256","ns":2480.353578553297,"ns_err":10.528400512935685,"bop":16424.17000607807},{"b":"MultiFocusBench.naive_listMap","p":"size=32","ns":314.67661601680186,"ns_err":1.1383872539277846,"bop":2088.004573017399},{"b":"MultiFocusBench.naive_listMap","p":"size=4","ns":44.95951356085869,"ns_err":0.4670341643901658,"bop":296.00036156199616},{"b":"MultiFocusBench.naive_sumQty","p":"size=1024","ns":4592.637214670913,"ns_err":176.4582282616668,"bop":16129.19085586649},{"b":"MultiFocusBench.naive_sumQty","p":"size=256","ns":607.0857200513933,"ns_err":2.303623519848732,"bop":3840.041610068448},{"b":"MultiFocusBench.naive_sumQty","p":"size=32","ns":51.74766362376673,"ns_err":0.1204522836076058,"bop":256.0007521480499},{"b":"MultiFocusBench.naive_sumQty","p":"size=4","ns":5.435236000043525,"ns_err":0.0515784097147008,"bop":4.3429432908635785e-05},{"b":"MultiFocusCollectBench.eoCollectList_listSum","p":"-","ns":24.219380663819425,"ns_err":0.06012197178247213,"bop":56.000170452262246},{"b":"MultiFocusCollectBench.eoCollectMap_constSum","p":"-","ns":1.3590507189905476,"ns_err":0.012371811470648843,"bop":9.500007024187607e-06},{"b":"MultiFocusCollectBench.eoCollectMap_zipMean","p":"-","ns":129.01593722706295,"ns_err":0.45579096536494657,"bop":880.0009075421424},{"b":"MultiFocusCollectBench.eoModify_multiFocusTuple3","p":"-","ns":18.86711415825061,"ns_err":0.4388534693249197,"bop":128.00013262126456},{"b":"MultiFocusCollectBench.eoModify_multiFocusTuple6","p":"-","ns":33.16523563141022,"ns_err":0.15280776038857669,"bop":224.00023311461447},{"b":"MultiFocusCollectBench.naive_constSum","p":"-","ns":2.3684932497548625,"ns_err":0.03458258018831791,"bop":16.000016678426938},{"b":"MultiFocusCollectBench.naive_listSum","p":"-","ns":22.465017017252475,"ns_err":0.3219494782030854,"bop":56.00015800787475},{"b":"MultiFocusCollectBench.naive_tuple3Rewrite","p":"-","ns":12.967441662344173,"ns_err":0.07432405662920837,"bop":96.00009126353498},{"b":"MultiFocusCollectBench.naive_tuple6Rewrite","p":"-","ns":24.540585162269142,"ns_err":0.22105363312001441,"bop":184.00017265690866},{"b":"MultiFocusCollectBench.naive_zipMeanBroadcast","p":"-","ns":203.8276720282188,"ns_err":0.862585339608251,"bop":1176.0014362179952},{"b":"OpticBuildBench.build","p":"-","ns":36.12662394421583,"ns_err":0.046704681749852324,"bop":184.00029971796553},{"b":"OpticBuildBench.buildAndUse","p":"-","ns":799.2026699255562,"ns_err":24.298930857680702,"bop":2840.0063338558907},{"b":"OpticBuildBench.reuseUse","p":"-","ns":757.2221228915917,"ns_err":11.12196639315901,"bop":2696.005326053067},{"b":"OptionalBench.eoModify_0","p":"-","ns":17.914037809264254,"ns_err":0.08981338932622791,"bop":112.00012622759347},{"b":"OptionalBench.eoModify_0_empty","p":"-","ns":1.1228903552134213,"ns_err":0.0039994917634865864,"bop":7.84465025056549e-06},{"b":"OptionalBench.eoModify_3","p":"-","ns":38.54958359539476,"ns_err":0.3982800268150927,"bop":160.00027104694038},{"b":"OptionalBench.eoModify_6","p":"-","ns":89.32725459302083,"ns_err":0.441806760366659,"bop":208.00062866988839},{"b":"OptionalBench.eoModify_loyalty","p":"-","ns":17.034067503686643,"ns_err":0.1932394628908449,"bop":112.00012002892045},{"b":"OptionalBench.eoModify_loyalty_empty","p":"-","ns":1.1230407776999392,"ns_err":0.0016742541745057384,"bop":7.843373911647281e-06},{"b":"OptionalBench.eoReplace_0","p":"-","ns":5.6612889289057104,"ns_err":0.019415324405835536,"bop":40.00003981889237},{"b":"OptionalBench.eoReplace_loyalty","p":"-","ns":11.885253635955804,"ns_err":0.09351720255703609,"bop":88.00008362980734},{"b":"OptionalBench.mModify_0","p":"-","ns":17.852976441355064,"ns_err":0.07156241876383503,"bop":112.0001255643726},{"b":"OptionalBench.mModify_0_empty","p":"-","ns":1.270450670596264,"ns_err":0.06271623665696496,"bop":8.872928779558127e-06},{"b":"OptionalBench.mModify_3","p":"-","ns":51.3649821206098,"ns_err":0.2536063540399851,"bop":304.000361611474},{"b":"OptionalBench.mModify_6","p":"-","ns":84.60723228200159,"ns_err":1.4951287531213817,"bop":496.00059577856956},{"b":"OptionalBench.mModify_loyalty","p":"-","ns":16.888972792811526,"ns_err":0.09476490243107538,"bop":112.00011884618898},{"b":"OptionalBench.mModify_loyalty_empty","p":"-","ns":1.3486651992557686,"ns_err":0.03568768829459351,"bop":9.406927227013853e-06},{"b":"OptionalBench.mReplace_0","p":"-","ns":5.460032183716248,"ns_err":0.0539650125158905,"bop":40.00003848503747},{"b":"OptionalBench.mReplace_loyalty","p":"-","ns":11.807909999343115,"ns_err":0.09873032373728025,"bop":88.0000830271901},{"b":"OrderAvroBench.eoModifyNames","p":"size=512","ns":25112.550094679373,"ns_err":137.46748244590106,"bop":97421.8876134024},{"b":"OrderAvroBench.eoModifyNames","p":"size=64","ns":3014.062577142267,"ns_err":58.43840730350139,"bop":13128.10524084797},{"b":"OrderAvroBench.eoModifyNames","p":"size=8","ns":453.9471772476036,"ns_err":1.2152832151158697,"bop":2160.005023925974},{"b":"OrderAvroBench.eoModifyStreet","p":"size=512","ns":86.30095394406773,"ns_err":0.16026026902231866,"bop":328.02065469268865},{"b":"OrderAvroBench.eoModifyStreet","p":"size=64","ns":85.49635702688825,"ns_err":0.24980579875698108,"bop":328.0029927750546},{"b":"OrderAvroBench.eoModifyStreet","p":"size=8","ns":86.12663957242873,"ns_err":1.3114151477514777,"bop":328.00092508818585},{"b":"OrderAvroBench.eoReadStreet","p":"size=512","ns":24.462151011267746,"ns_err":0.26279683791911834,"bop":88.00585412670802},{"b":"OrderAvroBench.eoReadStreet","p":"size=64","ns":24.32730104525689,"ns_err":0.048034271447222505,"bop":88.00085180437898},{"b":"OrderAvroBench.eoReadStreet","p":"size=8","ns":24.35195125254698,"ns_err":0.07092899532538861,"bop":88.00026146496293},{"b":"OrderAvroBench.monocleModifyNames","p":"size=512","ns":71679.4517276313,"ns_err":377.1625478020127,"bop":382786.5955695364},{"b":"OrderAvroBench.monocleModifyNames","p":"size=64","ns":7420.103425935742,"ns_err":79.85924226133076,"bop":39840.25112027477},{"b":"OrderAvroBench.monocleModifyNames","p":"size=8","ns":1058.497356466414,"ns_err":8.426212178547575,"bop":5400.011196125944},{"b":"OrderAvroBench.monocleModifyStreet","p":"size=512","ns":33901.103090125514,"ns_err":260.9964846773735,"bop":169070.71451709353},{"b":"OrderAvroBench.monocleModifyStreet","p":"size=64","ns":4412.236659192479,"ns_err":77.38809525743815,"bop":20904.14926678872},{"b":"OrderAvroBench.monocleModifyStreet","p":"size=8","ns":689.2141451131786,"ns_err":22.888366810231652,"bop":2992.0072873527492},{"b":"OrderAvroBench.monocleReadStreet","p":"size=512","ns":17105.154764768035,"ns_err":29.612697090446325,"bop":69780.09406744731},{"b":"OrderAvroBench.monocleReadStreet","p":"size=64","ns":2187.9459654933935,"ns_err":23.505450907458236,"bop":8848.076497134223},{"b":"OrderAvroBench.monocleReadStreet","p":"size=8","ns":329.44207732658015,"ns_err":4.396521916529561,"bop":1208.003539290708},{"b":"OrderAvroBench.naiveModifyNames","p":"size=512","ns":43850.41642395035,"ns_err":481.46148541570403,"bop":226287.59587102334},{"b":"OrderAvroBench.naiveModifyNames","p":"size=64","ns":5631.537927014401,"ns_err":66.05273279502778,"bop":27936.190540237505},{"b":"OrderAvroBench.naiveModifyNames","p":"size=8","ns":818.1569916446938,"ns_err":15.383077008286852,"bop":3752.0086453980757},{"b":"OrderAvroBench.naiveModifyStreet","p":"size=512","ns":33797.75472720496,"ns_err":421.3335446395192,"bop":169046.7379794502},{"b":"OrderAvroBench.naiveModifyStreet","p":"size=64","ns":4427.151784928313,"ns_err":83.5258629791704,"bop":20880.14981737725},{"b":"OrderAvroBench.naiveModifyStreet","p":"size=8","ns":694.7394242827836,"ns_err":18.997389904986992,"bop":2968.0073405720273},{"b":"OrderAvroBench.naiveReadStreet","p":"size=512","ns":17173.591459727508,"ns_err":241.3547478941817,"bop":69780.1103551251},{"b":"OrderAvroBench.naiveReadStreet","p":"size=64","ns":2180.441621152668,"ns_err":3.6948882830790177,"bop":8848.076160407149},{"b":"OrderAvroBench.naiveReadStreet","p":"size=8","ns":328.85028918720604,"ns_err":3.5652764981363854,"bop":1208.0035329944185},{"b":"OrderCirceBench.directNames","p":"size=512","ns":160671.73119545105,"ns_err":3762.4986896273317,"bop":613928.8029314622},{"b":"OrderCirceBench.directNames","p":"size=64","ns":20432.191645200317,"ns_err":275.82038845961296,"bop":77698.15332166656},{"b":"OrderCirceBench.directNames","p":"size=8","ns":2801.131212690773,"ns_err":78.07476467420824,"bop":10688.061569706031},{"b":"OrderCirceBench.directStreet","p":"size=512","ns":770.9464387586187,"ns_err":7.722132836250497,"bop":2736.608542281601},{"b":"OrderCirceBench.directStreet","p":"size=64","ns":768.2194855866691,"ns_err":3.8235787820869405,"bop":2736.0798483606973},{"b":"OrderCirceBench.directStreet","p":"size=8","ns":772.3653903495148,"ns_err":8.65159478111001,"bop":2736.0169183183943},{"b":"OrderCirceBench.eoNames","p":"size=512","ns":165861.46423394154,"ns_err":3391.8719095969095,"bop":613972.9537146332},{"b":"OrderCirceBench.eoNames","p":"size=64","ns":21094.570794483054,"ns_err":535.966710717845,"bop":78778.22281783448},{"b":"OrderCirceBench.eoNames","p":"size=8","ns":2870.5180071262607,"ns_err":59.8079607572411,"bop":10944.062934932565},{"b":"OrderCirceBench.eoNamesIor","p":"size=512","ns":170538.42015283994,"ns_err":3253.4832636914334,"bop":679376.7010146462},{"b":"OrderCirceBench.eoNamesIor","p":"size=64","ns":23127.874764568605,"ns_err":330.34330550859306,"bop":86962.43696697931},{"b":"OrderCirceBench.eoNamesIor","p":"size=8","ns":3111.496902540181,"ns_err":107.23374364137261,"bop":11576.067735170007},{"b":"OrderCirceBench.eoStreet","p":"size=512","ns":748.0892217219845,"ns_err":11.641651611081022,"bop":2720.590377727877},{"b":"OrderCirceBench.eoStreet","p":"size=64","ns":755.7041077569176,"ns_err":19.086474197299783,"bop":2720.0784940668623},{"b":"OrderCirceBench.eoStreet","p":"size=8","ns":771.6487384020445,"ns_err":11.815588388030928,"bop":2720.016889620584},{"b":"OrderCirceBench.eoStreetIor","p":"size=512","ns":779.466580757418,"ns_err":7.775714864785115,"bop":2736.615265749335},{"b":"OrderCirceBench.eoStreetIor","p":"size=64","ns":771.0779103070225,"ns_err":23.844189417961132,"bop":2736.0800956640005},{"b":"OrderCirceBench.eoStreetIor","p":"size=8","ns":761.4364962193827,"ns_err":17.516083570800863,"bop":2736.0164914062652},{"b":"OrderCirceBench.hcursorNames","p":"size=512","ns":160016.31301034943,"ns_err":5165.100535849966,"bop":613928.262130368},{"b":"OrderCirceBench.hcursorNames","p":"size=64","ns":20488.90145790099,"ns_err":691.2086976878483,"bop":77778.15922526376},{"b":"OrderCirceBench.hcursorNames","p":"size=8","ns":2789.634743950827,"ns_err":146.3142865643279,"bop":10696.060726984308},{"b":"OrderCirceBench.hcursorStreet","p":"size=512","ns":810.9321899483009,"ns_err":8.196370968185063,"bop":3032.64010186698},{"b":"OrderCirceBench.hcursorStreet","p":"size=64","ns":801.3597872746842,"ns_err":10.235366829370058,"bop":3032.0832345979015},{"b":"OrderCirceBench.hcursorStreet","p":"size=8","ns":810.6699134036403,"ns_err":8.560390215909344,"bop":3032.017574773808},{"b":"OrderCirceBench.monocleNames","p":"size=512","ns":180537.98406039327,"ns_err":2074.1698507907554,"bop":1121729.3209192238},{"b":"OrderCirceBench.monocleNames","p":"size=64","ns":20767.696607129565,"ns_err":434.0442925119606,"bop":132756.52496168183},{"b":"OrderCirceBench.monocleNames","p":"size=8","ns":3184.3425824920632,"ns_err":24.012821689795597,"bop":19466.727718486432},{"b":"OrderCirceBench.monocleStreet","p":"size=512","ns":140475.51631139757,"ns_err":2883.9864650807303,"bop":907998.400535316},{"b":"OrderCirceBench.monocleStreet","p":"size=64","ns":17668.19271887427,"ns_err":335.91255321936416,"bop":113809.58094323003},{"b":"OrderCirceBench.monocleStreet","p":"size=8","ns":2753.162737704795,"ns_err":34.696007344871866,"bop":17053.38611551436},{"b":"OrderCirceBench.naiveNames","p":"size=512","ns":147247.57008649028,"ns_err":1961.3454200943297,"bop":965234.9533730051},{"b":"OrderCirceBench.naiveNames","p":"size=64","ns":18518.978883685588,"ns_err":231.87800734133552,"bop":120825.6569300632},{"b":"OrderCirceBench.naiveNames","p":"size=8","ns":2882.5752870934925,"ns_err":48.08560577416717,"bop":17808.05522903864},{"b":"OrderCirceBench.naiveStreet","p":"size=512","ns":139044.2032872369,"ns_err":553.8546579927921,"bop":908008.1022594867},{"b":"OrderCirceBench.naiveStreet","p":"size=64","ns":17586.33994775317,"ns_err":160.8621959573821,"bop":113774.9068115721},{"b":"OrderCirceBench.naiveStreet","p":"size=8","ns":2724.5899676755207,"ns_err":26.664129871382258,"bop":17034.718986731987},{"b":"OrderJsoniterBench.eoModifyStreet","p":"size=512","ns":5605.786493040046,"ns_err":58.52585865085189,"bop":42029.0377175268},{"b":"OrderJsoniterBench.eoModifyStreet","p":"size=64","ns":803.1728075697304,"ns_err":4.946582300495121,"bop":5432.093145027024},{"b":"OrderJsoniterBench.eoModifyStreet","p":"size=8","ns":233.24059170020146,"ns_err":1.05735754525608,"bop":1080.0053728129599},{"b":"OrderJsoniterBench.eoReadStreet","p":"size=512","ns":147.37545427962203,"ns_err":2.106869569449934,"bop":109.46579635334582},{"b":"OrderJsoniterBench.eoReadStreet","p":"size=64","ns":149.72249870545733,"ns_err":1.2049720607842838,"bop":128.01739635462084},{"b":"OrderJsoniterBench.eoReadStreet","p":"size=8","ns":147.2149540059652,"ns_err":2.5342126468795487,"bop":90.67005631554684},{"b":"OrderJsoniterBench.eoSumPrices","p":"size=512","ns":67758.5734124961,"ns_err":332.4794845873834,"bop":63713.09498036869},{"b":"OrderJsoniterBench.eoSumPrices","p":"size=64","ns":8401.54484309804,"ns_err":64.75509140740274,"bop":8120.971690792298},{"b":"OrderJsoniterBench.eoSumPrices","p":"size=8","ns":1147.922790172773,"ns_err":22.366819843179545,"bop":1176.0264402534185},{"b":"OrderJsoniterBench.monocleModifyStreet","p":"size=512","ns":119210.4147523509,"ns_err":699.317711013537,"bop":333548.0869772078},{"b":"OrderJsoniterBench.monocleModifyStreet","p":"size=64","ns":14249.507749526843,"ns_err":30.708332435645023,"bop":30081.43545177518},{"b":"OrderJsoniterBench.monocleModifyStreet","p":"size=8","ns":2516.6091110782077,"ns_err":21.34346463259259,"bop":4664.053131059967},{"b":"OrderJsoniterBench.monocleReadStreet","p":"size=512","ns":62735.38234397176,"ns_err":378.5796108490496,"bop":193205.70807279498},{"b":"OrderJsoniterBench.monocleReadStreet","p":"size=64","ns":8035.719228036778,"ns_err":145.84452104578583,"bop":24704.8219591919},{"b":"OrderJsoniterBench.monocleReadStreet","p":"size=8","ns":1277.823141944016,"ns_err":12.715015203114804,"bop":3648.0272257914626},{"b":"OrderJsoniterBench.monocleSumPrices","p":"size=512","ns":295494.7414045584,"ns_err":2715.6797333793716,"bop":1178332.9306203783},{"b":"OrderJsoniterBench.monocleSumPrices","p":"size=64","ns":11464.709085281349,"ns_err":31.94152346715516,"bop":45833.17279419899},{"b":"OrderJsoniterBench.monocleSumPrices","p":"size=8","ns":1882.7666166788395,"ns_err":14.720207499032783,"bop":6338.706767315897},{"b":"OrderJsoniterBench.naiveModifyStreet","p":"size=512","ns":119443.03997812308,"ns_err":445.4798165597534,"bop":333499.8774935034},{"b":"OrderJsoniterBench.naiveModifyStreet","p":"size=64","ns":14268.92718289181,"ns_err":134.0240680001998,"bop":30057.437296569788},{"b":"OrderJsoniterBench.naiveModifyStreet","p":"size=8","ns":2500.8046221226405,"ns_err":4.687649290808973,"bop":4640.0528207734815},{"b":"OrderJsoniterBench.naiveReadStreet","p":"size=512","ns":62951.17541866061,"ns_err":232.81904742327882,"bop":193205.88979965728},{"b":"OrderJsoniterBench.naiveReadStreet","p":"size=64","ns":7948.97345632789,"ns_err":18.763136892936163,"bop":24704.813263475124},{"b":"OrderJsoniterBench.naiveReadStreet","p":"size=8","ns":1271.5157255837769,"ns_err":6.059462470533508,"bop":3648.0271003230273},{"b":"OrderJsoniterBench.naiveSumPrices","p":"size=512","ns":68711.55350862899,"ns_err":442.1489699972525,"bop":230098.91667245745},{"b":"OrderJsoniterBench.naiveSumPrices","p":"size=64","ns":8578.03283097076,"ns_err":21.765114768513243,"bop":29336.877285137827},{"b":"OrderJsoniterBench.naiveSumPrices","p":"size=8","ns":1348.1547114559753,"ns_err":6.596474315916529,"bop":4248.028702976551},{"b":"OrderJsoniterBench.nativeReadStreet","p":"size=512","ns":28950.88529945082,"ns_err":219.67008979636117,"bop":448.2229800790958},{"b":"OrderJsoniterBench.nativeReadStreet","p":"size=64","ns":3734.537354378114,"ns_err":69.92607204072387,"bop":424.4021505729482},{"b":"OrderJsoniterBench.nativeReadStreet","p":"size=8","ns":667.3272590689159,"ns_err":8.24713152065172,"bop":424.01443736719835},{"b":"OrderJsoniterBench.nativeSumPrices","p":"size=512","ns":47023.89104315951,"ns_err":989.2993714956075,"bop":86269.66977594254},{"b":"OrderJsoniterBench.nativeSumPrices","p":"size=64","ns":5744.5470755325305,"ns_err":15.216477201870212,"bop":10920.620935338862},{"b":"OrderJsoniterBench.nativeSumPrices","p":"size=8","ns":856.3461285734376,"ns_err":5.903289618934266,"bop":1512.0185669121101},{"b":"PlatedBench.eoTransformDeep","p":"n=4096","ns":113589.80320760306,"ns_err":270.7986955798018,"bop":624378.6777719711},{"b":"PlatedBench.eoTransformDeep","p":"n=512","ns":12073.889270455624,"ns_err":177.34738575274716,"bop":57361.23261281591},{"b":"PlatedBench.eoTransformDeep","p":"n=64","ns":1262.8495636052735,"ns_err":4.924879477372979,"bop":7184.025051312461},{"b":"PlatedBench.eoTransformExpr","p":"n=4096","ns":114650.34089438383,"ns_err":2459.4398615427663,"bop":655347.4503140146},{"b":"PlatedBench.eoTransformExpr","p":"n=512","ns":14224.343456165112,"ns_err":42.52906093994007,"bop":81825.45267390365},{"b":"PlatedBench.eoTransformExpr","p":"n=64","ns":1748.824977568514,"ns_err":20.533476581480347,"bop":10144.034301632279},{"b":"PlatedBench.eoUniverseDeep","p":"n=4096","ns":139189.43464017837,"ns_err":1415.371637761143,"bop":786605.312444351},{"b":"PlatedBench.eoUniverseDeep","p":"n=512","ns":16866.183414638355,"ns_err":62.390083191294096,"bop":98377.72240894576},{"b":"PlatedBench.eoUniverseDeep","p":"n=64","ns":1945.7158593524696,"ns_err":6.208229394209733,"bop":12360.037712127332},{"b":"PlatedBench.eoUniverseExpr","p":"n=4096","ns":137192.69045316402,"ns_err":991.6533184184943,"bop":786411.8564126783},{"b":"PlatedBench.eoUniverseExpr","p":"n=512","ns":16558.902140877526,"ns_err":210.05603130995723,"bop":98185.69111861427},{"b":"PlatedBench.eoUniverseExpr","p":"n=64","ns":1904.535346655318,"ns_err":9.392817590552962,"bop":12168.03690586059},{"b":"PlatedBench.eoUniverseJson","p":"n=4096","ns":178734.8230278913,"ns_err":1039.6325418631704,"bop":786442.0926674528},{"b":"PlatedBench.eoUniverseJson","p":"n=512","ns":21362.577068479375,"ns_err":81.4697449428127,"bop":98186.18130202037},{"b":"PlatedBench.eoUniverseJson","p":"n=64","ns":2387.3516404997363,"ns_err":45.32064443330523,"bop":12168.04633401055},{"b":"PlatedBench.mTransformExpr","p":"n=4096","ns":134018.30755755457,"ns_err":1604.5048793649182,"bop":753713.5488303954},{"b":"PlatedBench.mTransformExpr","p":"n=512","ns":12097.391668295215,"ns_err":92.09935378161796,"bop":69585.23563842986},{"b":"PlatedBench.mTransformExpr","p":"n=64","ns":2043.739267998354,"ns_err":12.39683447822019,"bop":11728.039594572523},{"b":"PlatedBench.mUniverseExpr","p":"n=4096","ns":4297983.156467696,"ns_err":173922.29471228755,"bop":4688802.610405239},{"b":"PlatedBench.mUniverseExpr","p":"n=512","ns":301081.20485234546,"ns_err":5228.687520246696,"bop":475022.74671466835},{"b":"PlatedBench.mUniverseExpr","p":"n=64","ns":26311.065862394255,"ns_err":151.67647443721737,"bop":45424.510213055626},{"b":"PlatedBench.mUniverseJson","p":"n=4096","ns":4529430.028113193,"ns_err":214793.38567745988,"bop":6884001.25557592},{"b":"PlatedBench.mUniverseJson","p":"n=512","ns":331801.04285315913,"ns_err":4258.095342875486,"bop":699929.8812953488},{"b":"PlatedBench.mUniverseJson","p":"n=64","ns":30140.92204014061,"ns_err":164.66928417538242,"bop":73208.5883928611},{"b":"PlatedBench.visitorTransformDeep","p":"n=4096","ns":39532.51277297733,"ns_err":203.36435016219514,"bop":163884.77572094364},{"b":"PlatedBench.visitorTransformDeep","p":"n=512","ns":4360.823956108268,"ns_err":80.46806159207263,"bop":20496.445294395515},{"b":"PlatedBench.visitorTransformDeep","p":"n=64","ns":484.5290449319847,"ns_err":3.998956506107942,"bop":2576.0093947764803},{"b":"PlatedBench.visitorTransformExpr","p":"n=4096","ns":61466.377388131,"ns_err":175.977293276588,"bop":360468.7418024022},{"b":"PlatedBench.visitorTransformExpr","p":"n=512","ns":7196.949734538037,"ns_err":17.79385678633959,"bop":45032.7349860503},{"b":"PlatedBench.visitorTransformExpr","p":"n=64","ns":938.6180604946396,"ns_err":3.6367246297561446,"bop":5608.018192020036},{"b":"PlatedBench.visitorUniverseDeep","p":"n=4096","ns":52905.90871891466,"ns_err":213.79550066241586,"bop":196702.50836193582},{"b":"PlatedBench.visitorUniverseDeep","p":"n=512","ns":6432.069553032737,"ns_err":20.494715992704776,"bop":24632.660322204574},{"b":"PlatedBench.visitorUniverseDeep","p":"n=64","ns":662.7953651438788,"ns_err":1.322149460205852,"bop":3128.012865899585},{"b":"PlatedBench.visitorUniverseExpr","p":"n=4096","ns":46975.40673394225,"ns_err":178.3496753342083,"bop":196650.19418665115},{"b":"PlatedBench.visitorUniverseExpr","p":"n=512","ns":5799.41520224368,"ns_err":32.794239660806866,"bop":24584.601660740307},{"b":"PlatedBench.visitorUniverseExpr","p":"n=64","ns":680.9757785569552,"ns_err":8.84080744775357,"bop":3080.013358249448},{"b":"PlatedBench.visitorUniverseJson","p":"n=4096","ns":111846.99170991954,"ns_err":12983.862028494957,"bop":299674.55265153944},{"b":"PlatedBench.visitorUniverseJson","p":"n=512","ns":18126.1697496019,"ns_err":1237.617678093995,"bop":42313.85126771556},{"b":"PlatedBench.visitorUniverseJson","p":"n=64","ns":1670.9341940092631,"ns_err":82.82312032973257,"bop":4424.032385686171},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=1024","ns":10606.220659187644,"ns_err":32.35106220233312,"bop":41413.00693175626},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=16","ns":180.34237539028229,"ns_err":1.1817116672482795,"bop":1088.0025558263492},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=256","ns":2462.546868706415,"ns_err":13.848803177847465,"bop":10688.394442469993},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=4","ns":91.49769443722899,"ns_err":0.18664475256834323,"bop":608.0008771635021},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=4096","ns":42276.874446650145,"ns_err":1158.183241883737,"bop":164356.8726317051},{"b":"PowerSeriesBench.eoModify_powerEach","p":"size=64","ns":656.9560498185612,"ns_err":12.488590326761477,"bop":3008.0219907386113},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=1024","ns":50383.380954879714,"ns_err":666.189236797006,"bop":279426.22371601744},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=16","ns":595.1122556889691,"ns_err":2.3721340816489103,"bop":3720.0083180243396},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=256","ns":18151.167311634388,"ns_err":91.2765368819652,"bop":107330.79837305163},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=4","ns":167.23109102535028,"ns_err":1.604077553863639,"bop":1176.0016195367398},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=4096","ns":176221.19572923408,"ns_err":2120.920278188584,"bop":967838.9626928413},{"b":"PowerSeriesBench.monocle_powerEach","p":"size=64","ns":2226.2215098376087,"ns_err":11.797589817044582,"bop":14514.737195098085},{"b":"PowerSeriesBench.naive_powerEach","p":"size=1024","ns":5284.507749203545,"ns_err":182.85114472134214,"bop":28730.504344783116},{"b":"PowerSeriesBench.naive_powerEach","p":"size=16","ns":84.70463844257118,"ns_err":0.8773932517473406,"bop":504.00121978816856},{"b":"PowerSeriesBench.naive_powerEach","p":"size=256","ns":1246.1259250160927,"ns_err":5.715176421032377,"bop":7224.19985312213},{"b":"PowerSeriesBench.naive_powerEach","p":"size=4","ns":26.205982241265907,"ns_err":0.17059860240628133,"bop":168.00025741029268},{"b":"PowerSeriesBench.naive_powerEach","p":"size=4096","ns":20329.723266122204,"ns_err":97.90569576725031,"bop":114777.12217090532},{"b":"PowerSeriesBench.naive_powerEach","p":"size=64","ns":318.36205510725097,"ns_err":2.306263976616888,"bop":1848.0106878746267},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=1024","ns":51294.51991706479,"ns_err":907.4739757367763,"bop":210560.04338370918},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=16","ns":1103.2993984457726,"ns_err":34.066788030315294,"bop":4792.041143448354},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=256","ns":14889.849251161113,"ns_err":308.1920232328189,"bop":53729.41010860919},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=4","ns":527.3342355286406,"ns_err":10.990303195418479,"bop":2240.0096245111886},{"b":"PowerSeriesNestedBench.eoModify_nested","p":"size=64","ns":4018.275637454422,"ns_err":424.3796214469332,"bop":14640.461058715648},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=1024","ns":207300.72331659435,"ns_err":2134.226840096344,"bop":1118777.4009930408},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=16","ns":2611.977816758438,"ns_err":91.61862076931425,"bop":15749.427328613288},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=256","ns":75908.39254857617,"ns_err":723.9999173839926,"bop":430204.4767304199},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=4","ns":1026.8005990845002,"ns_err":52.15823558348969,"bop":5557.352106596101},{"b":"PowerSeriesNestedBench.monocle_nested","p":"size=64","ns":9280.450970822421,"ns_err":95.79278085699848,"bop":58859.67747128709},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=1024","ns":19638.767056038258,"ns_err":112.70643775464315,"bop":115067.76202240384},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=16","ns":353.783349710068,"ns_err":6.146346515965528,"bop":2136.013353212029},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=256","ns":4959.003413469008,"ns_err":67.88609695656088,"bop":29019.13714356317},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=4","ns":126.78798321961587,"ns_err":1.0085150855543634,"bop":792.0023877964219},{"b":"PowerSeriesNestedBench.naive_nested","p":"size=64","ns":1247.3358707303462,"ns_err":23.939362640200084,"bop":7512.143861232034},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=128","ns":1141.5154606420015,"ns_err":17.63178560579745,"bop":4816.06614933129},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=2048","ns":19348.974733813757,"ns_err":231.58329851976032,"bop":104672.00283461661},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=32","ns":276.72375863252455,"ns_err":2.828415556805161,"bop":1360.0055431800718},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=512","ns":4936.7495469931755,"ns_err":51.639730654508696,"bop":24785.354875912755},{"b":"PowerSeriesPrismBench.eoModify_sparse","p":"size=8","ns":92.00863829907462,"ns_err":1.1570034467095314,"bop":496.0009899329322},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=128","ns":4281.415984545027,"ns_err":34.82923859111885,"bop":27808.215199500966},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=2048","ns":94378.54295140228,"ns_err":1613.7170478465666,"bop":523141.32531449624},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=32","ns":1104.91530057942,"ns_err":8.499318603452554,"bop":7032.020295917604},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=512","ns":29093.439623834718,"ns_err":401.2731884501242,"bop":166681.56036593096},{"b":"PowerSeriesPrismBench.monocle_sparse","p":"size=8","ns":322.26468046281366,"ns_err":7.615168402616516,"bop":1952.0033753993239},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=128","ns":277.85022540744126,"ns_err":4.793437834185022,"bop":1568.0169337916766},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=2048","ns":4417.856313237893,"ns_err":47.28008899496998,"bop":24611.797620001933},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=32","ns":72.64293844178496,"ns_err":0.486944061830035,"bop":416.0015231381248},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=512","ns":1167.7502876573462,"ns_err":13.439196358693788,"bop":6176.335055854935},{"b":"PowerSeriesPrismBench.naive_sparse","p":"size=8","ns":20.37223170536956,"ns_err":0.2884972302918482,"bop":128.0002282052518},{"b":"PrismBench.eoGetOptionAbsent","p":"-","ns":0.6808654573148005,"ns_err":0.004818819058101664,"bop":4.753763597422299e-06},{"b":"PrismBench.eoGetOptionPresent","p":"-","ns":0.6833713565364198,"ns_err":0.011985549666389999,"bop":4.778622333264533e-06},{"b":"PrismBench.eoGetRightAbsent","p":"-","ns":0.7828696327712013,"ns_err":0.005236322015841238,"bop":5.477635225292848e-06},{"b":"PrismBench.eoGetRightPresent","p":"-","ns":2.443090445056353,"ns_err":0.023348549409937774,"bop":16.000017202873668},{"b":"PrismBench.eoReverseGet","p":"-","ns":2.4068384062818238,"ns_err":0.029786866445935565,"bop":16.000016923146},{"b":"PrismBench.eoRightReverseGet","p":"-","ns":2.4190710019255475,"ns_err":0.011701021155758592,"bop":16.000017030380523},{"b":"PrismBench.mGetOptionAbsent","p":"-","ns":0.781744483137644,"ns_err":0.010607835743826106,"bop":5.457891228587297e-06},{"b":"PrismBench.mGetOptionPresent","p":"-","ns":0.7732156814075745,"ns_err":0.008420234846242524,"bop":5.393526911188697e-06},{"b":"PrismBench.mGetRightAbsent","p":"-","ns":0.8553402100659748,"ns_err":0.0011681392149993496,"bop":5.979168792466504e-06},{"b":"PrismBench.mGetRightPresent","p":"-","ns":2.500850335766678,"ns_err":0.010969879616040033,"bop":16.00001762162636},{"b":"PrismBench.mReverseGet","p":"-","ns":2.419181482825472,"ns_err":0.04319194494565606,"bop":16.00001703585964},{"b":"PrismBench.mRightReverseGet","p":"-","ns":2.3939362096487424,"ns_err":0.009971473721755487,"bop":16.000016822697553},{"b":"ReviewBench.eoReverseGet_0","p":"-","ns":3.4797858722028416,"ns_err":0.01863460627004622,"bop":24.000024512168707},{"b":"ReviewBench.eoReverseGet_3","p":"-","ns":13.183617982653894,"ns_err":0.10541438322320472,"bop":72.00009289615238},{"b":"ReviewBench.eoReverseGet_6","p":"-","ns":22.674991309332793,"ns_err":0.3924349445289177,"bop":120.00015948777094},{"b":"ReviewBench.naiveBuild_0","p":"-","ns":3.4650872275271847,"ns_err":0.018628324155717024,"bop":24.000024372243907},{"b":"ReviewBench.naiveBuild_3","p":"-","ns":10.27279214963994,"ns_err":0.4100728543494014,"bop":72.00007234095496},{"b":"ReviewBench.naiveBuild_6","p":"-","ns":16.682273656435672,"ns_err":0.10008592818748907,"bop":120.00011740854457},{"b":"SchemesBench.drosteAna","p":"-","ns":51618.56955223068,"ns_err":441.658586465154,"bop":327632.3650133462},{"b":"SchemesBench.drosteCata","p":"-","ns":31011.124123970792,"ns_err":162.45194948385944,"bop":164824.2193558092},{"b":"SchemesBench.drosteHylo","p":"-","ns":52346.1926802206,"ns_err":987.2359827151422,"bop":328640.37026360823},{"b":"SchemesBench.eoAna","p":"-","ns":97638.06867226308,"ns_err":1816.4185394913552,"bop":589712.6934195451},{"b":"SchemesBench.eoCata","p":"-","ns":56898.66437371466,"ns_err":493.7679386776317,"bop":197568.40459451836},{"b":"SchemesBench.eoHylo","p":"-","ns":66291.1666121239,"ns_err":853.8110584009711,"bop":295848.47103469353},{"b":"SchemesBench.handAna","p":"-","ns":27962.202378018377,"ns_err":236.11110570260675,"bop":163816.19779279642},{"b":"SchemesBench.handCata","p":"-","ns":12707.086723819404,"ns_err":129.9534954072819,"bop":0.08883901538872586},{"b":"SchemesBench.handHylo","p":"-","ns":10531.070614175578,"ns_err":379.52934363303194,"bop":0.07368458747864547},{"b":"SetterBench.eoModify_0","p":"-","ns":3.3999888765290813,"ns_err":0.009955817180628327,"bop":24.000023912773194},{"b":"SetterBench.eoModify_3","p":"-","ns":11.412138581723399,"ns_err":0.12298698677387776,"bop":72.00008038973624},{"b":"SetterBench.eoModify_6","p":"-","ns":20.172966436110528,"ns_err":0.25014562337561247,"bop":120.00014184490144},{"b":"SetterBench.eoModify_orderId","p":"-","ns":5.434992867558035,"ns_err":0.055027348108461126,"bop":40.000038263008456},{"b":"SetterBench.mModify_0","p":"-","ns":3.4356676999577416,"ns_err":0.03608849211087385,"bop":24.000024179965255},{"b":"SetterBench.mModify_3","p":"-","ns":26.632427462752915,"ns_err":0.14672492395675607,"bop":168.00018760796846},{"b":"SetterBench.mModify_6","p":"-","ns":49.492413044186,"ns_err":0.44923686607282115,"bop":288.0003482117694},{"b":"SetterBench.mModify_orderId","p":"-","ns":5.434862571851147,"ns_err":0.023828855185821157,"bop":40.0000382598171},{"b":"TraversalBench.eoFoldNested","p":"size=512","ns":4674.9052529374985,"ns_err":52.64499484387869,"bop":20200.742122953765},{"b":"TraversalBench.eoFoldNested","p":"size=64","ns":534.345300808947,"ns_err":9.175376748875372,"bop":2680.013575185786},{"b":"TraversalBench.eoFoldNested","p":"size=8","ns":54.1609280491908,"ns_err":6.876903194158811,"bop":360.00051465093134},{"b":"TraversalBench.eoFoldPrices","p":"size=512","ns":1986.1571645877816,"ns_err":42.88084505532365,"bop":12312.315388266721},{"b":"TraversalBench.eoFoldPrices","p":"size=64","ns":221.194508039552,"ns_err":4.457841407636116,"bop":1560.0056191218152},{"b":"TraversalBench.eoFoldPrices","p":"size=8","ns":30.144179665667284,"ns_err":0.15449491389258369,"bop":216.00028646179643},{"b":"TraversalBench.eoModify","p":"size=512","ns":7270.328219177524,"ns_err":69.44723985079848,"bop":36897.15821760198},{"b":"TraversalBench.eoModify","p":"size=64","ns":815.7829754766497,"ns_err":14.172395650490476,"bop":4640.020731365622},{"b":"TraversalBench.eoModify","p":"size=8","ns":97.68401438271971,"ns_err":1.9982681133378375,"bop":608.00093501476},{"b":"TraversalBench.mFoldPrices","p":"size=512","ns":27737.522921192438,"ns_err":201.94981663889266,"bop":162564.40466689496},{"b":"TraversalBench.mFoldPrices","p":"size=64","ns":2355.37877248261,"ns_err":9.3652388361877,"bop":15408.059842553115},{"b":"TraversalBench.mFoldPrices","p":"size=8","ns":356.13055145748615,"ns_err":4.7510944149904235,"bop":2000.0034371620388},{"b":"TraversalBench.mModify","p":"size=512","ns":30282.138079620443,"ns_err":220.093910487808,"bop":176888.13453185649},{"b":"TraversalBench.mModify","p":"size=64","ns":2192.5706120061486,"ns_err":21.41819185841829,"bop":14408.05575651579},{"b":"TraversalBench.mModify","p":"size=8","ns":309.94186125976887,"ns_err":4.628657401621374,"bop":1896.0029523184357},{"b":"ZioDiBench.eoDrillGet","p":"-","ns":7.406515665671472,"ns_err":0.03843204267534252,"bop":5.17738573636178e-05},{"b":"ZioDiBench.eoDrillModify","p":"-","ns":86.43843658943734,"ns_err":0.9469505729291087,"bop":472.0006081408301},{"b":"ZioDiBench.eoServiceGet","p":"-","ns":4.072998954063298,"ns_err":0.005661022596082343,"bop":2.848081107890681e-05},{"b":"ZioDiBench.eoServiceReplace","p":"-","ns":75.29060615280387,"ns_err":3.832619371908593,"bop":400.0005296896501},{"b":"ZioDiBench.handDrillGet","p":"-","ns":17.49844754946692,"ns_err":0.14382888465815968,"bop":120.00012296399571},{"b":"ZioDiBench.handDrillModify","p":"-","ns":94.32847843056705,"ns_err":0.3725900913665882,"bop":592.0006636568232},{"b":"ZioDiBench.handServiceGet","p":"-","ns":17.470150282473977,"ns_err":0.30263570004702045,"bop":120.00012304905773},{"b":"ZioDiBench.handServiceReplace","p":"-","ns":84.24304041962492,"ns_err":0.2056113487175212,"bop":520.0005923448742}]} From fa4dd5b2bbe9606dc056bee7c3d452f1822d39d7 Mon Sep 17 00:00:00 2001 From: Rodolfo Hansen Date: Mon, 5 Oct 2026 17:36:31 -0400 Subject: [PATCH 4/4] =?UTF-8?q?feat(core)=20PROTOTYPE:=20IndexedGlass=20?= =?UTF-8?q?=E2=80=94=20product-indexed=20split/rebuild=20optic=20(full-gri?= =?UTF-8?q?d=20composition)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Standalone spike for the grate re-design (docs/research/2026-10-05-multifocus-redesign.md SS5 phase 1). Composition yields index (I, J) and context (Ctx, I => inner.Ctx): no C =:= D evidence, no index-== addressing, no SameFocus-style witness. Grate alias = Context = Unit case (not yet composition-closed — normalization is an open item). GlassSpec: 10 examples / 505 expectations covering arbitrary tabulations, 3-level associativity, type-changing composition through a non-inline generic helper, permuted/empty/Unit/NaN/signed-zero indexes, and the explicit full-grid vs diagonal semantic change. --- .../dev/constructive/eo/data/Glass.scala | 109 +++++++ .../scala/dev/constructive/eo/GlassSpec.scala | 303 ++++++++++++++++++ .../2026-10-05-multifocus-redesign.md | 9 + 3 files changed, 421 insertions(+) create mode 100644 core/src/main/scala/dev/constructive/eo/data/Glass.scala create mode 100644 core/src/test/scala/dev/constructive/eo/GlassSpec.scala diff --git a/core/src/main/scala/dev/constructive/eo/data/Glass.scala b/core/src/main/scala/dev/constructive/eo/data/Glass.scala new file mode 100644 index 00000000..21a7d61f --- /dev/null +++ b/core/src/main/scala/dev/constructive/eo/data/Glass.scala @@ -0,0 +1,109 @@ +package dev.constructive.eo +package data + +import cats.Representable + +/** Standalone prototype of a fixed-index, context-carrying optic. It deliberately does not use + * `Optic`, `MultiFocus`, or `AssociativeFunctor`. + * + * A lawful monomorphic glass is an isomorphism `S <-> (Context, I => A)`: rebuilding a split + * recovers the source, and splitting a rebuild recovers the context and the supplied tabulation + * pointwise, including tabulations not obtained from a split. Polymorphic glasses require the + * corresponding target-side decomposition to state the second law. Context equality, like function + * equality, is observational; it need not be Scala `==`. + * + * Implementations and tabulations must be pure. Composition derives inner contexts lazily at each + * outer index, with no enumeration, coordinate comparison, sampling, or memoization. An empty + * index is therefore valid. The laws are obligations on constructors, not enforced by this trait's + * types. + */ +trait IndexedGlass[S, T, A, B, I]: + outer => + + type Context + + def split(s: S): (Context, I => A) + + def rebuild(context: Context, values: I => B): T + + /** Read one coordinate. This is not a single-coordinate setter: arbitrary indexes do not come + * with a notion of coordinate equality. + */ + def at(i: I): S => A = s => split(s)._2(i) + + /** Rewrite every coordinate, preserving the context returned by this source's split. */ + def modify(f: (I, A) => B): S => T = s => + val (context, values) = split(s) + rebuild(context, i => f(i, values(i))) + + /** Broadcast to the whole index space, including every coordinate of a composed grid. */ + def replace(value: B): S => T = s => + val (context, _) = split(s) + rebuild(context, _ => value) + + /** Full-grid composition. Index and context reassociation, rather than literal type equality, + * relate the two groupings of a three-level composition. Unit axes are not normalized away. + * + * Round-trip proof for lawful monomorphic components: write `outer.split(s) = (x, a)` and + * `inner.split(a(i)) = (y(i), c(i))`. Rebuilding the split gives + * `outer.rebuild(x, i => inner.rebuild(y(i), c(i))) = outer.rebuild(x, a) = s`. Conversely, for + * ANY `(x, y)` and grid `w`, rebuilding uses rows `b(i) = inner.rebuild(y(i), j => w((i, j)))`. + * The outer law recovers `(x, b)`; the inner law recovers `(y(i), j => w((i, j)))` at every `i`, + * so the composite recovers `((x, y), w)`. No context obtained from an earlier grid is cached. + * Both three-level groupings rebuild as + * `outer.rebuild(x, i => middle.rebuild(y(i), j => inner.rebuild(z(i,j), k => w(i,j,k))))`; + * their splits recover the same three contexts and focus pointwise after reassociation. The same + * argument applies to paired source/target algebras for polymorphic composition. + */ + def andThen[C, D, J]( + inner: IndexedGlass[A, B, C, D, J] + ): IndexedGlass.Aux[S, T, C, D, (I, J), (outer.Context, I => inner.Context)] = + new IndexedGlass[S, T, C, D, (I, J)]: + type Context = (outer.Context, I => inner.Context) + + def split(s: S): (Context, ((I, J)) => C) = + val (context, values) = outer.split(s) + val rows: I => (inner.Context, J => C) = i => inner.split(values(i)) + ((context, i => rows(i)._1), ij => rows(ij._1)._2(ij._2)) + + def rebuild(context: Context, values: ((I, J)) => D): T = + outer.rebuild(context._1, i => inner.rebuild(context._2(i), j => values((i, j)))) + +object IndexedGlass: + + type Aux[S, T, A, B, I, X] = IndexedGlass[S, T, A, B, I] { type Context = X } + + /** The context-free specialization. Generic `andThen` retains its product context even when both + * inputs have Unit context; no context-erasing coercion is installed in this prototype. + * Context-sensitive collection/zip operations are deliberately absent from the general API. + */ + type Grate[S, T, A, B, I] = Aux[S, T, A, B, I, Unit] + + /** User-written split/rebuild algebra. The caller is responsible for the laws above. */ + def apply[S, T, A, B, I, X](decompose: S => (X, I => A))( + assemble: (X, I => B) => T, + ): Aux[S, T, A, B, I, X] = + new IndexedGlass[S, T, A, B, I]: + type Context = X + def split(s: S): (X, I => A) = decompose(s) + def rebuild(context: X, values: I => B): T = assemble(context, values) + + /** A cats Representable supplies precisely the two inverse tabulation operations needed here. + * Passed explicitly so its path-dependent Representation is retained without another given. + */ + def representable[F[_], A, B](r: Representable[F]): Grate[F[A], F[B], A, B, r.Representation] = + IndexedGlass[F[A], F[B], A, B, r.Representation, Unit](s => ((), r.index(s)))((_, values) => + r.tabulate(values), + ) + + /** An Iso has one coordinate, not a broadcast over an arbitrary (possibly empty) index. The + * functions must be inverse in the monomorphic case, or have matching target-side inverses in + * the polymorphic case. + */ + def iso[S, T, A, B](forward: S => A)(backward: B => T): Grate[S, T, A, B, Unit] = + IndexedGlass[S, T, A, B, Unit, Unit](s => ((), _ => forward(s)))((_, values) => + backward(values(())), + ) + + /** Identity algebra on a single Unit coordinate, including type-changing writes. */ + def unit[A, B]: Grate[A, B, A, B, Unit] = iso[A, B, A, B](identity)(identity) diff --git a/core/src/test/scala/dev/constructive/eo/GlassSpec.scala b/core/src/test/scala/dev/constructive/eo/GlassSpec.scala new file mode 100644 index 00000000..39c924cb --- /dev/null +++ b/core/src/test/scala/dev/constructive/eo/GlassSpec.scala @@ -0,0 +1,303 @@ +package dev.constructive.eo + +import scala.compiletime.testing.typeChecks + +import cats.instances.function.given +import cats.{Functor, Representable} +import org.scalacheck.Cogen +import org.scalacheck.Prop.forAll +import org.specs2.ScalaCheck +import org.specs2.mutable.Specification + +import data.IndexedGlass + +object GlassFixtures: + type Pair[A] = (A, A) + type Tagged[A] = (String, Pair[A]) + + val pairRepresentation: Representable.Aux[Pair, Boolean] = new Representable[Pair]: + type Representation = Boolean + def F: Functor[Pair] = new Functor[Pair]: + def map[A, B](fa: Pair[A])(f: A => B): Pair[B] = (f(fa._1), f(fa._2)) + def index[A](fa: Pair[A]): Boolean => A = i => if i then fa._2 else fa._1 + def tabulate[A](f: Boolean => A): Pair[A] = (f(false), f(true)) + + def pair[A, B]: IndexedGlass.Grate[Pair[A], Pair[B], A, B, Boolean] = + IndexedGlass.representable[Pair, A, B](pairRepresentation) + + def tagged[A, B]: IndexedGlass.Aux[Tagged[A], Tagged[B], A, B, Boolean, String] = + IndexedGlass[Tagged[A], Tagged[B], A, B, Boolean, String](s => + (s._1, pairRepresentation.index(s._2)), + )((context, values) => (context, pairRepresentation.tabulate(values))) + + enum Slot: + case First, Second, Third + + given Cogen[Slot] = Cogen[Int].contramap(_.ordinal) + + case class Tri[A](a: A, b: A, c: A) + + val permutedRepresentation: Representable.Aux[Tri, Slot] = new Representable[Tri]: + type Representation = Slot + def F: Functor[Tri] = new Functor[Tri]: + def map[A, B](fa: Tri[A])(f: A => B): Tri[B] = Tri(f(fa.a), f(fa.b), f(fa.c)) + def index[A](fa: Tri[A]): Slot => A = + case Slot.First => fa.c + case Slot.Second => fa.a + case Slot.Third => fa.b + def tabulate[A](f: Slot => A): Tri[A] = Tri(f(Slot.Second), f(Slot.Third), f(Slot.First)) + +/** Executable laws for the standalone prototype. Generated functions are user-written tabulations, + * not functions extracted from a split. Function/context equality is checked pointwise; the + * Boolean grids and Slot domain are enumerated completely. Infinite/Double domains can only be + * probed finitely here and remain an equational proof obligation. + */ +class GlassSpec extends Specification with ScalaCheck: + import GlassFixtures.* + + private val bits = List(false, true) + private val grid = for i <- bits; j <- bits yield (i, j) + private val cube = for i <- bits; j <- bits; k <- bits yield (i, j, k) + + private def agrees[I, A](actual: I => A, expected: I => A, indexes: List[I]): Boolean = + indexes.forall(i => actual(i) == expected(i)) + + "Representable: both round trips on arbitrary tabulations, identity and indexed modification composition" >> { + val g = pair[Int, Int] + forAll { (a: Int, b: Int, written: Boolean => Int) => + val source = (a, b) + val (context, values) = g.split(source) + val (newContext, readBack) = g.split(g.rebuild((), written)) + val first: (Boolean, Int) => Int = (i, n) => if i then n + 3 else n - 1 + val second: (Boolean, Int) => Int = (i, n) => if i then n * 2 else -n + g.rebuild(context, values) == source && + newContext == () && agrees(readBack, written, bits) && + g.modify((_, n) => n)(source) == source && + g.modify(second)(g.modify(first)(source)) == + g.modify((i, n) => second(i, first(i, n)))(source) + } + } + + "Nested pair composition reads and replaces the full grid, NOT the legacy diagonal" >> { + val g = pair[Pair[Int], Pair[Int]].andThen(pair[Int, Int]) + val source = ((1, 2), (3, 4)) + val (context, values) = g.split(source) + val expectedRead: ((Boolean, Boolean)) => Int = ij => + val row = if ij._1 then source._2 else source._1 + if ij._2 then row._2 else row._1 + agrees(values, expectedRead, grid) must beTrue + g.rebuild(context, values) must beEqualTo(source) + g.modify((_, n) => n)(source) must beEqualTo(source) + g.replace(9)(source) must beEqualTo(((9, 9), (9, 9))) + g.replace(9)(source) must not(beEqualTo(((9, 2), (3, 9)))) + g.at((false, true))(source) must beEqualTo(2) + g.at((true, false))(source) must beEqualTo(3) + g.modify((ij, n) => n + (if ij._1 then 100 else 0) + (if ij._2 then 10 else 0))( + source + ) must beEqualTo( + ((1, 12), (103, 114)), + ) + } + + "Full-grid split after rebuild accepts arbitrary writes rather than only a split's own values" >> { + val g = pair[Pair[Int], Pair[Int]].andThen(pair[Int, Int]) + forAll { (a: Int, b: Int, c: Int, d: Int, written: ((Boolean, Boolean)) => Int) => + val source = ((a, b), (c, d)) + val (context, values) = g.split(source) + val (afterContext, afterValues) = g.split(g.rebuild(context, written)) + g.rebuild(context, values) == source && + afterContext._1 == context._1 && bits.forall(i => afterContext._2(i) == context._2(i)) && + agrees(afterValues, written, grid) && + g.rebuild(context, written) == + ( + (written((false, false)), written((false, true))), + (written((true, false)), written((true, true))) + ) + } + } + + "User-defined contexts survive both round trips, including arbitrary contexts and grids" >> { + val g = tagged[Tagged[Int], Tagged[Int]].andThen(tagged[Int, Int]) + forAll { + (outerTag: String, innerTags: Boolean => String, written: ((Boolean, Boolean)) => Int) => + val context: g.Context = (outerTag, innerTags) + val expected: Tagged[Tagged[Int]] = + ( + outerTag, + ( + (innerTags(false), (written((false, false)), written((false, true)))), + (innerTags(true), (written((true, false)), written((true, true)))) + ) + ) + val built = g.rebuild(context, written) + val (afterContext, afterValues) = g.split(built) + val (sourceContext, sourceValues) = g.split(expected) + built == expected && g.rebuild(sourceContext, sourceValues) == expected && + afterContext._1 == outerTag && agrees(afterContext._2, innerTags, bits) && + agrees(afterValues, written, grid) + } + } + + "Three-level associativity re-associates indexes AND non-Unit contexts on arbitrary writes" >> { + val outer = tagged[Tagged[Tagged[Int]], Tagged[Tagged[Int]]] + val middle = tagged[Tagged[Int], Tagged[Int]] + val inner = tagged[Int, Int] + val left = outer.andThen(middle).andThen(inner) + val right = outer.andThen(middle.andThen(inner)) + forAll { + ( + root: String, + rows: Boolean => String, + cells: ((Boolean, Boolean)) => String, + written: ((Boolean, Boolean, Boolean)) => Int + ) => + val leftContext: left.Context = ((root, rows), cells) + val rightContext: right.Context = (root, i => (rows(i), j => cells((i, j)))) + val leftValues: (((Boolean, Boolean), Boolean)) => Int = + ijk => written((ijk._1._1, ijk._1._2, ijk._2)) + val rightValues: ((Boolean, (Boolean, Boolean))) => Int = + ijk => written((ijk._1, ijk._2._1, ijk._2._2)) + val builtLeft = left.rebuild(leftContext, leftValues) + val builtRight = right.rebuild(rightContext, rightValues) + val (lc, lv) = left.split(builtLeft) + val (rc, rv) = right.split(builtRight) + builtLeft == builtRight && left.rebuild(lc, lv) == builtLeft && + right.rebuild(rc, rv) == builtRight && + lc._1._1 == root && rc._1 == root && + bits.forall(i => lc._1._2(i) == rows(i) && rc._2(i)._1 == rows(i)) && + grid.forall(ij => lc._2(ij) == cells(ij) && rc._2(ij._1)._2(ij._2) == cells(ij)) && + cube.forall { + case (i, j, k) => + lv(((i, j), k)) == written((i, j, k)) && rv((i, (j, k))) == written((i, j, k)) + } && + left.modify((_, n) => n + 1)(builtLeft) == right.modify((_, n) => n + 1)(builtRight) && + left.replace(9)(builtLeft) == right.replace(9)(builtRight) + } + } + + "Type-changing intermediate and final writes are full-grid and route/grouping independent" >> { + val outer = pair[Pair[Int], Pair[String]] + val inner = pair[Int, String] + val toStringFocus = IndexedGlass.iso[Int, String, Int, Long](identity)(_.toString) + val left = outer.andThen(inner).andThen(toStringFocus) + val right = outer.andThen(inner.andThen(toStringFocus)) + // A non-inline generic helper has no same-focus evidence, and needs none. + def compose[S, T, A, B, C, D, I, J]( + o: IndexedGlass[S, T, A, B, I], + in: IndexedGlass[A, B, C, D, J], + ) = o.andThen(in) + val generic = compose(outer, inner) + val source = ((1, 2), (3, 4)) + val expected = (("11", "12"), ("13", "14")) + left.modify((_, n) => n.toLong + 10)(source) must beEqualTo(expected) + right.modify((_, n) => n.toLong + 10)(source) must beEqualTo(expected) + generic.modify((_, n) => (n + 10).toString)(source) must beEqualTo(expected) + // The polymorphic round trip is stated with the matching target-side split. + val polymorphic = outer.andThen(inner) + val (context, _) = polymorphic.split(source) + val written: ((Boolean, Boolean)) => String = ij => s"${ij._1}/${ij._2}" + val rebuilt = polymorphic.rebuild(context, written) + val target = pair[Pair[String], Pair[String]].andThen(pair[String, String]) + agrees(target.split(rebuilt)._2, written, grid) must beTrue + } + + "Representable keeps a permuted index order, including when nested" >> { + val g = IndexedGlass.representable[Tri, Int, Int](permutedRepresentation) + val nested = IndexedGlass + .representable[Tri, Pair[Int], Pair[Int]](permutedRepresentation) + .andThen(pair[Int, Int]) + forAll { (a: Int, b: Int, c: Int, written: Slot => Int) => + val source = Tri(a, b, c) + val (context, values) = g.split(source) + val rebuilt = g.rebuild((), written) + g.rebuild(context, values) == source && + agrees(g.split(rebuilt)._2, written, Slot.values.toList) && + rebuilt == Tri(written(Slot.Second), written(Slot.Third), written(Slot.First)) && + nested.at((Slot.First, false))(Tri((a, b), (b, c), (c, a))) == c + } + } + + "Iso and Unit specializations have one coordinate and compose in either direction" >> { + val single = IndexedGlass.unit[Int, Int] + val iso = IndexedGlass.iso[(String, Int), (String, Int), (Int, String), (Int, String)](s => + (s._2, s._1), + )(a => (a._2, a._1)) + val source = ("kept", 2) + val (context, values) = iso.split(source) + iso.rebuild(context, values) must beEqualTo(source) + val userWrite: Unit => (Int, String) = _ => (9, "new") + iso.split(iso.rebuild((), userWrite))._2(()) must beEqualTo(userWrite(())) + single.at(())(3) must beEqualTo(3) + single.rebuild((), _ => 9) must beEqualTo(9) + pair[Int, Int].andThen(single).modify((_, n) => n + 1)((1, 2)) must beEqualTo((2, 3)) + IndexedGlass + .unit[Pair[Int], Pair[Int]] + .andThen(pair[Int, Int]) + .modify((_, n) => n + 1)((1, 2)) must beEqualTo((2, 3)) + typeChecks(""" + import dev.constructive.eo.data.IndexedGlass + val g: IndexedGlass.Grate[Int, String, Int, String, Unit] = IndexedGlass.unit[Int, String] + val result: String = g.replace("ok")(1) + """) must beTrue + } + + "Empty and singleton index spaces require no inhabitant or representative witness" >> { + type Empty[A] = Nothing => A + type Single[A] = Unit => A + val empty = IndexedGlass.representable[Empty, Int, Int](summon[Representable[Empty]]) + val single = IndexedGlass.representable[Single, Int, Int](summon[Representable[Single]]) + val source: Empty[Int] = identity[Nothing] + val written: Empty[Int] = identity[Nothing] + val (context, values) = empty.split(source) + // All functions from Nothing are extensionally equal: there is no coordinate to probe. + val recovered: Empty[Int] = empty.rebuild(context, values) + val rewritten: Empty[Int] = empty.replace(9)(recovered) + val splitAgain = empty.split(empty.rebuild((), written)) + splitAgain._1 must beEqualTo(()) + val emptyInner = pair[Empty[Int], Empty[Int]].andThen(empty) + val emptyOuter = IndexedGlass + .representable[Empty, Pair[Int], Pair[Int]](summon[Representable[Empty]]) + .andThen(pair[Int, Int]) + emptyInner.split(emptyInner.replace(9)((source, rewritten)))._1._1 must beEqualTo(()) + emptyOuter.split(emptyOuter.modify((_, n) => n)(identity[Nothing]))._1._1 must beEqualTo(()) + val fn: Unit => Int = _ => 42 + val (sc, sv) = single.split(fn) + single.rebuild(sc, sv)(()) must beEqualTo(42) + single.split(single.rebuild((), _ => 9))._2(()) must beEqualTo(9) + single.andThen(IndexedGlass.unit[Int, Int]).at(((), ()))(fn) must beEqualTo(42) + } + + "Double indexes preserve NaN and signed-zero observations with no coordinate-equality machinery" >> { + type Doubles[A] = Double => A + val g = IndexedGlass.representable[Doubles, Int, Int](summon[Representable[Doubles]]) + val nested = IndexedGlass + .representable[Doubles, Doubles[Int], Doubles[Int]]( + summon[Representable[Doubles]], + ) + .andThen(g) + val probes = List(Double.NaN, -0.0, 0.0, 1.0, Double.PositiveInfinity) + // Bit observations belong to this USER function, not the optic or its addressing protocol. + val classify: Double => Int = d => + if d.isNaN then 7 + else if java.lang.Double.doubleToRawLongBits(d) == Long.MinValue then 11 + else if d == 0.0 then 13 + else 17 + val source: Double => Int = classify + val (context, values) = g.split(source) + agrees(g.rebuild(context, values), source, probes) must beTrue + agrees(g.split(g.rebuild((), classify))._2, classify, probes) must beTrue + val full: ((Double, Double)) => Int = ij => 100 * classify(ij._1) + classify(ij._2) + val fn: Double => Double => Int = i => j => full((i, j)) + val (nc, nv) = nested.split(fn) + val rewritten = nested.rebuild(nc, full) + probes.forall(i => + probes.forall(j => + nv((i, j)) == full((i, j)) && rewritten(i)(j) == full((i, j)) && + nested.modify((_, n) => n)(fn)(i)(j) == fn(i)(j) && + nested.replace(9)(fn)(i)(j) == 9, + ) + ) must beTrue + nested.at((-0.0, 0.0))(fn) must beEqualTo(1113) + nested.at((0.0, -0.0))(fn) must beEqualTo(1311) + nested.at((Double.NaN, Double.NaN))(fn) must beEqualTo(707) + } diff --git a/docs/research/2026-10-05-multifocus-redesign.md b/docs/research/2026-10-05-multifocus-redesign.md index 7d4fddcb..f52a9cc7 100644 --- a/docs/research/2026-10-05-multifocus-redesign.md +++ b/docs/research/2026-10-05-multifocus-redesign.md @@ -109,6 +109,15 @@ Searched every module for `MultiFocus` / grate usage: ## 5. Phased path +0. *(done)* Phase-1 prototype landed on this branch as a standalone commit: `data/Glass.scala` + (`IndexedGlass` + `Aux` + the `Context = Unit` `Grate` alias + an equational composition + proof in scaladoc) and `GlassSpec` — round trips on arbitrary generated tabulations, + three-level associativity, type-changing composition through a **non-inline** generic helper + (the hole the witness design could not close), permuted / empty / Unit / NaN / signed-zero + indexes, and the explicit full-grid-vs-diagonal semantic statement. Open items before + integration: Unit-context normalization (`andThen` keeps `(Ctx, I => Unit)`, so `Grate` is + not yet composition-closed), and benchmarks — lazy composition repeats inner splits and + allocates contexts; full-grid and diagonal workloads must not be compared as equivalent. 1. Prototype A standalone (new file, e.g. `data/Grate.scala` or a spike package), not in #129. Port `tuple` / `representable` / `apply`-equivalents to `IndexedGlass` constructors. 2. Prove the split/rebuild and full-grid composition laws against arbitrary tabulations,