1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//! Traits representing stateful keyboard scanning

use core::{
    future::Future,
    pin::Pin,
    task::{
        Context,
        Poll,
    },
};

mod scanner;
pub use scanner::{
    StatefulScanner,
    VecScanner,
};

use crate::key::*;

/// Trait for scanning with state
///
/// Rather than row/column level manipulation, this will return only the
/// press/release events.
pub trait ScanStateful {
    /// Poll the keyboard for changes
    fn poll_change(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<PhysKey>>;
}

/// Extension trait for [ScanStateful]
pub trait ScanStatefulExt: ScanStateful + Unpin {
    /// Try to get a key change as a [Future]
    fn change(&mut self) -> ScanStatefulFut<Self> {
        ScanStatefulFut { scanner: self }
    }
}

impl<S> ScanStatefulExt for S where S: ScanStateful + Unpin {}

/// The [Future] returned by [ScanStatefulExt::change]
pub struct ScanStatefulFut<'s, S: ?Sized> {
    scanner: &'s mut S,
}

impl<'s, S> Future for ScanStatefulFut<'s, S>
where
    S: ScanStateful + Unpin,
{
    type Output = Option<PhysKey>;
    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
        let this = self.get_mut();
        Pin::new(&mut *this.scanner).poll_change(cx)
    }
}