Intern a universe: if one with the same hash exists, return the existing Arc (ensuring pointer uniqueness). Otherwise insert and return.
(&mut self, u: KUniv<M>)
| 100 | /// short-circuit on members, and use it to detect non-canonical |
| 101 | /// children that must be canonicalized before the shallow key is |
| 102 | /// meaningful. |
| 103 | pub(crate) canon_exprs: FxHashSet<Addr>, |
| 104 | pub(crate) canon_univs: FxHashSet<Addr>, |
| 105 | /// Scratch buffer for `subst` / `simul_subst` per-call memoization, |
| 106 | /// keyed by `(addr, depth)`. Cleared on entry. Owned here so the |
| 107 | /// allocation persists across calls. |
| 108 | pub(crate) subst_scratch: FxHashMap<(Addr, u64), KExpr<M>>, |
| 109 | /// Scratch buffer for `lift` per-call memoization, keyed by |
| 110 | /// `(addr, cutoff)`. Cleared on entry. Separate from `subst_scratch` |
| 111 | /// because `lift` is invoked from inside `subst_cached`, and the two |