dfir_pipes/pull/
poll_fn.rs1use core::pin::Pin;
4
5use crate::Toggle;
6use crate::pull::{Pull, PullStep};
7
8#[must_use = "`Pull`s do nothing unless polled"]
10#[derive(Clone, Debug)]
11pub struct PollFn<F, Item, Meta, CanPend, CanEnd> {
12 func: F,
13 #[expect(clippy::type_complexity, reason = "phantom data")]
14 _marker: core::marker::PhantomData<fn() -> (Item, Meta, CanPend, CanEnd)>,
15}
16
17impl<F, Item, Meta, CanPend, CanEnd> PollFn<F, Item, Meta, CanPend, CanEnd>
18where
19 Self: Pull,
20{
21 pub(crate) fn new(func: F) -> Self {
23 Self {
24 func,
25 _marker: core::marker::PhantomData,
26 }
27 }
28}
29
30impl<F, Item, Meta, CanPend, CanEnd> Unpin for PollFn<F, Item, Meta, CanPend, CanEnd> {}
31
32impl<F, Item, Meta, CanPend, CanEnd> Pull for PollFn<F, Item, Meta, CanPend, CanEnd>
33where
34 F: FnMut(&mut core::task::Context<'_>) -> PullStep<Item, Meta, CanPend, CanEnd>,
35 Meta: Copy,
36 CanPend: Toggle,
37 CanEnd: Toggle,
38{
39 type Ctx<'ctx> = core::task::Context<'ctx>;
40
41 type Item = Item;
42 type Meta = Meta;
43 type CanPend = CanPend;
44 type CanEnd = CanEnd;
45
46 fn pull(
47 self: Pin<&mut Self>,
48 ctx: &mut Self::Ctx<'_>,
49 ) -> PullStep<Self::Item, Self::Meta, Self::CanPend, Self::CanEnd> {
50 let this = self.get_mut();
51 (this.func)(ctx)
52 }
53
54 fn size_hint(&self) -> (usize, Option<usize>) {
55 (0, None)
57 }
58}