MimIR 0.1
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches
axm.cpp
Go to the documentation of this file.
1#include "mim/axm.h"
2
3#include "mim/world.h"
4
5namespace mim {
6
7Axm::Axm(NormalizeFn normalizer, u8 curry, u8 trip, const Def* type, plugin_t plugin, tag_t tag, sub_t sub)
8 : Def(Node, type, Defs{}, plugin | (flags_t(tag) << 8_u64) | flags_t(sub)) {
9 normalizer_ = normalizer;
10 curry_ = curry;
11 trip_ = trip;
12}
13
14std::pair<u8, u8> Axm::infer_curry_and_trip(const Def* type) {
15 u8 curry = 0;
16 u8 trip = 0;
17 MutSet done;
18 while (auto pi = type->isa<Pi>()) {
19 if (auto mut = pi->isa_mut()) {
20 if (auto [_, ins] = done.emplace(mut); !ins) {
21 // infer trip
22 auto curr = pi;
23 do {
24 ++trip;
25 curr = curr->codom()->as<Pi>();
26 } while (curr != mut);
27 break;
28 }
29 }
30
31 ++curry;
32 type = pi->codom();
33 }
34
35 return {curry, trip};
36}
37
38std::tuple<const Axm*, u8, u8> Axm::get(const Def* def) {
39 if (auto axm = def->isa<Axm>()) return {axm, axm->curry(), axm->trip()};
40 if (auto app = def->isa<App>()) return {app->axm(), app->curry(), app->trip()};
41 return {nullptr, 0, 0};
42}
43
44} // namespace mim
u8 trip() const
Definition axm.h:38
static std::pair< u8, u8 > infer_curry_and_trip(const Def *type)
Definition axm.cpp:14
u8 curry() const
Definition axm.h:37
static std::tuple< const Axm *, u8, u8 > get(const Def *def)
Yields currying counter of def.
Definition axm.cpp:38
Base class for all Defs.
Definition def.h:197
const Def * type() const noexcept
Yields the "raw" type of this Def (maybe nullptr).
Definition def.h:241
A dependent function type.
Definition lam.h:11
Definition ast.h:14
View< const Def * > Defs
Definition def.h:48
u8 sub_t
Definition types.h:48
u64 flags_t
Definition types.h:45
GIDSet< Def * > MutSet
Definition def.h:56
const Def *(*)(const Def *, const Def *, const Def *) NormalizeFn
Definition def.h:70
u64 plugin_t
Definition types.h:46
u8 tag_t
Definition types.h:47
uint8_t u8
Definition types.h:34
Node
Definition def.h:82