Skip to main content

dfir_pipes/pull/
poll_fn.rs

1//! [`PollFn`] - a `Pull` created from a closure.
2
3use core::pin::Pin;
4
5use crate::Toggle;
6use crate::pull::{Pull, PullStep};
7
8/// A `Pull` implementation created from a closure.
9#[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    /// Create a new `PollFn` from the given closure.
22    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        // Depends on UDF.
56        (0, None)
57    }
58}