mirror of
https://github.com/erg-lang/erg.git
synced 2025-07-15 00:55:21 +00:00
83 lines
3.6 KiB
Rust
83 lines
3.6 KiB
Rust
#[allow(unused_imports)]
|
|
use erg_common::log;
|
|
|
|
use crate::ty::constructors::*;
|
|
use crate::ty::typaram::TyParam;
|
|
use crate::ty::value::ValueObj;
|
|
use crate::ty::{Type, Visibility};
|
|
use Type::*;
|
|
|
|
use crate::context::initialize::*;
|
|
use crate::context::Context;
|
|
use crate::varinfo::Mutability;
|
|
use Mutability::*;
|
|
|
|
impl Context {
|
|
pub(super) fn init_builtin_patches(&mut self) {
|
|
let m = mono_q_tp("M", instanceof(Int));
|
|
let n = mono_q_tp("N", instanceof(Int));
|
|
let o = mono_q_tp("O", instanceof(Int));
|
|
let p = mono_q_tp("P", instanceof(Int));
|
|
let params = vec![
|
|
PS::named_nd("M", Int),
|
|
PS::named_nd("N", Int),
|
|
PS::named_nd("O", Int),
|
|
PS::named_nd("P", Int),
|
|
];
|
|
let class = Type::from(&m..=&n);
|
|
let impls = poly("Add", vec![TyParam::from(&o..=&p)]);
|
|
// Interval is a bounding patch connecting M..N and (Add(O..P, M+O..N..P), Sub(O..P, M-P..N-O))
|
|
let mut interval =
|
|
Self::builtin_poly_glue_patch("Interval", class.clone(), impls.clone(), params, 2);
|
|
let op_t = fn1_met(
|
|
class.clone(),
|
|
Type::from(&o..=&p),
|
|
Type::from(m.clone() + o.clone()..=n.clone() + p.clone()),
|
|
)
|
|
.quantify();
|
|
let mut interval_add = Self::builtin_methods(Some(impls), 2);
|
|
interval_add.register_builtin_erg_impl("__add__", op_t, Const, Visibility::BUILTIN_PUBLIC);
|
|
interval_add.register_builtin_const(
|
|
"Output",
|
|
Visibility::BUILTIN_PUBLIC,
|
|
None,
|
|
ValueObj::builtin_class(Type::from(m.clone() + o.clone()..=n.clone() + p.clone())),
|
|
);
|
|
interval.register_trait(class.clone(), interval_add);
|
|
let mut interval_sub =
|
|
Self::builtin_methods(Some(poly("Sub", vec![TyParam::from(&o..=&p)])), 2);
|
|
let op_t = fn1_met(
|
|
class.clone(),
|
|
Type::from(&o..=&p),
|
|
Type::from(m.clone() - p.clone()..=n.clone() - o.clone()),
|
|
)
|
|
.quantify();
|
|
interval_sub.register_builtin_erg_impl("__sub__", op_t, Const, Visibility::BUILTIN_PUBLIC);
|
|
interval_sub.register_builtin_const(
|
|
"Output",
|
|
Visibility::BUILTIN_PUBLIC,
|
|
None,
|
|
ValueObj::builtin_class(Type::from(m - p..=n - o)),
|
|
);
|
|
interval.register_trait(class, interval_sub);
|
|
self.register_builtin_patch("Interval", interval, Visibility::BUILTIN_PRIVATE, Const);
|
|
// eq.register_impl("__ne__", op_t, Const, Visibility::BUILTIN_PUBLIC);
|
|
// ord.register_impl("__le__", op_t.clone(), Const, Visibility::BUILTIN_PUBLIC);
|
|
// ord.register_impl("__gt__", op_t.clone(), Const, Visibility::BUILTIN_PUBLIC);
|
|
// ord.register_impl("__ge__", op_t, Const, Visibility::BUILTIN_PUBLIC);
|
|
let E = mono_q("E", subtypeof(mono("Eq")));
|
|
let base = or(E, NoneType);
|
|
let impls = mono("Eq");
|
|
let params = vec![PS::named_nd("E", Type)];
|
|
let mut option_eq =
|
|
Self::builtin_poly_glue_patch("OptionEq", base.clone(), impls.clone(), params, 1);
|
|
let mut option_eq_impl = Self::builtin_methods(Some(impls), 1);
|
|
let op_t = fn1_met(base.clone(), base.clone(), Bool).quantify();
|
|
option_eq_impl.register_builtin_erg_impl("__eq__", op_t, Const, Visibility::BUILTIN_PUBLIC);
|
|
option_eq.register_trait(base, option_eq_impl);
|
|
self.register_builtin_patch("OptionEq", option_eq, Visibility::BUILTIN_PRIVATE, Const);
|
|
/* SuperSub (U <: T <: Sub(T) ==> U <: Sub(U)) */
|
|
// SuperSub|T <: Sub(T)| U <: T = Patch U
|
|
// SuperSub|U <: Sub(U)|
|
|
}
|
|
}
|