Skip to main content

AsyncLockKp

Struct AsyncLockKp 

Source
pub struct AsyncLockKp<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2>
where Root: Borrow<R>, LockValue: Borrow<Lock>, MidValue: Borrow<Mid>, Value: Borrow<V>, MutRoot: BorrowMut<R>, MutLock: BorrowMut<Lock>, MutMid: BorrowMut<Mid>, MutValue: BorrowMut<V>, G1: Fn(Root) -> Option<LockValue> + Clone, S1: Fn(MutRoot) -> Option<MutLock> + Clone, L: AsyncLockLike<Lock, MidValue> + AsyncLockLike<Lock, MutMid> + Clone, G2: Fn(MidValue) -> Option<Value> + Clone, S2: Fn(MutMid) -> Option<MutValue> + Clone,
{ /* private fields */ }
Expand description

An async keypath that handles async locked values (e.g., Arc<tokio::sync::Mutex>)

Structure:

  • prev: Keypath from Root to Lock container (e.g., Arc<tokio::sync::Mutex>)
  • mid: Async lock access handler that goes from Lock to Inner value
  • next: Keypath from Inner value to final Value

§Type Parameters

  • R: Root type (base)
  • Lock: Lock container type (e.g., Arc<tokio::sync::Mutex>)
  • Mid: The type inside the lock
  • V: Final value type
  • Rest are the same generic parameters as Kp

§Cloning Behavior

IMPORTANT: All Clone operations in this struct are SHALLOW clones:

  • AsyncLockKp itself derives Clone - this clones the three field references/closures
  • prev and next fields are Kp structs containing function pointers (cheap to clone)
  • mid field implements AsyncLockLike trait - typically just PhantomData (zero-cost clone)
  • When Lock: Clone (e.g., Arc<tokio::sync::Mutex<T>>), cloning is just incrementing reference count
  • NO deep data cloning occurs - all clones are pointer/reference increments

Implementations§

Source§

impl<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2> AsyncLockKp<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2>
where Root: Borrow<R>, LockValue: Borrow<Lock>, MidValue: Borrow<Mid>, Value: Borrow<V>, MutRoot: BorrowMut<R>, MutLock: BorrowMut<Lock>, MutMid: BorrowMut<Mid>, MutValue: BorrowMut<V>, G1: Fn(Root) -> Option<LockValue> + Clone, S1: Fn(MutRoot) -> Option<MutLock> + Clone, L: AsyncLockLike<Lock, MidValue> + AsyncLockLike<Lock, MutMid> + Clone, G2: Fn(MidValue) -> Option<Value> + Clone, S2: Fn(MutMid) -> Option<MutValue> + Clone,

Source

pub fn new( prev: Kp<R, Lock, Root, LockValue, MutRoot, MutLock, G1, S1>, mid: L, next: Kp<Mid, V, MidValue, Value, MutMid, MutValue, G2, S2>, ) -> Self

Create a new AsyncLockKp with prev, mid, and next components

Source

pub async fn get(&self, root: Root) -> Option<Value>
where Lock: Clone,

Get the value through the lock

This will:

  1. Use prev to get to the Lock
  2. Use mid to asynchronously lock and get the Inner value
  3. Use next to get to the final Value
§SHALLOW CLONING NOTE

When lock is cloned (e.g., Arc<tokio::sync::Mutex<T>>):

  • Only the Arc reference count is incremented (one atomic operation)
  • The actual data T inside the Mutex is NEVER cloned
  • This is safe and efficient - the whole point of Arc
Source

pub async fn get_mut(&self, root: MutRoot) -> Option<MutValue>
where Lock: Clone,

Get mutable access to the value through the lock

Source

pub async fn set<F>(&self, root: Root, updater: F) -> Result<(), String>
where Lock: Clone, F: FnOnce(&mut V),

Set the value through the lock using an updater function.

Uses interior mutability—no mutable root required. RwLock/Mutex allow mutation through &self (lock().write() etc.), so root can be &Root.

Internally uses: prev.getmid.lock_read/lock_writenext.set (the setter path).

Source

pub fn then<V2, Value2, MutValue2, G3, S3>( self, next_kp: Kp<V, V2, Value, Value2, MutValue, MutValue2, G3, S3>, ) -> AsyncLockKp<R, Lock, Mid, V2, Root, LockValue, MidValue, Value2, MutRoot, MutLock, MutMid, MutValue2, G1, S1, L, impl Fn(MidValue) -> Option<Value2> + Clone + use<G1, G2, G3, L, Lock, LockValue, Mid, MidValue, MutLock, MutMid, MutRoot, MutValue, MutValue2, R, Root, S1, S2, S3, Value, Value2, V, V2>, impl Fn(MutMid) -> Option<MutValue2> + Clone + use<G1, G2, G3, L, Lock, LockValue, Mid, MidValue, MutLock, MutMid, MutRoot, MutValue, MutValue2, R, Root, S1, S2, S3, Value, Value2, V, V2>>
where V: 'static, V2: 'static, Value: Borrow<V>, Value2: Borrow<V2>, MutValue: BorrowMut<V>, MutValue2: BorrowMut<V2>, G3: Fn(Value) -> Option<Value2> + Clone, S3: Fn(MutValue) -> Option<MutValue2> + Clone,

Chain this AsyncLockKp with a regular crate::Kp (no root at call site). Returns an AsyncLockKp that goes one step further; use AsyncLockKp::get or AsyncLockKp::get_mut with root later.

§Example
// Root -> Arc<tokio::Mutex<Inner>> -> Inner -> field
let async_kp = AsyncLockKp::new(root_to_lock, TokioMutexAccess::new(), lock_to_inner);
let field_kp = Kp::new(|inner: &Inner| Some(&inner.field), |inner: &mut Inner| Some(&mut inner.field));
let chained = async_kp.then(field_kp);
let result = chained.get(&root).await;
Source

pub fn then_lock<Lock2, Mid2, V2, LockValue2, MidValue2, Value2, MutLock2, MutMid2, MutValue2, G2_1, S2_1, L2, G2_2, S2_2>( self, lock_kp: LockKp<V, Lock2, Mid2, V2, Value, LockValue2, MidValue2, Value2, MutValue, MutLock2, MutMid2, MutValue2, G2_1, S2_1, L2, G2_2, S2_2>, ) -> AsyncLockKpThenLockKp<R, V2, Root, Value2, MutRoot, MutValue2, Self, LockKp<V, Lock2, Mid2, V2, Value, LockValue2, MidValue2, Value2, MutValue, MutLock2, MutMid2, MutValue2, G2_1, S2_1, L2, G2_2, S2_2>>
where V: 'static, V2: 'static, Value: Borrow<V>, Value2: Borrow<V2>, MutValue: BorrowMut<V>, MutValue2: BorrowMut<V2>, LockValue2: Borrow<Lock2>, MidValue2: Borrow<Mid2>, MutLock2: BorrowMut<Lock2>, MutMid2: BorrowMut<Mid2>, G2_1: Fn(Value) -> Option<LockValue2>, S2_1: Fn(MutValue) -> Option<MutLock2>, L2: LockAccess<Lock2, MidValue2> + LockAccess<Lock2, MutMid2>, G2_2: Fn(MidValue2) -> Option<Value2>, S2_2: Fn(MutMid2) -> Option<MutValue2>,

Chain this AsyncLockKp with a sync crate::lock::LockKp (no root at call site). Returns a keypath that first goes through the async lock, then through the sync lock; use .get(&root).await later.

Source

pub fn then_async<Lock2, Mid2, V2, LockValue2, MidValue2, Value2, MutLock2, MutMid2, MutValue2, G2_1, S2_1, L2, G2_2, S2_2>( self, other: AsyncLockKp<V, Lock2, Mid2, V2, Value, LockValue2, MidValue2, Value2, MutValue, MutLock2, MutMid2, MutValue2, G2_1, S2_1, L2, G2_2, S2_2>, ) -> ComposedAsyncLockKp<R, V2, Root, Value2, MutRoot, MutValue2, Self, AsyncLockKp<V, Lock2, Mid2, V2, Value, LockValue2, MidValue2, Value2, MutValue, MutLock2, MutMid2, MutValue2, G2_1, S2_1, L2, G2_2, S2_2>>
where Lock: Clone, Lock2: Clone, V: 'static, V2: 'static, Value: Borrow<V>, LockValue2: Borrow<Lock2>, MidValue2: Borrow<Mid2>, Value2: Borrow<V2>, MutValue: BorrowMut<V>, MutLock2: BorrowMut<Lock2>, MutMid2: BorrowMut<Mid2>, MutValue2: BorrowMut<V2>, G2_1: Fn(Value) -> Option<LockValue2> + Clone, S2_1: Fn(MutValue) -> Option<MutLock2> + Clone, L2: AsyncLockLike<Lock2, MidValue2> + AsyncLockLike<Lock2, MutMid2> + Clone, G2_2: Fn(MidValue2) -> Option<Value2> + Clone, S2_2: Fn(MutMid2) -> Option<MutValue2> + Clone,

Chain with another async keypath (like crate::lock::LockKp::then_lock for sync locks).

Chain with another async keypath (e.g. tokio RwLock). Use ComposedAsyncLockKp::get or ComposedAsyncLockKp::get_mut with root later.

Root -> AsyncLock1 -> Container -> AsyncLock2 -> Value

§Example
// Root -> Arc<tokio::Mutex<Container>> -> Container -> Arc<tokio::Mutex<Value>> -> Value
let async_kp1 = AsyncLockKp::new(...); // Root -> Container
let async_kp2 = AsyncLockKp::new(...); // Container -> Value
let chained = async_kp1.then_async(async_kp2);
let result = chained.get(&root).await;

Trait Implementations§

Source§

impl<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2> AsyncKeyPathLike<Root, MutRoot> for AsyncLockKp<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2>
where Root: Borrow<R>, LockValue: Borrow<Lock>, MidValue: Borrow<Mid>, Value: Borrow<V>, MutRoot: BorrowMut<R>, MutLock: BorrowMut<Lock>, MutMid: BorrowMut<Mid>, MutValue: BorrowMut<V>, G1: Fn(Root) -> Option<LockValue> + Clone, S1: Fn(MutRoot) -> Option<MutLock> + Clone, L: AsyncLockLike<Lock, MidValue> + AsyncLockLike<Lock, MutMid> + Clone, G2: Fn(MidValue) -> Option<Value> + Clone, S2: Fn(MutMid) -> Option<MutValue> + Clone, Lock: Clone,

Source§

type Value = Value

Value type at the end of the keypath.
Source§

type MutValue = MutValue

Mutable value type at the end of the keypath.
Source§

fn get<'life0, 'async_trait>( &'life0 self, root: Root, ) -> Pin<Box<dyn Future<Output = Option<Value>> + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Get the value at the end of the keypath.
Source§

fn get_mut<'life0, 'async_trait>( &'life0 self, root: MutRoot, ) -> Pin<Box<dyn Future<Output = Option<MutValue>> + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Get mutable access to the value at the end of the keypath.
Source§

impl<R: Clone, Lock: Clone, Mid: Clone, V: Clone, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2> Clone for AsyncLockKp<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2>
where Root: Borrow<R> + Clone, LockValue: Borrow<Lock> + Clone, MidValue: Borrow<Mid> + Clone, Value: Borrow<V> + Clone, MutRoot: BorrowMut<R> + Clone, MutLock: BorrowMut<Lock> + Clone, MutMid: BorrowMut<Mid> + Clone, MutValue: BorrowMut<V> + Clone, G1: Fn(Root) -> Option<LockValue> + Clone + Clone, S1: Fn(MutRoot) -> Option<MutLock> + Clone + Clone, L: AsyncLockLike<Lock, MidValue> + AsyncLockLike<Lock, MutMid> + Clone + Clone, G2: Fn(MidValue) -> Option<Value> + Clone + Clone, S2: Fn(MutMid) -> Option<MutValue> + Clone + Clone,

Source§

fn clone( &self, ) -> AsyncLockKp<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

§

impl<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2> Freeze for AsyncLockKp<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2>
where L: Freeze, G1: Freeze, S1: Freeze, G2: Freeze, S2: Freeze,

§

impl<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2> RefUnwindSafe for AsyncLockKp<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2>

§

impl<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2> Send for AsyncLockKp<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2>
where G1: Send, S1: Send, G2: Send, S2: Send, R: Send, Lock: Send, Root: Send, LockValue: Send, MutRoot: Send, MutLock: Send, Mid: Send, V: Send, MidValue: Send, Value: Send, MutMid: Send, MutValue: Send,

§

impl<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2> Sync for AsyncLockKp<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2>
where G1: Sync, S1: Sync, G2: Sync, S2: Sync, R: Sync, Lock: Sync, Root: Sync, LockValue: Sync, MutRoot: Sync, MutLock: Sync, Mid: Sync, V: Sync, MidValue: Sync, Value: Sync, MutMid: Sync, MutValue: Sync,

§

impl<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2> Unpin for AsyncLockKp<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2>
where L: Unpin, G1: Unpin, S1: Unpin, G2: Unpin, S2: Unpin, R: Unpin, Lock: Unpin, Root: Unpin, LockValue: Unpin, MutRoot: Unpin, MutLock: Unpin, Mid: Unpin, V: Unpin, MidValue: Unpin, Value: Unpin, MutMid: Unpin, MutValue: Unpin,

§

impl<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2> UnwindSafe for AsyncLockKp<R, Lock, Mid, V, Root, LockValue, MidValue, Value, MutRoot, MutLock, MutMid, MutValue, G1, S1, L, G2, S2>
where L: UnwindSafe, G1: UnwindSafe, S1: UnwindSafe, G2: UnwindSafe, S2: UnwindSafe, R: UnwindSafe, Lock: UnwindSafe, Root: UnwindSafe, LockValue: UnwindSafe, MutRoot: UnwindSafe, MutLock: UnwindSafe, Mid: UnwindSafe, V: UnwindSafe, MidValue: UnwindSafe, Value: UnwindSafe, MutMid: UnwindSafe, MutValue: UnwindSafe,

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. 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.