1 use core::pin::Pin; 2 3 use pin_project_lite::pin_project; 4 5 pin_project! { 6 /// UnfoldState used for stream and sink unfolds 7 #[project = UnfoldStateProj] 8 #[project_replace = UnfoldStateProjReplace] 9 #[derive(Debug)] 10 pub(crate) enum UnfoldState<T, R> { 11 Value { 12 value: T, 13 }, 14 Future { 15 #[pin] 16 future: R, 17 }, 18 Empty, 19 } 20 } 21 22 impl<T, R> UnfoldState<T, R> { project_future(self: Pin<&mut Self>) -> Option<Pin<&mut R>>23 pub(crate) fn project_future(self: Pin<&mut Self>) -> Option<Pin<&mut R>> { 24 match self.project() { 25 UnfoldStateProj::Future { future } => Some(future), 26 _ => None, 27 } 28 } 29 take_value(self: Pin<&mut Self>) -> Option<T>30 pub(crate) fn take_value(self: Pin<&mut Self>) -> Option<T> { 31 match &*self { 32 UnfoldState::Value { .. } => match self.project_replace(UnfoldState::Empty) { 33 UnfoldStateProjReplace::Value { value } => Some(value), 34 _ => unreachable!(), 35 }, 36 _ => None, 37 } 38 } 39 } 40