summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Perehonchuk <romanp@meta.com>2024-10-01 06:01:42 -0700
committerFacebook GitHub Bot <facebook-github-bot@users.noreply.github.com>2024-10-01 06:01:42 -0700
commitd83b304490b22c14ad869206eb060287bbb16c82 (patch)
tree071e120c449085209fdc6c83532aa98a141f420d
parentc5dba245b10fce680c5d9abdffd65c0d91ef0427 (diff)
issuperset
Summary: set([1,2,3]).issuperset([1,2]) == True >= currentlu quite hard to implement Reviewed By: stepancheg Differential Revision: D60527930 fbshipit-source-id: 9a22effe41ecae81838e02adb0f432691e929670
-rw-r--r--starlark/src/values/types/set/methods.rs50
-rw-r--r--starlark/testcases/eval/go/set.star6
2 files changed, 53 insertions, 3 deletions
diff --git a/starlark/src/values/types/set/methods.rs b/starlark/src/values/types/set/methods.rs
index 01837b0c..ab6ade0e 100644
--- a/starlark/src/values/types/set/methods.rs
+++ b/starlark/src/values/types/set/methods.rs
@@ -301,6 +301,30 @@ pub(crate) fn set_methods(builder: &mut MethodsBuilder) {
}
Ok(data)
}
+
+ /// Test whether every element other iterable is in the set.
+ /// ```
+ /// # starlark::assert::is_true(r#"
+ /// x = set([1, 2, 3])
+ /// y = [1, 3]
+ /// x.issuperset(y) == True
+ /// # "#);
+ /// ```
+ fn issuperset<'v>(
+ this: SetRef<'v>,
+ #[starlark(require=pos)] other: ValueOfUnchecked<'v, StarlarkIter<Value<'v>>>,
+ heap: &'v Heap,
+ ) -> starlark::Result<bool> {
+ let other = other.get().iterate(heap)?;
+ //TODO (romanp) skip if other is larger
+ for elem in other {
+ let hashed = elem.get_hashed()?;
+ if !this.contains_hashed(hashed) {
+ return Ok(false);
+ }
+ }
+ Ok(true)
+ }
}
#[cfg(test)]
mod tests {
@@ -501,4 +525,30 @@ mod tests {
fn test_difference_empty_rhs() {
assert::eq("set([1, 2]).difference(set([]))", "set([2, 1])")
}
+
+ #[test]
+ fn test_is_superset() {
+ assert::is_true("set([1, 2, 3, 4]).issuperset(set([1, 3, 2]))")
+ }
+
+ #[test]
+ fn test_is_not_superset() {
+ assert::is_false("set([1, 2]).issuperset(set([1, 3, 5]))")
+ }
+
+ #[test]
+ fn test_is_not_superset_empty_lhs() {
+ assert::is_false("set([]).issuperset(set([1]))");
+ }
+
+ #[test]
+ fn test_is_superset_empty_rhs() {
+ assert::is_true("set([1, 2]).issuperset(set([]))");
+ assert::is_true("set([]).issuperset(set([]))")
+ }
+
+ #[test]
+ fn test_is_superset_iter() {
+ assert::is_true("set([1, 2, 3]).issuperset([3, 1])")
+ }
}
diff --git a/starlark/testcases/eval/go/set.star b/starlark/testcases/eval/go/set.star
index 28a11e4e..d1001501 100644
--- a/starlark/testcases/eval/go/set.star
+++ b/starlark/testcases/eval/go/set.star
@@ -176,9 +176,9 @@ asserts.eq(set([1,2,3,4]).difference(set([1,2,3])), set([4]))
asserts.eq(set([1,2,3,4]) - set([1,2,3,4]), set())
asserts.eq(set([1,2,3,4]) - set([1,2]), set([3,4]))
-# # issuperset: set >= set or set.issuperset(iterable)
-# asserts.true(set([1,2,3]).issuperset([1,2]))
-# asserts.true(not set([1,2,3]).issuperset(set([1,2,4])))
+# issuperset: set >= set or set.issuperset(iterable)
+asserts.true(set([1,2,3]).issuperset([1,2]))
+asserts.true(not set([1,2,3]).issuperset(set([1,2,4])))
# asserts.true(set([1,2,3]) >= set([1,2,3]))
# asserts.true(set([1,2,3]) >= set([1,2]))
# asserts.true(not set([1,2,3]) >= set([1,2,4]))