use std::pin::Pin; pub(crate) struct LazyPin { value: Box, pinned: bool, } impl LazyPin { pub fn new(value: T) -> LazyPin { LazyPin { value: Box::new(value), pinned: false, } } pub fn pinned(&mut self) -> Pin<&mut T> { self.pinned = true; unsafe { Pin::new_unchecked(&mut *self.value) } } pub fn into_unpinned(self) -> Option { if self.pinned { None } else { Some(*self.value) } } }