use core::pin::Pin; use pin_project_lite::pin_project; pin_project! { /// UnfoldState used for stream and sink unfolds #[project = UnfoldStateProj] #[project_replace = UnfoldStateProjReplace] #[derive(Debug)] pub(crate) enum UnfoldState { Value { value: T, }, Future { #[pin] future: R, }, Empty, } } impl UnfoldState { pub(crate) fn project_future(self: Pin<&mut Self>) -> Option> { match self.project() { UnfoldStateProj::Future { future } => Some(future), _ => None, } } pub(crate) fn take_value(self: Pin<&mut Self>) -> Option { match &*self { UnfoldState::Value { .. } => match self.project_replace(UnfoldState::Empty) { UnfoldStateProjReplace::Value { value } => Some(value), _ => unreachable!(), }, _ => None, } } }