pub struct UnorderedSet<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 UnorderedSet can be iterable among other things.

As with the LookupSet type, an UnorderedSet 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 UnorderedSet 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::UnorderedSet;

// Initializes a set, the generic types can be inferred to `UnorderedSet<String, Sha256>`
// The `b"a"` parameter is a prefix for the storage keys of this data structure.
let mut set = UnorderedSet::new(b"a");

set.insert("test".to_string());
assert!(set.contains("test"));
assert!(set.remove("test"));

UnorderedSet also implements various binary operations, which allow for iterating various combinations of two sets.

use near_sdk::store::UnorderedSet;
use std::collections::HashSet;

let mut set1 = UnorderedSet::new(b"m");
set1.insert(1);
set1.insert(2);
set1.insert(3);

let mut set2 = UnorderedSet::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

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::UnorderedSet;

let mut map: UnorderedSet<String> = UnorderedSet::new(b"b");

Initialize a UnorderedSet with a custom hash function.

Example
use near_sdk::store::key::Keccak256;
use near_sdk::store::UnorderedMap;

let map = UnorderedMap::<String, String, Keccak256>::with_hasher(b"m");

Returns the number of elements in the set.

Returns true if the set contains no elements.

Clears the set, removing all values.

Visits the values representing the difference, i.e., the values that are in self but not in other.

Examples
use near_sdk::store::UnorderedSet;

let mut set1 = UnorderedSet::new(b"m");
set1.insert("a".to_string());
set1.insert("b".to_string());
set1.insert("c".to_string());

let mut set2 = UnorderedSet::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"
}

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::UnorderedSet;

let mut set1 = UnorderedSet::new(b"m");
set1.insert("a".to_string());
set1.insert("b".to_string());
set1.insert("c".to_string());

let mut set2 = UnorderedSet::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);
}

Visits the values representing the intersection, i.e., the values that are both in self and other.

Examples
use near_sdk::store::UnorderedSet;

let mut set1 = UnorderedSet::new(b"m");
set1.insert("a".to_string());
set1.insert("b".to_string());
set1.insert("c".to_string());

let mut set2 = UnorderedSet::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);
}

Visits the values representing the union, i.e., all the values in self or other, without duplicates.

Examples
use near_sdk::store::UnorderedSet;

let mut set1 = UnorderedSet::new(b"m");
set1.insert("a".to_string());
set1.insert("b".to_string());
set1.insert("c".to_string());

let mut set2 = UnorderedSet::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);
}

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::UnorderedSet;

let mut set1 = UnorderedSet::new(b"m");
set1.insert("a".to_string());
set1.insert("b".to_string());
set1.insert("c".to_string());

let mut set2 = UnorderedSet::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);

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::UnorderedSet;

let mut sup = UnorderedSet::new(b"m");
sup.insert("a".to_string());
sup.insert("b".to_string());
sup.insert("c".to_string());

let mut set = UnorderedSet::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);

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::UnorderedSet;

let mut sub = UnorderedSet::new(b"m");
sub.insert("a".to_string());
sub.insert("b".to_string());

let mut set = UnorderedSet::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);

An iterator visiting all elements in arbitrary order. The iterator element type is &'a T.

Examples
use near_sdk::store::UnorderedSet;

let mut set = UnorderedSet::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);
}

Clears the set, returning all elements in an iterator.

Examples
use near_sdk::store::UnorderedSet;

let mut a = UnorderedSet::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());

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.

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.

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.

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

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

Deserialize this instance from a slice of bytes.

Serialize this instance into a vector of bytes.

Formats the value using the given formatter. Read more

Executes the destructor for this type. Read more

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

🔬This is a nightly-only experimental API. (extend_one)

Extends a collection with exactly one element.

🔬This is a nightly-only experimental API. (extend_one)

Reserves capacity in a collection for the given number of additional elements. Read more

The type of the elements being iterated over.

Which kind of iterator are we turning this into?

Creates an iterator from a value. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

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

Should always be Self

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.