level replace_level_fn::apply(level const & l) { optional<level> r = m_f(l); if (r) return *r; switch (l.kind()) { case level_kind::Succ: return update_succ(l, apply(succ_of(l))); case level_kind::Max: case level_kind::IMax: return update_max(l, apply(to_max_core(l).m_lhs), apply(to_max_core(l).m_rhs)); case level_kind::Zero: case level_kind::Param: case level_kind::Meta: case level_kind::Global: return l; } lean_unreachable(); // LCOV_EXCL_LINE }
level apply(level const & l) { auto r = m_lvl_cache.find(l); if (r != m_lvl_cache.end()) return *r; level res; switch (l.kind()) { case level_kind::Zero: case level_kind::Param: case level_kind::Global: case level_kind::Meta: res = l; break; case level_kind::Succ: res = update_succ(l, apply(succ_of(l))); break; case level_kind::Max: res = update_max(l, apply(max_lhs(l)), apply(max_rhs(l))); break; case level_kind::IMax: res = update_max(l, apply(imax_lhs(l)), apply(imax_rhs(l))); break; } m_lvl_cache.insert(res); return res; }