feat(library/coercion): add for_each_coercion procedure
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
a408883c92
commit
e9e61fec51
2 changed files with 74 additions and 8 deletions
|
@ -409,6 +409,37 @@ bool get_user_coercions(environment const & env, expr const & C, buffer<std::pai
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename F>
|
||||||
|
void for_each_coercion(environment const & env, F && f) {
|
||||||
|
coercion_ext const & ext = get_extension(env);
|
||||||
|
ext.m_from.for_each([&](name const & C, list<coercion_info> const & infos) {
|
||||||
|
for (auto const & info : infos) {
|
||||||
|
f(C, info);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void for_each_coercion_user(environment const & env,
|
||||||
|
std::function<void(name const &, name const &, expr const &, level_param_names const &, unsigned)> const & f) {
|
||||||
|
for_each_coercion(env, [&](name const & C, coercion_info const & info) {
|
||||||
|
if (info.m_to.kind() == coercion_class_kind::User) f(C, info.m_to.get_name(), info.m_fun, info.m_level_params, info.m_num_args);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void for_each_coercion_sort(environment const & env,
|
||||||
|
std::function<void(name const &, expr const &, level_param_names const &, unsigned)> const & f) {
|
||||||
|
for_each_coercion(env, [&](name const & C, coercion_info const & info) {
|
||||||
|
if (info.m_to.kind() == coercion_class_kind::Sort) f(C, info.m_fun, info.m_level_params, info.m_num_args);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void for_each_coercion_fun(environment const & env,
|
||||||
|
std::function<void(name const &, expr const &, level_param_names const &, unsigned)> const & f) {
|
||||||
|
for_each_coercion(env, [&](name const & C, coercion_info const & info) {
|
||||||
|
if (info.m_to.kind() == coercion_class_kind::Fun) f(C, info.m_fun, info.m_level_params, info.m_num_args);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
static int add_coercion(lua_State * L) {
|
static int add_coercion(lua_State * L) {
|
||||||
int nargs = lua_gettop(L);
|
int nargs = lua_gettop(L);
|
||||||
if (nargs == 2)
|
if (nargs == 2)
|
||||||
|
@ -453,14 +484,42 @@ static int get_user_coercions(lua_State * L) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int for_each_coercion(lua_State * L, coercion_class_kind k) {
|
||||||
|
environment env = to_environment(L, 1);
|
||||||
|
luaL_checktype(L, 2, LUA_TFUNCTION); // user-fun
|
||||||
|
for_each_coercion(env, [&](name const & C, coercion_info const & info) {
|
||||||
|
if (info.m_to.kind() != k)
|
||||||
|
return;
|
||||||
|
lua_pushvalue(L, 2); // push user-fun
|
||||||
|
push_name(L, C);
|
||||||
|
int nargs = 4;
|
||||||
|
if (info.m_to.kind() == coercion_class_kind::User) {
|
||||||
|
push_name(L, info.m_to.get_name());
|
||||||
|
nargs++;
|
||||||
|
}
|
||||||
|
push_expr(L, info.m_fun);
|
||||||
|
push_list_name(L, info.m_level_params);
|
||||||
|
push_integer(L, info.m_num_args);
|
||||||
|
pcall(L, nargs, 0, 0);
|
||||||
|
});
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int for_each_coercion_user(lua_State * L) { return for_each_coercion(L, coercion_class_kind::User); }
|
||||||
|
static int for_each_coercion_sort(lua_State * L) { return for_each_coercion(L, coercion_class_kind::Sort); }
|
||||||
|
static int for_each_coercion_fun(lua_State * L) { return for_each_coercion(L, coercion_class_kind::Fun); }
|
||||||
|
|
||||||
void open_coercion(lua_State * L) {
|
void open_coercion(lua_State * L) {
|
||||||
SET_GLOBAL_FUN(add_coercion, "add_coercion");
|
SET_GLOBAL_FUN(add_coercion, "add_coercion");
|
||||||
SET_GLOBAL_FUN(is_coercion, "is_coercion");
|
SET_GLOBAL_FUN(is_coercion, "is_coercion");
|
||||||
SET_GLOBAL_FUN(has_coercions_from, "has_coercions_from");
|
SET_GLOBAL_FUN(has_coercions_from, "has_coercions_from");
|
||||||
SET_GLOBAL_FUN(has_coercions_to, "has_coercions_to");
|
SET_GLOBAL_FUN(has_coercions_to, "has_coercions_to");
|
||||||
SET_GLOBAL_FUN(get_coercion, "get_coercion");
|
SET_GLOBAL_FUN(get_coercion, "get_coercion");
|
||||||
SET_GLOBAL_FUN(get_coercion_to_sort, "get_coercion_to_sort");
|
SET_GLOBAL_FUN(get_coercion_to_sort, "get_coercion_to_sort");
|
||||||
SET_GLOBAL_FUN(get_coercion_to_fun, "get_coercion_to_fun");
|
SET_GLOBAL_FUN(get_coercion_to_fun, "get_coercion_to_fun");
|
||||||
SET_GLOBAL_FUN(get_user_coercions, "get_user_coercions");
|
SET_GLOBAL_FUN(get_user_coercions, "get_user_coercions");
|
||||||
|
SET_GLOBAL_FUN(for_each_coercion_user, "for_each_coercion_user");
|
||||||
|
SET_GLOBAL_FUN(for_each_coercion_sort, "for_each_coercion_sort");
|
||||||
|
SET_GLOBAL_FUN(for_each_coercion_fun, "for_each_coercion_fun");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,5 +62,12 @@ optional<expr> get_coercion_to_fun(environment const & env, expr const & C);
|
||||||
*/
|
*/
|
||||||
bool get_user_coercions(environment const & env, expr const & C, buffer<std::pair<expr, name>> & result);
|
bool get_user_coercions(environment const & env, expr const & C, buffer<std::pair<expr, name>> & result);
|
||||||
|
|
||||||
|
void for_each_coercion_user(environment const & env,
|
||||||
|
std::function<void(name const &, name const &, expr const &, level_param_names const &, unsigned)> const & f);
|
||||||
|
void for_each_coercion_sort(environment const & env,
|
||||||
|
std::function<void(name const &, expr const &, level_param_names const &, unsigned)> const & f);
|
||||||
|
void for_each_coercion_fun(environment const & env,
|
||||||
|
std::function<void(name const &, expr const &, level_param_names const &, unsigned)> const & f);
|
||||||
|
|
||||||
void open_coercion(lua_State * L);
|
void open_coercion(lua_State * L);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue