pub struct IterableSet<T, H = Sha256>{ /* private fields */ }Expand description
A lazily loaded storage set that stores its content directly on the storage trie.
This structure is similar to near_sdk::store::LookupSet, except
that it keeps track of the elements so that IterableSet can be iterable among other things.
As with the LookupSet type, an IterableSet requires that the elements
implement the BorshSerialize and Ord traits. This can frequently be achieved by
using #[derive(BorshSerialize, Ord)]. Some functions also require elements to implement the
BorshDeserialize trait.
This set stores the values under a hash of the set’s prefix and BorshSerialize of the
element using the set’s ToKey implementation.
The default hash function for IterableSet is Sha256 which uses a syscall
(or host function) built into the NEAR runtime to hash the element. To use a custom function,
use with_hasher. Alternative builtin hash functions can be found at
near_sdk::store::key.
§Examples
use near_sdk::store::IterableSet;
// Initializes a set, the generic types can be inferred to `IterableSet<String, Sha256>`
// The `b"a"` parameter is a prefix for the storage keys of this data structure.
let mut set = IterableSet::new(b"a");
set.insert("test".to_string());
assert!(set.contains("test"));
assert!(set.remove("test"));IterableSet also implements various binary operations, which allow
for iterating various combinations of two sets.
use near_sdk::store::IterableSet;
use std::collections::HashSet;
let mut set1 = IterableSet::new(b"m");
set1.insert(1);
set1.insert(2);
set1.insert(3);
let mut set2 = IterableSet::new(b"n");
set2.insert(2);
set2.insert(3);
set2.insert(4);
assert_eq!(
set1.union(&set2).collect::<HashSet<_>>(),
[1, 2, 3, 4].iter().collect()
);
assert_eq!(
set1.intersection(&set2).collect::<HashSet<_>>(),
[2, 3].iter().collect()
);
assert_eq!(
set1.difference(&set2).collect::<HashSet<_>>(),
[1].iter().collect()
);
assert_eq!(
set1.symmetric_difference(&set2).collect::<HashSet<_>>(),
[1, 4].iter().collect()
);Implementations§
Source§impl<T> IterableSet<T, Sha256>where
T: BorshSerialize + Ord,
impl<T> IterableSet<T, Sha256>where
T: BorshSerialize + Ord,
Sourcepub fn new<S>(prefix: S) -> Selfwhere
S: IntoStorageKey,
pub fn new<S>(prefix: S) -> Selfwhere
S: IntoStorageKey,
Create a new iterable set. Use prefix as a unique prefix for keys.
This prefix can be anything that implements IntoStorageKey. The prefix is used when
storing and looking up values in storage to ensure no collisions with other collections.
§Examples
use near_sdk::store::IterableSet;
let mut map: IterableSet<String> = IterableSet::new(b"b");Source§impl<T, H> IterableSet<T, H>
impl<T, H> IterableSet<T, H>
Sourcepub fn with_hasher<S>(prefix: S) -> Selfwhere
S: IntoStorageKey,
pub fn with_hasher<S>(prefix: S) -> Selfwhere
S: IntoStorageKey,
Initialize a IterableSet with a custom hash function.
§Example
use near_sdk::store::key::Keccak256;
use near_sdk::store::IterableSet;
let map = IterableSet::<String, Keccak256>::with_hasher(b"m");Sourcepub fn clear(&mut self)where
T: BorshDeserialize + Clone,
pub fn clear(&mut self)where
T: BorshDeserialize + Clone,
Clears the set, removing all values.
Sourcepub fn difference<'a>(
&'a self,
other: &'a IterableSet<T, H>,
) -> Difference<'a, T, H> ⓘwhere
T: BorshDeserialize,
pub fn difference<'a>(
&'a self,
other: &'a IterableSet<T, H>,
) -> Difference<'a, T, H> ⓘwhere
T: BorshDeserialize,
Visits the values representing the difference, i.e., the values that are in self but not
in other.
§Examples
use near_sdk::store::IterableSet;
let mut set1 = IterableSet::new(b"m");
set1.insert("a".to_string());
set1.insert("b".to_string());
set1.insert("c".to_string());
let mut set2 = IterableSet::new(b"n");
set2.insert("b".to_string());
set2.insert("c".to_string());
set2.insert("d".to_string());
// Can be seen as `set1 - set2`.
for x in set1.difference(&set2) {
println!("{}", x); // Prints "a"
}Sourcepub fn symmetric_difference<'a>(
&'a self,
other: &'a IterableSet<T, H>,
) -> SymmetricDifference<'a, T, H> ⓘwhere
T: BorshDeserialize + Clone,
pub fn symmetric_difference<'a>(
&'a self,
other: &'a IterableSet<T, H>,
) -> SymmetricDifference<'a, T, H> ⓘwhere
T: BorshDeserialize + Clone,
Visits the values representing the symmetric difference, i.e., the values that are in
self or in other but not in both.
§Examples
use near_sdk::store::IterableSet;
let mut set1 = IterableSet::new(b"m");
set1.insert("a".to_string());
set1.insert("b".to_string());
set1.insert("c".to_string());
let mut set2 = IterableSet::new(b"n");
set2.insert("b".to_string());
set2.insert("c".to_string());
set2.insert("d".to_string());
// Prints "a", "d" in arbitrary order.
for x in set1.symmetric_difference(&set2) {
println!("{}", x);
}Sourcepub fn intersection<'a>(
&'a self,
other: &'a IterableSet<T, H>,
) -> Intersection<'a, T, H> ⓘwhere
T: BorshDeserialize,
pub fn intersection<'a>(
&'a self,
other: &'a IterableSet<T, H>,
) -> Intersection<'a, T, H> ⓘwhere
T: BorshDeserialize,
Visits the values representing the intersection, i.e., the values that are both in self
and other.
§Examples
use near_sdk::store::IterableSet;
let mut set1 = IterableSet::new(b"m");
set1.insert("a".to_string());
set1.insert("b".to_string());
set1.insert("c".to_string());
let mut set2 = IterableSet::new(b"n");
set2.insert("b".to_string());
set2.insert("c".to_string());
set2.insert("d".to_string());
// Prints "b", "c" in arbitrary order.
for x in set1.intersection(&set2) {
println!("{}", x);
}Sourcepub fn union<'a>(&'a self, other: &'a IterableSet<T, H>) -> Union<'a, T, H> ⓘwhere
T: BorshDeserialize + Clone,
pub fn union<'a>(&'a self, other: &'a IterableSet<T, H>) -> Union<'a, T, H> ⓘwhere
T: BorshDeserialize + Clone,
Visits the values representing the union, i.e., all the values in self or other, without
duplicates.
§Examples
use near_sdk::store::IterableSet;
let mut set1 = IterableSet::new(b"m");
set1.insert("a".to_string());
set1.insert("b".to_string());
set1.insert("c".to_string());
let mut set2 = IterableSet::new(b"n");
set2.insert("b".to_string());
set2.insert("c".to_string());
set2.insert("d".to_string());
// Prints "a", "b", "c", "d" in arbitrary order.
for x in set1.union(&set2) {
println!("{}", x);
}Sourcepub fn is_disjoint(&self, other: &IterableSet<T, H>) -> boolwhere
T: BorshDeserialize + Clone,
pub fn is_disjoint(&self, other: &IterableSet<T, H>) -> boolwhere
T: BorshDeserialize + Clone,
Returns true if self has no elements in common with other. This is equivalent to
checking for an empty intersection.
§Examples
use near_sdk::store::IterableSet;
let mut set1 = IterableSet::new(b"m");
set1.insert("a".to_string());
set1.insert("b".to_string());
set1.insert("c".to_string());
let mut set2 = IterableSet::new(b"n");
assert_eq!(set1.is_disjoint(&set2), true);
set2.insert("d".to_string());
assert_eq!(set1.is_disjoint(&set2), true);
set2.insert("a".to_string());
assert_eq!(set1.is_disjoint(&set2), false);Sourcepub fn is_subset(&self, other: &IterableSet<T, H>) -> boolwhere
T: BorshDeserialize + Clone,
pub fn is_subset(&self, other: &IterableSet<T, H>) -> boolwhere
T: BorshDeserialize + Clone,
Returns true if the set is a subset of another, i.e., other contains at least all the
values in self.
§Examples
use near_sdk::store::IterableSet;
let mut sup = IterableSet::new(b"m");
sup.insert("a".to_string());
sup.insert("b".to_string());
sup.insert("c".to_string());
let mut set = IterableSet::new(b"n");
assert_eq!(set.is_subset(&sup), true);
set.insert("b".to_string());
assert_eq!(set.is_subset(&sup), true);
set.insert("d".to_string());
assert_eq!(set.is_subset(&sup), false);Sourcepub fn is_superset(&self, other: &IterableSet<T, H>) -> boolwhere
T: BorshDeserialize + Clone,
pub fn is_superset(&self, other: &IterableSet<T, H>) -> boolwhere
T: BorshDeserialize + Clone,
Returns true if the set is a superset of another, i.e., self contains at least all the
values in other.
§Examples
use near_sdk::store::IterableSet;
let mut sub = IterableSet::new(b"m");
sub.insert("a".to_string());
sub.insert("b".to_string());
let mut set = IterableSet::new(b"n");
assert_eq!(set.is_superset(&sub), false);
set.insert("b".to_string());
set.insert("d".to_string());
assert_eq!(set.is_superset(&sub), false);
set.insert("a".to_string());
assert_eq!(set.is_superset(&sub), true);Sourcepub fn iter(&self) -> Iter<'_, T> ⓘwhere
T: BorshDeserialize,
pub fn iter(&self) -> Iter<'_, T> ⓘwhere
T: BorshDeserialize,
An iterator visiting all elements in arbitrary order.
The iterator element type is &'a T.
§Examples
use near_sdk::store::IterableSet;
let mut set = IterableSet::new(b"m");
set.insert("a".to_string());
set.insert("b".to_string());
set.insert("c".to_string());
for val in set.iter() {
println!("val: {}", val);
}Sourcepub fn drain(&mut self) -> Drain<'_, T, H> ⓘwhere
T: BorshDeserialize,
pub fn drain(&mut self) -> Drain<'_, T, H> ⓘwhere
T: BorshDeserialize,
Clears the set, returning all elements in an iterator.
This will clear all elements, even if only some of them are yielded.
§Examples
use near_sdk::store::IterableSet;
let mut a = IterableSet::new(b"m");
a.insert(1);
a.insert(2);
for v in a.drain().take(1) {
assert!(v == 1 || v == 2);
}
assert!(a.is_empty());Sourcepub fn contains<Q>(&self, value: &Q) -> bool
pub fn contains<Q>(&self, value: &Q) -> bool
Returns true if the set contains the specified value.
The value may be any borrowed form of the set’s value type, but
BorshSerialize, ToOwned<Owned = T> and Ord on the borrowed form must
match those for the value type.
Sourcepub fn insert(&mut self, value: T) -> boolwhere
T: Clone + BorshDeserialize,
pub fn insert(&mut self, value: T) -> boolwhere
T: Clone + BorshDeserialize,
Adds a value to the set.
If the set did not have this value present, true is returned.
If the set did have this value present, false is returned.
Sourcepub fn remove<Q>(&mut self, value: &Q) -> boolwhere
T: Borrow<Q> + BorshDeserialize + Clone,
Q: BorshSerialize + ToOwned<Owned = T> + Ord + ?Sized,
pub fn remove<Q>(&mut self, value: &Q) -> boolwhere
T: Borrow<Q> + BorshDeserialize + Clone,
Q: BorshSerialize + ToOwned<Owned = T> + Ord + ?Sized,
Removes a value from the set. Returns whether the value was present in the set.
The value may be any borrowed form of the set’s value type, but
BorshSerialize, ToOwned<Owned = K> and Ord on the borrowed form must
match those for the value type.
§Performance
When elements are removed, the underlying vector of keys is rearranged by means of swapping
an obsolete key with the last element in the list and deleting that. Note that that requires
updating the index map due to the fact that it holds elements vector indices.
Trait Implementations§
Source§impl<T, H> BorshDeserialize for IterableSet<T, H>
Available on non-WebAssembly only.
impl<T, H> BorshDeserialize for IterableSet<T, H>
fn deserialize_reader<__R: Read>(reader: &mut __R) -> Result<Self, Error>
Source§fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>
fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>
Source§fn try_from_slice(v: &[u8]) -> Result<Self, Error>
fn try_from_slice(v: &[u8]) -> Result<Self, Error>
fn try_from_reader<R>(reader: &mut R) -> Result<Self, Error>where
R: Read,
Source§impl<T, H> BorshSchema for IterableSet<T, H>
Available on non-WebAssembly only.
impl<T, H> BorshSchema for IterableSet<T, H>
Source§fn declaration() -> Declaration
fn declaration() -> Declaration
Source§fn add_definitions_recursively(
definitions: &mut BTreeMap<Declaration, Definition>,
)
fn add_definitions_recursively( definitions: &mut BTreeMap<Declaration, Definition>, )
Source§impl<T, H> BorshSerialize for IterableSet<T, H>
Available on non-WebAssembly only.
impl<T, H> BorshSerialize for IterableSet<T, H>
Source§impl<T, H> Debug for IterableSet<T, H>
impl<T, H> Debug for IterableSet<T, H>
Source§impl<T, H> Drop for IterableSet<T, H>
impl<T, H> Drop for IterableSet<T, H>
Source§impl<T, H> Extend<T> for IterableSet<T, H>
impl<T, H> Extend<T> for IterableSet<T, H>
Source§fn extend<I>(&mut self, iter: I)where
I: IntoIterator<Item = T>,
fn extend<I>(&mut self, iter: I)where
I: IntoIterator<Item = T>,
Source§fn extend_one(&mut self, item: T)
fn extend_one(&mut self, item: T)
extend_one)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one)Source§impl<'a, T, H> IntoIterator for &'a IterableSet<T, H>
impl<'a, T, H> IntoIterator for &'a IterableSet<T, H>
Auto Trait Implementations§
impl<T, H = Sha256> !Freeze for IterableSet<T, H>
impl<T, H = Sha256> !RefUnwindSafe for IterableSet<T, H>
impl<T, H = Sha256> !Sync for IterableSet<T, H>
impl<T, H> Send for IterableSet<T, H>
impl<T, H> Unpin for IterableSet<T, H>
impl<T, H> UnsafeUnpin for IterableSet<T, H>
impl<T, H> UnwindSafe for IterableSet<T, H>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.