Skip to content

Commit bfeebe5

Browse files
stepanchegfacebook-github-bot
authored andcommitted
Special cases for set.issuperset
Reviewed By: perehonchuk Differential Revision: D63740446 fbshipit-source-id: 7261983802e6924b66aacd454712fc6e624b34f1
1 parent 8b10af2 commit bfeebe5

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

starlark/src/values/types/set/methods.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
2020
use std::mem;
2121

22+
use either::Either;
2223
use starlark_derive::starlark_module;
2324
use starlark_map::small_set::SmallSet;
2425
use starlark_map::Hashed;
@@ -348,11 +349,19 @@ pub(crate) fn set_methods(builder: &mut MethodsBuilder) {
348349
#[starlark(require=pos)] other: ValueOfUnchecked<'v, StarlarkIter<Value<'v>>>,
349350
heap: &'v Heap,
350351
) -> starlark::Result<bool> {
351-
let other = other.get().iterate(heap)?;
352-
//TODO (romanp) skip if other is larger
352+
let other_var;
353+
let other = if let Some(other) = SetRef::unpack_value_opt(other.get()) {
354+
if this.aref.content.len() < other.aref.content.len() {
355+
return Ok(false);
356+
}
357+
other_var = other;
358+
Either::Left(other_var.aref.content.iter_hashed().map(|v| Ok(v.copied())))
359+
} else {
360+
Either::Right(other.get().iterate(heap)?.map(|v| v.get_hashed()))
361+
};
362+
353363
for elem in other {
354-
let hashed = elem.get_hashed()?;
355-
if !this.aref.contains_hashed(hashed) {
364+
if !this.aref.contains_hashed(elem?) {
356365
return Ok(false);
357366
}
358367
}

0 commit comments

Comments
 (0)