diff options
author | Roman Perehonchuk <romanp@meta.com> | 2024-10-01 06:01:42 -0700 |
---|---|---|
committer | Facebook GitHub Bot <facebook-github-bot@users.noreply.github.com> | 2024-10-01 06:01:42 -0700 |
commit | d83b304490b22c14ad869206eb060287bbb16c82 (patch) | |
tree | 071e120c449085209fdc6c83532aa98a141f420d | |
parent | c5dba245b10fce680c5d9abdffd65c0d91ef0427 (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.rs | 50 | ||||
-rw-r--r-- | starlark/testcases/eval/go/set.star | 6 |
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])) |