Struct IterableSet

Source
pub struct IterableSet<T, H = Sha256>
where T: BorshSerialize + Ord, H: ToKey,
{ /* 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,

Source

pub fn new<S>(prefix: S) -> Self
where 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>
where T: BorshSerialize + Ord, H: ToKey,

Source

pub fn with_hasher<S>(prefix: S) -> Self
where 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");
Source

pub fn len(&self) -> u32

Returns the number of elements in the set.

Source

pub fn is_empty(&self) -> bool

Returns true if the set contains no elements.

Source

pub fn clear(&mut self)

Clears the set, removing all values.

Source

pub fn difference<'a>( &'a self, other: &'a IterableSet<T, H>, ) -> Difference<'a, T, H>

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"
}
Source

pub fn symmetric_difference<'a>( &'a self, other: &'a IterableSet<T, H>, ) -> SymmetricDifference<'a, T, H>

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);
}
Source

pub fn intersection<'a>( &'a self, other: &'a IterableSet<T, H>, ) -> Intersection<'a, T, H>

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);
}
Source

pub fn union<'a>(&'a self, other: &'a IterableSet<T, H>) -> Union<'a, T, H>

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);
}
Source

pub fn is_disjoint(&self, other: &IterableSet<T, H>) -> bool

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);
Source

pub fn is_subset(&self, other: &IterableSet<T, H>) -> bool

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);
Source

pub fn is_superset(&self, other: &IterableSet<T, H>) -> bool

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);
Source

pub fn iter(&self) -> Iter<'_, T>

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);
}
Source

pub fn drain(&mut self) -> Drain<'_, T, H>

Clears the set, returning all elements in an iterator.

§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());
Source

pub fn contains<Q>(&self, value: &Q) -> bool
where T: Borrow<Q>, Q: BorshSerialize + ToOwned<Owned = T> + Ord + ?Sized,

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.

Source

pub fn insert(&mut self, value: T) -> bool

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.

Source

pub fn remove<Q>(&mut self, value: &Q) -> bool
where 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.

Source

pub fn flush(&mut self)

Flushes the intermediate values of the map before this is called when the structure is Droped. This will write all modified values to storage but keep all cached values in memory.

Trait Implementations§

Source§

impl<T, H> BorshDeserialize for IterableSet<T, H>
where T: BorshSerialize + Ord, H: ToKey,

Source§

fn deserialize_reader<__R: Read>(reader: &mut __R) -> Result<Self, Error>

Source§

fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>

Deserializes this instance from a given slice of bytes. Updates the buffer to point at the remaining bytes.
Source§

fn try_from_slice(v: &[u8]) -> Result<Self, Error>

Deserialize this instance from a slice of bytes.
Source§

fn try_from_reader<R>(reader: &mut R) -> Result<Self, Error>
where R: Read,

Source§

impl<T, H> BorshSchema for IterableSet<T, H>
where T: BorshSerialize + Ord, H: ToKey,

Source§

fn declaration() -> Declaration

Get the name of the type without brackets.
Source§

fn add_definitions_recursively( definitions: &mut BTreeMap<Declaration, Definition>, )

Recursively, using DFS, add type definitions required for this type. Type definition partially explains how to serialize/deserialize a type.
Source§

impl<T, H> BorshSerialize for IterableSet<T, H>
where T: BorshSerialize + Ord, H: ToKey,

Source§

fn serialize<__W: Write>(&self, writer: &mut __W) -> Result<(), Error>

Source§

impl<T, H> Debug for IterableSet<T, H>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T, H> Drop for IterableSet<T, H>
where T: BorshSerialize + Ord, H: ToKey,

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<T, H> Extend<T> for IterableSet<T, H>

Source§

fn extend<I>(&mut self, iter: I)
where I: IntoIterator<Item = T>,

Extends a collection with the contents of an iterator. Read more
Source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
Source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
Source§

impl<'a, T, H> IntoIterator for &'a IterableSet<T, H>

Source§

type Item = &'a T

The type of the elements being iterated over.
Source§

type IntoIter = Iter<'a, T>

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more

Auto Trait Implementations§

§

impl<T, H = Sha256> !Freeze for IterableSet<T, H>

§

impl<T, H = Sha256> !RefUnwindSafe for IterableSet<T, H>

§

impl<T, H> Send for IterableSet<T, H>
where T: Send, <H as ToKey>::KeyType: Send,

§

impl<T, H = Sha256> !Sync for IterableSet<T, H>

§

impl<T, H> Unpin for IterableSet<T, H>

§

impl<T, H> UnwindSafe for IterableSet<T, H>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more