• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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