hooks/effect/
hook_on_next_poll.rs

1use super::{inner::EffectInner, EffectForNoneDependency};
2
3pub struct EffectOnNextPoll<E: EffectForNoneDependency>(EffectInner<E, E::Cleanup>);
4
5impl<E: EffectForNoneDependency> std::fmt::Debug for EffectOnNextPoll<E> {
6    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7        f.debug_tuple("EffectOnNextPoll").field(&self.0).finish()
8    }
9}
10
11impl<E: EffectForNoneDependency> Default for EffectOnNextPoll<E> {
12    #[inline]
13    fn default() -> Self {
14        Self(Default::default())
15    }
16}
17
18impl<E: EffectForNoneDependency> Unpin for EffectOnNextPoll<E> {}
19
20hooks_core::impl_hook![
21    impl<E: EffectForNoneDependency> EffectOnNextPoll<E> {
22        #[inline]
23        fn unmount(self) {
24            self.get_mut().0.unmount()
25        }
26        #[inline]
27        fn poll_next_update(self) {
28            let this = self.get_mut();
29            this.0.cleanup_and_effect();
30            std::task::Poll::Ready(false)
31        }
32        #[inline(always)]
33        fn use_hook(self) -> () {}
34    }
35];
36
37/// Register an effect which will be run on next poll.
38///
39/// Note that [`EffectOnNextPoll::poll_next_update`](crate::HookPollNextUpdate::poll_next_update)
40/// always returns `Poll::Ready(false)`, indicating its inner state never changes.
41pub struct UseEffectOnNextPoll<E: EffectForNoneDependency>(pub E);
42pub use UseEffectOnNextPoll as use_effect_on_next_poll;
43
44hooks_core::impl_hook![
45    impl<E: EffectForNoneDependency> UseEffectOnNextPoll<E> {
46        #[inline]
47        fn into_hook(self) -> EffectOnNextPoll<E> {
48            EffectOnNextPoll(EffectInner::new_registered(self.0))
49        }
50        #[inline]
51        fn update_hook(self, hook: _) {
52            hook.get_mut().0.register_effect(self.0)
53        }
54        #[inline]
55        fn h(self, hook: EffectOnNextPoll<E>) {
56            hooks_core::UpdateHook::update_hook(self, hook)
57        }
58    }
59];