1use core::pin::Pin;
2
3use pin_project_lite::pin_project;
4
5pin_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
22impl<T, R> UnfoldState<T, 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
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