10 auto& world = type->world();
11 return world.raw_app(type, callee, arg);
20 auto [c, k] = arg->
projs<2>();
24 for (
auto kv :
tuple->ops())
25 if (kv->proj(2, 0) == k)
return kv->proj(2, 1);
33 auto& w = arg->
world();
34 auto [k, c] = arg->
projs<2>();
38 for (
auto kv :
tuple->ops()) {
39 auto key =
id ==
mem::map ? kv->proj(2, 0) : kv;
40 if (key == k)
return w.lit_tt();
42 return tuple->is_closed() ? w.lit_ff() :
nullptr;
45 if (
auto pack =
init->arg()->isa_imm<
Pack>()) w.WLOG(
"packs not yet implemented: {}", pack);
54 auto& world = type->world();
55 auto [c, kv] = arg->projs<2>();
59 auto n =
init->decurry()->arg();
60 auto KV =
init->decurry()->decurry()->arg();
64 for (
size_t i = 0, e = *l; i != e; ++i) {
65 auto key =
id ==
mem::map ? kv->proj(2, 0) : kv;
66 auto kv =
tuple->proj(e, i);
67 if (kv->proj(2, 0) == k) {
69 new_ops.emplace_back(world.tuple({k, v}));
71 new_ops.emplace_back(
tuple->proj(e, i));
74 if (!updated) new_ops.emplace_back(world.tuple({k, v}));
75 return world.call(
id, KV, new_ops.size(),
Defs(new_ops));
79 if (
auto pack =
init->arg()->isa_imm<
Pack>()) w.WLOG(
"packs not yet implemented: {}", pack);
82 return world.raw_app(type, callee, arg);
static auto isa(const Def *def)
World & world() const noexcept
auto projs(F f) const
Splits this Def via Def::projections into an Array (if A == std::dynamic_extent) or std::array (other...
static std::optional< T > isa(const Def *def)
A (possibly paramterized) Tuple.
Data constructor for a Sigma.
const Def * normalize_insert(const Def *, const Def *, const Def *)
const Def * normalize_size(const Def *, const Def *, const Def *arg)
const Def * normalize_mem(const Def *, const Def *, const Def *arg)
const Def * normalize_get(const Def *, const Def *, const Def *arg)
const Def * normalize_init(const Def *type, const Def *callee, const Def *arg)
Vector< const Def * > DefVec
#define MIM_ord_NORMALIZER_IMPL