Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

use associated iterator types for InspectEnumerable #12389

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions frame/support/src/traits/tokens/nonfungible.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,16 @@ pub trait Inspect<AccountId> {
/// Interface for enumerating items in existence or owned by a given account over a collection
/// of NFTs.
pub trait InspectEnumerable<AccountId>: Inspect<AccountId> {
/// The iterator type for [`Self::items`].
type ItemsIterator: Iterator<Item = Self::ItemId>;
/// The iterator type for [`Self::owned`].
type OwnedIterator: Iterator<Item = Self::ItemId>;

/// Returns an iterator of the items within a `collection` in existence.
fn items() -> Box<dyn Iterator<Item = Self::ItemId>>;
fn items() -> Self::ItemsIterator;

/// Returns an iterator of the items of all collections owned by `who`.
fn owned(who: &AccountId) -> Box<dyn Iterator<Item = Self::ItemId>>;
fn owned(who: &AccountId) -> Self::OwnedIterator;
}

/// Trait for providing an interface for NFT-like items which may be minted, burned and/or have
Expand Down Expand Up @@ -149,10 +154,15 @@ impl<
AccountId,
> InspectEnumerable<AccountId> for ItemOf<F, A, AccountId>
{
fn items() -> Box<dyn Iterator<Item = Self::ItemId>> {
type ItemsIterator = <F as nonfungibles::InspectEnumerable<AccountId>>::ItemsIterator;
type OwnedIterator =
<F as nonfungibles::InspectEnumerable<AccountId>>::OwnedInCollectionIterator;

fn items() -> Self::ItemsIterator {
<F as nonfungibles::InspectEnumerable<AccountId>>::items(&A::get())
}
fn owned(who: &AccountId) -> Box<dyn Iterator<Item = Self::ItemId>> {

fn owned(who: &AccountId) -> Self::OwnedIterator {
<F as nonfungibles::InspectEnumerable<AccountId>>::owned_in_collection(&A::get(), who)
}
}
Expand Down
17 changes: 13 additions & 4 deletions frame/support/src/traits/tokens/nonfungibles.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,20 +105,29 @@ pub trait Inspect<AccountId> {
/// Interface for enumerating items in existence or owned by a given account over many collections
/// of NFTs.
pub trait InspectEnumerable<AccountId>: Inspect<AccountId> {
/// The iterator type for [`Self::collections`].
type CollectionsIterator: Iterator<Item = Self::CollectionId>;
/// The iterator type for [`Self::items`].
type ItemsIterator: Iterator<Item = Self::ItemId>;
/// The iterator type for [`Self::owned`].
type OwnedIterator: Iterator<Item = (Self::CollectionId, Self::ItemId)>;
/// The iterator type for [`Self::owned_in_collection`].
type OwnedInCollectionIterator: Iterator<Item = Self::ItemId>;

/// Returns an iterator of the collections in existence.
fn collections() -> Box<dyn Iterator<Item = Self::CollectionId>>;
fn collections() -> Self::CollectionsIterator;

/// Returns an iterator of the items of a `collection` in existence.
fn items(collection: &Self::CollectionId) -> Box<dyn Iterator<Item = Self::ItemId>>;
fn items(collection: &Self::CollectionId) -> Self::ItemsIterator;

/// Returns an iterator of the items of all collections owned by `who`.
fn owned(who: &AccountId) -> Box<dyn Iterator<Item = (Self::CollectionId, Self::ItemId)>>;
fn owned(who: &AccountId) -> Self::OwnedIterator;

/// Returns an iterator of the items of `collection` owned by `who`.
fn owned_in_collection(
collection: &Self::CollectionId,
who: &AccountId,
) -> Box<dyn Iterator<Item = Self::ItemId>>;
) -> Self::OwnedInCollectionIterator;
}

/// Trait for providing the ability to create collections of nonfungible items.
Expand Down
23 changes: 15 additions & 8 deletions frame/uniques/src/impl_nonfungibles.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

use super::*;
use frame_support::{
storage::KeyPrefixIterator,
traits::{tokens::nonfungibles::*, Get},
BoundedSlice,
};
Expand Down Expand Up @@ -155,25 +156,31 @@ impl<T: Config<I>, I: 'static> Transfer<T::AccountId> for Pallet<T, I> {
}

impl<T: Config<I>, I: 'static> InspectEnumerable<T::AccountId> for Pallet<T, I> {
type CollectionsIterator = KeyPrefixIterator<<T as Config<I>>::CollectionId>;
type ItemsIterator = KeyPrefixIterator<<T as Config<I>>::ItemId>;
type OwnedIterator =
KeyPrefixIterator<(<T as Config<I>>::CollectionId, <T as Config<I>>::ItemId)>;
type OwnedInCollectionIterator = KeyPrefixIterator<<T as Config<I>>::ItemId>;

/// Returns an iterator of the collections in existence.
///
/// NOTE: iterating this list invokes a storage read per item.
fn collections() -> Box<dyn Iterator<Item = Self::CollectionId>> {
Box::new(CollectionMetadataOf::<T, I>::iter_keys())
fn collections() -> Self::CollectionsIterator {
CollectionMetadataOf::<T, I>::iter_keys()
}

/// Returns an iterator of the items of a `collection` in existence.
///
/// NOTE: iterating this list invokes a storage read per item.
fn items(collection: &Self::CollectionId) -> Box<dyn Iterator<Item = Self::ItemId>> {
Box::new(ItemMetadataOf::<T, I>::iter_key_prefix(collection))
fn items(collection: &Self::CollectionId) -> Self::ItemsIterator {
ItemMetadataOf::<T, I>::iter_key_prefix(collection)
}

/// Returns an iterator of the items of all collections owned by `who`.
///
/// NOTE: iterating this list invokes a storage read per item.
fn owned(who: &T::AccountId) -> Box<dyn Iterator<Item = (Self::CollectionId, Self::ItemId)>> {
Box::new(Account::<T, I>::iter_key_prefix((who,)))
fn owned(who: &T::AccountId) -> Self::OwnedIterator {
Account::<T, I>::iter_key_prefix((who,))
}

/// Returns an iterator of the items of `collection` owned by `who`.
Expand All @@ -182,7 +189,7 @@ impl<T: Config<I>, I: 'static> InspectEnumerable<T::AccountId> for Pallet<T, I>
fn owned_in_collection(
collection: &Self::CollectionId,
who: &T::AccountId,
) -> Box<dyn Iterator<Item = Self::ItemId>> {
Box::new(Account::<T, I>::iter_key_prefix((who, collection)))
) -> Self::OwnedInCollectionIterator {
Account::<T, I>::iter_key_prefix((who, collection))
}
}