Latest Results
Add Read::eclass_enodes, and scope the old name to one table (#1003)
* Add Read::eclass_enodes, and scope the old name to one table
`enodes_for_eclass` read as "the e-nodes of this e-class" but returned only the
rows of the one table it was handed, so a caller wanting an e-class's e-nodes
had to know which constructors to ask and loop over them itself.
`eclass_enodes(eclass, f)` is the method that name promised. `Enode` gained a
`name` field saying which constructor each row came from, since a caller that
did not name one cannot otherwise interpret the children or re-apply the
constructor; both existing scans fill it in.
The per-table method is now `constructor_enodes_for_eclass`, which reads as
"constructor_enodes, filtered" and matches its neighbours. It is still the one
to use when the caller knows the e-class's sort: that narrows to one probe,
where the spanning version has to ask every eq-sorted constructor. It has to,
because a Value does not say what sort it belongs to - there is no value-to-sort
map to consult, only one global id counter, which is also why probing the wrong
constructor is sound and simply finds nothing.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Do not hand the backend a table id a pop has dropped
The action registry is shared across push/pop snapshots, so it keeps
naming tables the popped e-graph no longer has. Every accessor that
resolved a name through it then indexed the backend with a dangling id
and panicked; `table_sizes` did it for the whole registry at once, so
any primitive enumerating tables crashed after a pop.
Lookups now treat a dropped table as missing and `table_sizes` skips it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* Address introspection API review
---------
Co-authored-by: Oliver Flatt <oflatt@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com> Latest Branches
-6%
oflatt-claude:eclass-enodes 0%
saulshanabrook:codex/greedy-dag-extractor 0%
oflatt-claude:docs-experimental-version-policy © 2026 CodSpeed Technology