mirror of
https://github.com/erg-lang/erg.git
synced 2025-08-04 18:58:30 +00:00
feat: add SetIterator/TupleIterator
This commit is contained in:
parent
d375ab51e1
commit
30d2dc52a3
3 changed files with 96 additions and 4 deletions
|
@ -1249,6 +1249,15 @@ impl Context {
|
|||
None,
|
||||
)));
|
||||
array_.register_builtin_const(FUNDAMENTAL_GETITEM, Visibility::BUILTIN_PUBLIC, get_item);
|
||||
// union: (self: [Type; _]) -> Type
|
||||
let array_union_t = fn0_met(array_t(Type, TyParam::erased(Nat)), Type).quantify();
|
||||
let union = ValueObj::Subr(ConstSubr::Builtin(BuiltinConstSubr::new(
|
||||
UNION_FUNC,
|
||||
array_union,
|
||||
array_union_t,
|
||||
None,
|
||||
)));
|
||||
array_.register_builtin_const(UNION_FUNC, Visibility::BUILTIN_PUBLIC, union);
|
||||
let mut array_eq = Self::builtin_methods(Some(mono(EQ)), 2);
|
||||
array_eq.register_builtin_erg_impl(
|
||||
OP_EQ,
|
||||
|
@ -1349,6 +1358,23 @@ impl Context {
|
|||
mut_type,
|
||||
);
|
||||
set_.register_trait(set_t.clone(), set_mutizable);
|
||||
let mut set_iterable =
|
||||
Self::builtin_methods(Some(poly(ITERABLE, vec![ty_tp(T.clone())])), 2);
|
||||
let set_iter = poly(SET_ITERATOR, vec![ty_tp(T.clone())]);
|
||||
let t = fn0_met(set_t.clone(), set_iter.clone()).quantify();
|
||||
set_iterable.register_builtin_py_impl(
|
||||
FUNC_ITER,
|
||||
t,
|
||||
Immutable,
|
||||
Visibility::BUILTIN_PUBLIC,
|
||||
Some(FUNDAMENTAL_ITER),
|
||||
);
|
||||
set_iterable.register_builtin_const(
|
||||
ITERATOR,
|
||||
vis.clone(),
|
||||
ValueObj::builtin_class(set_iter),
|
||||
);
|
||||
set_.register_trait(set_t.clone(), set_iterable);
|
||||
let t_call = func1(poly(ITERABLE, vec![ty_tp(T.clone())]), set_t.clone()).quantify();
|
||||
set_.register_builtin_erg_impl(
|
||||
FUNDAMENTAL_CALL,
|
||||
|
@ -1507,7 +1533,7 @@ impl Context {
|
|||
tuple_.register_superclass(mono(GENERIC_TUPLE), &generic_tuple);
|
||||
tuple_.register_marker_trait(poly(OUTPUT, vec![Ts.clone()]));
|
||||
// __Tuple_getitem__: (self: Tuple(Ts), _: {N}) -> Ts[N]
|
||||
let return_t = proj_call(Ts, FUNDAMENTAL_GETITEM, vec![N.clone()]);
|
||||
let return_t = proj_call(Ts.clone(), FUNDAMENTAL_GETITEM, vec![N.clone()]);
|
||||
let tuple_getitem_t =
|
||||
fn1_met(_tuple_t.clone(), tp_enum(Nat, set! {N.clone()}), return_t).quantify();
|
||||
tuple_.register_builtin_py_impl(
|
||||
|
@ -1526,6 +1552,32 @@ impl Context {
|
|||
Visibility::BUILTIN_PUBLIC,
|
||||
Some(FUNDAMENTAL_GETITEM),
|
||||
);
|
||||
let mut tuple_iterable = Self::builtin_methods(
|
||||
Some(poly(
|
||||
ITERABLE,
|
||||
vec![ty_tp(proj_call(Ts.clone(), UNION_FUNC, vec![]))],
|
||||
)),
|
||||
2,
|
||||
);
|
||||
let tuple_iterator = poly(
|
||||
TUPLE_ITERATOR,
|
||||
vec![ty_tp(proj_call(Ts, UNION_FUNC, vec![]))],
|
||||
);
|
||||
// Tuple(Ts) -> TupleIterator(Ts.union())
|
||||
let t = fn0_met(_tuple_t.clone(), tuple_iterator.clone()).quantify();
|
||||
tuple_iterable.register_builtin_py_impl(
|
||||
FUNC_ITER,
|
||||
t,
|
||||
Immutable,
|
||||
Visibility::BUILTIN_PUBLIC,
|
||||
Some(FUNDAMENTAL_ITER),
|
||||
);
|
||||
tuple_iterable.register_builtin_const(
|
||||
ITERATOR,
|
||||
vis.clone(),
|
||||
ValueObj::builtin_class(tuple_iterator),
|
||||
);
|
||||
tuple_.register_trait(_tuple_t.clone(), tuple_iterable);
|
||||
/* record */
|
||||
let mut record = Self::builtin_mono_class(RECORD, 2);
|
||||
record.register_superclass(Obj, &obj);
|
||||
|
@ -1542,6 +1594,14 @@ impl Context {
|
|||
array_iterator.register_superclass(Obj, &obj);
|
||||
array_iterator.register_marker_trait(poly(ITERABLE, vec![ty_tp(T.clone())]));
|
||||
array_iterator.register_marker_trait(poly(OUTPUT, vec![ty_tp(T.clone())]));
|
||||
let mut set_iterator = Self::builtin_poly_class(SET_ITERATOR, vec![PS::t_nd(TY_T)], 1);
|
||||
set_iterator.register_superclass(Obj, &obj);
|
||||
set_iterator.register_marker_trait(poly(ITERABLE, vec![ty_tp(T.clone())]));
|
||||
set_iterator.register_marker_trait(poly(OUTPUT, vec![ty_tp(T.clone())]));
|
||||
let mut tuple_iterator = Self::builtin_poly_class(TUPLE_ITERATOR, vec![PS::t_nd(TY_T)], 1);
|
||||
tuple_iterator.register_superclass(Obj, &obj);
|
||||
tuple_iterator.register_marker_trait(poly(ITERABLE, vec![ty_tp(T.clone())]));
|
||||
tuple_iterator.register_marker_trait(poly(OUTPUT, vec![ty_tp(T.clone())]));
|
||||
let mut range_iterator = Self::builtin_poly_class(RANGE_ITERATOR, vec![PS::t_nd(TY_T)], 1);
|
||||
range_iterator.register_superclass(Obj, &obj);
|
||||
range_iterator.register_marker_trait(poly(ITERABLE, vec![ty_tp(T.clone())]));
|
||||
|
@ -2252,6 +2312,20 @@ impl Context {
|
|||
Const,
|
||||
Some(FUNC_ARRAY_ITERATOR),
|
||||
);
|
||||
self.register_builtin_type(
|
||||
poly(SET_ITERATOR, vec![ty_tp(T.clone())]),
|
||||
set_iterator,
|
||||
Visibility::BUILTIN_PRIVATE,
|
||||
Const,
|
||||
Some(FUNC_SET_ITERATOR),
|
||||
);
|
||||
self.register_builtin_type(
|
||||
poly(TUPLE_ITERATOR, vec![ty_tp(T.clone())]),
|
||||
tuple_iterator,
|
||||
Visibility::BUILTIN_PRIVATE,
|
||||
Const,
|
||||
Some(FUNC_TUPLE_ITERATOR),
|
||||
);
|
||||
self.register_builtin_type(
|
||||
poly(RANGE_ITERATOR, vec![ty_tp(T.clone())]),
|
||||
range_iterator,
|
||||
|
|
|
@ -366,7 +366,7 @@ pub(crate) fn dict_keys(mut args: ValueArgs, ctx: &Context) -> EvalValueResult<V
|
|||
.keys()
|
||||
.fold(Type::Never, |union, t| ctx.union(&union, t));
|
||||
let keys = poly(DICT_KEYS, vec![ty_tp(union)]);
|
||||
Ok(ValueObj::builtin_type(keys))
|
||||
Ok(ValueObj::builtin_class(keys))
|
||||
}
|
||||
|
||||
/// `{Str: Int, Int: Float}.values() == DictValues(Int or Float)`
|
||||
|
@ -386,7 +386,7 @@ pub(crate) fn dict_values(mut args: ValueArgs, ctx: &Context) -> EvalValueResult
|
|||
.values()
|
||||
.fold(Type::Never, |union, t| ctx.union(&union, t));
|
||||
let values = poly(DICT_VALUES, vec![ty_tp(union)]);
|
||||
Ok(ValueObj::builtin_type(values))
|
||||
Ok(ValueObj::builtin_class(values))
|
||||
}
|
||||
|
||||
/// `{Str: Int, Int: Float}.items() == DictItems((Str, Int) or (Int, Float))`
|
||||
|
@ -406,7 +406,21 @@ pub(crate) fn dict_items(mut args: ValueArgs, ctx: &Context) -> EvalValueResult<
|
|||
ctx.union(&union, &tuple_t(vec![k.clone(), v.clone()]))
|
||||
});
|
||||
let items = poly(DICT_ITEMS, vec![ty_tp(union)]);
|
||||
Ok(ValueObj::builtin_type(items))
|
||||
Ok(ValueObj::builtin_class(items))
|
||||
}
|
||||
|
||||
/// `[Int, Str].union() == Int or Str`
|
||||
pub(crate) fn array_union(mut args: ValueArgs, ctx: &Context) -> EvalValueResult<ValueObj> {
|
||||
let slf = args.remove_left_or_key("Self").unwrap();
|
||||
let slf = enum_unwrap!(slf, ValueObj::Array);
|
||||
let slf = slf
|
||||
.iter()
|
||||
.map(|t| ctx.convert_value_into_type(t.clone()).unwrap())
|
||||
.collect::<Vec<_>>();
|
||||
let union = slf
|
||||
.iter()
|
||||
.fold(Type::Never, |union, t| ctx.union(&union, t));
|
||||
Ok(ValueObj::builtin_type(union))
|
||||
}
|
||||
|
||||
pub(crate) fn __range_getitem__(mut args: ValueArgs, _ctx: &Context) -> EvalValueResult<ValueObj> {
|
||||
|
|
|
@ -207,12 +207,14 @@ const ARRAY_ITERATOR: &str = "ArrayIterator";
|
|||
const GENERIC_SET: &str = "GenericSet";
|
||||
const SET: &str = "Set";
|
||||
const MUT_SET: &str = "Set!";
|
||||
const SET_ITERATOR: &str = "SetIterator";
|
||||
const MUT_DICT: &str = "Dict!";
|
||||
const GENERIC_DICT: &str = "GenericDict";
|
||||
const DICT: &str = "Dict";
|
||||
const FUNC_DECODE: &str = "decode";
|
||||
const GENERIC_TUPLE: &str = "GenericTuple";
|
||||
const TUPLE: &str = "Tuple";
|
||||
const TUPLE_ITERATOR: &str = "TupleIterator";
|
||||
const RECORD: &str = "Record";
|
||||
const OR: &str = "Or";
|
||||
const RANGE_ITERATOR: &str = "RangeIterator";
|
||||
|
@ -287,6 +289,8 @@ const FUNC_TUPLE: &str = "tuple";
|
|||
const UNION: &str = "Union";
|
||||
const FUNC_STR_ITERATOR: &str = "str_iterator";
|
||||
const FUNC_ARRAY_ITERATOR: &str = "array_iterator";
|
||||
const FUNC_SET_ITERATOR: &str = "set_iterator";
|
||||
const FUNC_TUPLE_ITERATOR: &str = "tuple_iterator";
|
||||
const FUNC_ENUMERATE: &str = "enumerate";
|
||||
const FUNC_FILTER: &str = "filter";
|
||||
const FUNC_FROZENSET: &str = "frozenset";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue