use std::marker::PhantomData; use crate::{ iterator::{LockContext, LockingIterator, LockingTuple}, lockable::Lockable, ThreadKey, }; impl<'l, L> LockContext<'l, L> { pub(crate) const fn new(lockable: &'l L) -> Self { Self { key: None, lockable, } } } impl LockContext<'_, L> { pub fn tuple(&mut self, key: ThreadKey) -> LockingTuple<'_, L, L> { unsafe { self.key = Some(key); LockingTuple { _lockable: PhantomData, // safety: we just inserted a key key: self.key.as_ref().unwrap_unchecked(), tuple: self.lockable, } } } } impl<'l, L> LockContext<'l, L> where &'l L: IntoIterator, { #[expect(clippy::iter_not_returning_iterator)] pub fn iter( &mut self, key: ThreadKey, ) -> LockingIterator<'_, <&'l L as IntoIterator>::IntoIter> { unsafe { self.key = Some(key); LockingIterator { // safety: we just inserted a key key: self.key.as_ref().unwrap_unchecked(), iterator: self.lockable.into_iter(), } } } }