pub struct Hamt<K: CondSync, V: CondSync, H = Hasher>{
pub root: Arc<Node<K, V, H>>,
pub version: Version,
}
Expand description
Hash Array Mapped Trie (HAMT) is an implementation of an associative array that combines the characteristics of a hash table and an array mapped trie.
This type wraps the actual implementation which can be found in the Node
.
§Examples
use wnfs_hamt::Hamt;
let hamt = Hamt::<String, usize>::new();
println!("HAMT: {:?}", hamt);
Fields§
§root: Arc<Node<K, V, H>>
§version: Version
Implementations§
Source§impl<K: CondSync, V: CondSync, H: Hasher + CondSync> Hamt<K, V, H>
impl<K: CondSync, V: CondSync, H: Hasher + CondSync> Hamt<K, V, H>
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new empty HAMT.
§Examples
use wnfs_hamt::Hamt;
let hamt = Hamt::<String, usize>::new();
println!("HAMT: {:?}", hamt);
Sourcepub fn with_root(root: Arc<Node<K, V, H>>) -> Self
pub fn with_root(root: Arc<Node<K, V, H>>) -> Self
Creates a new HAMT
with the given root node.
§Examples
use std::sync::Arc;
use wnfs_hamt::{Hamt, Node};
let hamt = Hamt::<String, usize>::with_root(Arc::new(Node::default()));
println!("HAMT: {:?}", hamt);
Sourcepub async fn diff(
&self,
other: &Self,
store: &impl BlockStore,
) -> Result<Vec<KeyValueChange<K, V>>>where
K: Storable + Clone + Eq + Hash + AsRef<[u8]>,
V: Storable + Clone + Eq,
K::Serializable: Serialize + DeserializeOwned,
V::Serializable: Serialize + DeserializeOwned,
pub async fn diff(
&self,
other: &Self,
store: &impl BlockStore,
) -> Result<Vec<KeyValueChange<K, V>>>where
K: Storable + Clone + Eq + Hash + AsRef<[u8]>,
V: Storable + Clone + Eq,
K::Serializable: Serialize + DeserializeOwned,
V::Serializable: Serialize + DeserializeOwned,
Gets the difference between two HAMTs at the key-value level.
§Examples
use std::sync::Arc;
use wnfs_hamt::{Hamt, Node};
use wnfs_common::MemoryBlockStore;
#[async_std::main]
async fn main() {
let store = &MemoryBlockStore::default();
let main_hamt = Hamt::<String, usize>::with_root({
let mut node = Arc::new(Node::default());
node.set("foo".into(), 400, store).await.unwrap();
node.set("bar".into(), 500, store).await.unwrap();
node
});
let other_hamt = Hamt::<String, usize>::with_root({
let mut node = Arc::new(Node::default());
node.set("foo".into(), 200, store).await.unwrap();
node.set("qux".into(), 600, store).await.unwrap();
node
});
let diff = main_hamt.diff(&other_hamt, store).await.unwrap();
println!("diff: {:#?}", diff);
}
Trait Implementations§
Source§impl<K, V, H> PartialEq for Hamt<K, V, H>where
K: Storable + PartialEq + CondSync,
V: Storable + PartialEq + CondSync,
K::Serializable: Serialize + DeserializeOwned,
V::Serializable: Serialize + DeserializeOwned,
H: Hasher + CondSync,
impl<K, V, H> PartialEq for Hamt<K, V, H>where
K: Storable + PartialEq + CondSync,
V: Storable + PartialEq + CondSync,
K::Serializable: Serialize + DeserializeOwned,
V::Serializable: Serialize + DeserializeOwned,
H: Hasher + CondSync,
Source§impl<K, V, H> Storable for Hamt<K, V, H>where
K: Storable + CondSync,
V: Storable + CondSync,
K::Serializable: Serialize + DeserializeOwned,
V::Serializable: Serialize + DeserializeOwned,
H: Hasher + CondSync,
impl<K, V, H> Storable for Hamt<K, V, H>where
K: Storable + CondSync,
V: Storable + CondSync,
K::Serializable: Serialize + DeserializeOwned,
V::Serializable: Serialize + DeserializeOwned,
H: Hasher + CondSync,
Source§type Serializable = HamtSerializable<<K as Storable>::Serializable, <V as Storable>::Serializable>
type Serializable = HamtSerializable<<K as Storable>::Serializable, <V as Storable>::Serializable>
The at-rest representation of this storable type.
Source§async fn to_serializable(
&self,
store: &impl BlockStore,
) -> Result<Self::Serializable>
async fn to_serializable( &self, store: &impl BlockStore, ) -> Result<Self::Serializable>
Turn the current type into the at-rest representation of this type.
Source§async fn from_serializable(
_cid: Option<&Cid>,
serializable: Self::Serializable,
) -> Result<Self>
async fn from_serializable( _cid: Option<&Cid>, serializable: Self::Serializable, ) -> Result<Self>
Take an at-rest representation of this type and turn it into the in-memory representation.
You can use the
cid
parameter to populate a cache.Source§fn persisted_as(&self) -> Option<&OnceCell<Cid<64>>>
fn persisted_as(&self) -> Option<&OnceCell<Cid<64>>>
Return a serialization cache, if it exists.
By default, this always returns
None
.Auto Trait Implementations§
impl<K, V, H> Freeze for Hamt<K, V, H>
impl<K, V, H> RefUnwindSafe for Hamt<K, V, H>
impl<K, V, H> Send for Hamt<K, V, H>
impl<K, V, H> Sync for Hamt<K, V, H>
impl<K, V, H> Unpin for Hamt<K, V, H>
impl<K, V, H> UnwindSafe for Hamt<K, V, 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
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
self
to use its UpperHex
implementation when
Debug
-formatted.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>
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 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>
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 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,
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) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
Borrows
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,
Mutably borrows
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
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
Borrows
self
, then passes self.deref()
into the pipe function.Source§impl<T> References<RawCodec> for T
impl<T> References<RawCodec> for T
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
Immutable access to the
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
Mutable access to the
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
Immutable access to the
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
Mutable access to the
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
Immutable access to the
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
Mutable access to the
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
Calls
.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
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
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
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
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
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
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
Calls
.tap_deref()
only in debug builds, and is erased in release
builds.