19
19
//! use std::thread;
20
20
//! use std::time::Duration;
21
21
//! use std::usize;
22
- //! use event_listener::Event;
22
+ //! use event_listener::{ Event, prelude::*} ;
23
23
//!
24
24
//! let flag = Arc::new(AtomicBool::new(false));
25
25
//! let event = Arc::new(Event::new());
@@ -108,7 +108,7 @@ pub use notify::{IntoNotification, Notification};
108
108
109
109
/// Useful traits for notifications.
110
110
pub mod prelude {
111
- pub use crate :: { IntoNotification , Notification } ;
111
+ pub use crate :: { IntoNotification , Listener , Notification } ;
112
112
}
113
113
114
114
/// Inner state of [`Event`].
@@ -213,7 +213,7 @@ impl<T> Event<T> {
213
213
/// # Examples
214
214
///
215
215
/// ```
216
- /// use event_listener::Event;
216
+ /// use event_listener::{ Event, prelude::*} ;
217
217
///
218
218
/// let event = Event::<usize>::with_tag();
219
219
/// ```
@@ -230,7 +230,7 @@ impl<T> Event<T> {
230
230
/// # Examples
231
231
///
232
232
/// ```
233
- /// use event_listener::Event;
233
+ /// use event_listener::{ Event, prelude::*} ;
234
234
///
235
235
/// let event = Event::new();
236
236
/// let listener = event.listen();
@@ -254,7 +254,7 @@ impl<T> Event<T> {
254
254
/// # Examples
255
255
///
256
256
/// ```
257
- /// use event_listener::Event;
257
+ /// use event_listener::{ Event, prelude::*} ;
258
258
///
259
259
/// let event = Event::new();
260
260
/// let listener = event.listen();
@@ -283,7 +283,7 @@ impl<T> Event<T> {
283
283
let inner = ManuallyDrop :: new ( unsafe { Arc :: from_raw ( self . inner ( ) ) } ) ;
284
284
285
285
// Allocate the listener on the heap and insert it.
286
- let mut listener = Box :: pin ( Listener {
286
+ let mut listener = Box :: pin ( InnerListener {
287
287
event : Arc :: clone ( & inner) ,
288
288
listener : None ,
289
289
} ) ;
@@ -322,7 +322,7 @@ impl<T> Event<T> {
322
322
/// Use the default notification strategy:
323
323
///
324
324
/// ```
325
- /// use event_listener::Event;
325
+ /// use event_listener::{ Event, prelude::*} ;
326
326
///
327
327
/// let event = Event::new();
328
328
///
@@ -539,7 +539,7 @@ impl Event<()> {
539
539
/// # Examples
540
540
///
541
541
/// ```
542
- /// use event_listener::Event;
542
+ /// use event_listener::{ Event, prelude::*} ;
543
543
///
544
544
/// let event = Event::new();
545
545
/// ```
@@ -576,7 +576,7 @@ impl Event<()> {
576
576
/// # Examples
577
577
///
578
578
/// ```
579
- /// use event_listener::Event;
579
+ /// use event_listener::{ Event, prelude::*} ;
580
580
/// use std::sync::atomic::{self, Ordering};
581
581
///
582
582
/// let event = Event::new();
@@ -628,7 +628,7 @@ impl Event<()> {
628
628
/// # Examples
629
629
///
630
630
/// ```
631
- /// use event_listener::Event;
631
+ /// use event_listener::{ Event, prelude::*} ;
632
632
///
633
633
/// let event = Event::new();
634
634
///
@@ -678,7 +678,7 @@ impl Event<()> {
678
678
/// # Examples
679
679
///
680
680
/// ```
681
- /// use event_listener::Event;
681
+ /// use event_listener::{ Event, prelude::*} ;
682
682
/// use std::sync::atomic::{self, Ordering};
683
683
///
684
684
/// let event = Event::new();
@@ -720,47 +720,17 @@ impl<T> Drop for Event<T> {
720
720
}
721
721
}
722
722
723
- /// A guard waiting for a notification from an [`Event`].
724
- ///
725
- /// There are two ways for a listener to wait for a notification:
726
- ///
727
- /// 1. In an asynchronous manner using `.await`.
728
- /// 2. In a blocking manner by calling [`EventListener::wait()`] on it.
723
+ /// A handle that is listening to an [`Event`].
729
724
///
730
- /// If a notified listener is dropped without receiving a notification, dropping will notify
731
- /// another active listener. Whether one *additional* listener will be notified depends on what
732
- /// kind of notification was delivered.
733
- ///
734
- /// The listener is not registered into the linked list inside of the [`Event`] by default if
735
- /// it is created via the `new()` method. It needs to be pinned first before being inserted
736
- /// using the `listen()` method. After the listener has begun `listen`ing, the user can
737
- /// `await` it like a future or call `wait()` to block the current thread until it is notified.
738
- ///
739
- /// This structure allocates the listener on the heap.
740
- pub struct EventListener < T = ( ) > {
741
- listener : Pin < Box < Listener < T , Arc < Inner < T > > > > > ,
742
- }
743
-
744
- unsafe impl < T : Send > Send for EventListener < T > { }
745
- unsafe impl < T : Send > Sync for EventListener < T > { }
746
-
747
- impl < T > core:: panic:: UnwindSafe for EventListener < T > { }
748
- impl < T > core:: panic:: RefUnwindSafe for EventListener < T > { }
749
- impl < T > Unpin for EventListener < T > { }
750
-
751
- impl < T > fmt:: Debug for EventListener < T > {
752
- fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
753
- f. debug_struct ( "EventListener" ) . finish_non_exhaustive ( )
754
- }
755
- }
756
-
757
- impl < T > EventListener < T > {
725
+ /// This trait represents a type waiting for a notification from an [`Event`]. See the
726
+ /// [`EventListener`] type for more documentation on this trait's usage.
727
+ pub trait Listener < T > : Future < Output = T > + __private:: Sealed {
758
728
/// Blocks until a notification is received.
759
729
///
760
730
/// # Examples
761
731
///
762
732
/// ```
763
- /// use event_listener::Event;
733
+ /// use event_listener::{ Event, prelude::*} ;
764
734
///
765
735
/// let event = Event::new();
766
736
/// let mut listener = event.listen();
@@ -772,9 +742,7 @@ impl<T> EventListener<T> {
772
742
/// listener.wait();
773
743
/// ```
774
744
#[ cfg( all( feature = "std" , not( target_family = "wasm" ) ) ) ]
775
- pub fn wait ( mut self ) -> T {
776
- self . listener . as_mut ( ) . wait_internal ( None ) . unwrap ( )
777
- }
745
+ fn wait ( self ) -> T ;
778
746
779
747
/// Blocks until a notification is received or a timeout is reached.
780
748
///
@@ -784,7 +752,7 @@ impl<T> EventListener<T> {
784
752
///
785
753
/// ```
786
754
/// use std::time::Duration;
787
- /// use event_listener::Event;
755
+ /// use event_listener::{ Event, prelude::*} ;
788
756
///
789
757
/// let event = Event::new();
790
758
/// let mut listener = event.listen();
@@ -793,11 +761,7 @@ impl<T> EventListener<T> {
793
761
/// assert!(listener.wait_timeout(Duration::from_secs(1)).is_none());
794
762
/// ```
795
763
#[ cfg( all( feature = "std" , not( target_family = "wasm" ) ) ) ]
796
- pub fn wait_timeout ( mut self , timeout : Duration ) -> Option < T > {
797
- self . listener
798
- . as_mut ( )
799
- . wait_internal ( Instant :: now ( ) . checked_add ( timeout) )
800
- }
764
+ fn wait_timeout ( self , timeout : Duration ) -> Option < T > ;
801
765
802
766
/// Blocks until a notification is received or a deadline is reached.
803
767
///
@@ -807,7 +771,7 @@ impl<T> EventListener<T> {
807
771
///
808
772
/// ```
809
773
/// use std::time::{Duration, Instant};
810
- /// use event_listener::Event;
774
+ /// use event_listener::{ Event, prelude::*} ;
811
775
///
812
776
/// let event = Event::new();
813
777
/// let mut listener = event.listen();
@@ -816,19 +780,17 @@ impl<T> EventListener<T> {
816
780
/// assert!(listener.wait_deadline(Instant::now() + Duration::from_secs(1)).is_none());
817
781
/// ```
818
782
#[ cfg( all( feature = "std" , not( target_family = "wasm" ) ) ) ]
819
- pub fn wait_deadline ( mut self , deadline : Instant ) -> Option < T > {
820
- self . listener . as_mut ( ) . wait_internal ( Some ( deadline) )
821
- }
783
+ fn wait_deadline ( self , deadline : Instant ) -> Option < T > ;
822
784
823
785
/// Drops this listener and discards its notification (if any) without notifying another
824
786
/// active listener.
825
787
///
826
788
/// Returns `true` if a notification was discarded.
827
789
///
828
790
/// # Examples
829
- ///
791
+ ///
830
792
/// ```
831
- /// use event_listener::Event;
793
+ /// use event_listener::{ Event, prelude::*} ;
832
794
///
833
795
/// let event = Event::new();
834
796
/// let mut listener1 = event.listen();
@@ -839,41 +801,103 @@ impl<T> EventListener<T> {
839
801
/// assert!(listener1.discard());
840
802
/// assert!(!listener2.discard());
841
803
/// ```
842
- pub fn discard ( mut self ) -> bool {
843
- self . listener . as_mut ( ) . discard ( )
844
- }
804
+ fn discard ( self ) -> bool ;
845
805
846
806
/// Returns `true` if this listener listens to the given `Event`.
847
807
///
848
808
/// # Examples
849
809
///
850
810
/// ```
851
- /// use event_listener::Event;
811
+ /// use event_listener::{ Event, prelude::*} ;
852
812
///
853
813
/// let event = Event::new();
854
814
/// let listener = event.listen();
855
815
///
856
816
/// assert!(listener.listens_to(&event));
857
817
/// ```
858
- #[ inline]
859
- pub fn listens_to ( & self , event : & Event < T > ) -> bool {
860
- ptr:: eq :: < Inner < T > > ( & * self . listener . event , event. inner . load ( Ordering :: Acquire ) )
861
- }
818
+ fn listens_to ( & self , event : & Event < T > ) -> bool ;
862
819
863
820
/// Returns `true` if both listeners listen to the same `Event`.
864
821
///
865
822
/// # Examples
866
823
///
867
824
/// ```
868
- /// use event_listener::Event;
825
+ /// use event_listener::{ Event, prelude::*} ;
869
826
///
870
827
/// let event = Event::new();
871
828
/// let listener1 = event.listen();
872
829
/// let listener2 = event.listen();
873
830
///
874
831
/// assert!(listener1.same_event(&listener2));
875
832
/// ```
876
- pub fn same_event ( & self , other : & EventListener < T > ) -> bool {
833
+ fn same_event ( & self , other : & Self ) -> bool ;
834
+ }
835
+
836
+ /// A guard waiting for a notification from an [`Event`].
837
+ ///
838
+ /// There are two ways for a listener to wait for a notification:
839
+ ///
840
+ /// 1. In an asynchronous manner using `.await`.
841
+ /// 2. In a blocking manner by calling [`EventListener::wait()`] on it.
842
+ ///
843
+ /// If a notified listener is dropped without receiving a notification, dropping will notify
844
+ /// another active listener. Whether one *additional* listener will be notified depends on what
845
+ /// kind of notification was delivered.
846
+ ///
847
+ /// See the [`Listener`] trait for the functionality exposed by this type.
848
+ ///
849
+ /// The listener is not registered into the linked list inside of the [`Event`] by default if
850
+ /// it is created via the `new()` method. It needs to be pinned first before being inserted
851
+ /// using the `listen()` method. After the listener has begun `listen`ing, the user can
852
+ /// `await` it like a future or call `wait()` to block the current thread until it is notified.
853
+ ///
854
+ /// This structure allocates the listener on the heap.
855
+ pub struct EventListener < T = ( ) > {
856
+ listener : Pin < Box < InnerListener < T , Arc < Inner < T > > > > > ,
857
+ }
858
+
859
+ unsafe impl < T : Send > Send for EventListener < T > { }
860
+ unsafe impl < T : Send > Sync for EventListener < T > { }
861
+
862
+ impl < T > core:: panic:: UnwindSafe for EventListener < T > { }
863
+ impl < T > core:: panic:: RefUnwindSafe for EventListener < T > { }
864
+ impl < T > Unpin for EventListener < T > { }
865
+
866
+ impl < T > fmt:: Debug for EventListener < T > {
867
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
868
+ f. debug_struct ( "EventListener" ) . finish_non_exhaustive ( )
869
+ }
870
+ }
871
+
872
+ impl < T > Listener < T > for EventListener < T > {
873
+ #[ cfg( all( feature = "std" , not( target_family = "wasm" ) ) ) ]
874
+ fn wait ( mut self ) -> T {
875
+ self . listener . as_mut ( ) . wait_internal ( None ) . unwrap ( )
876
+ }
877
+
878
+ #[ cfg( all( feature = "std" , not( target_family = "wasm" ) ) ) ]
879
+ fn wait_timeout ( mut self , timeout : Duration ) -> Option < T > {
880
+ self . listener
881
+ . as_mut ( )
882
+ . wait_internal ( Instant :: now ( ) . checked_add ( timeout) )
883
+ }
884
+
885
+ #[ cfg( all( feature = "std" , not( target_family = "wasm" ) ) ) ]
886
+ fn wait_deadline ( mut self , deadline : Instant ) -> Option < T > {
887
+ self . listener . as_mut ( ) . wait_internal ( Some ( deadline) )
888
+ }
889
+
890
+ fn discard ( mut self ) -> bool {
891
+ self . listener . as_mut ( ) . discard ( )
892
+ }
893
+
894
+ #[ inline]
895
+ fn listens_to ( & self , event : & Event < T > ) -> bool {
896
+ ptr:: eq :: < Inner < T > > ( & * self . listener . event , event. inner . load ( Ordering :: Acquire ) )
897
+ }
898
+
899
+ #[ inline]
900
+ fn same_event ( & self , other : & EventListener < T > ) -> bool {
877
901
ptr:: eq :: < Inner < T > > ( & * self . listener . event , & * other. listener . event )
878
902
}
879
903
}
@@ -889,7 +913,7 @@ impl<T> Future for EventListener<T> {
889
913
pin_project_lite:: pin_project! {
890
914
#[ project( !Unpin ) ]
891
915
#[ project = ListenerProject ]
892
- struct Listener <T , B : Borrow <Inner <T >>>
916
+ struct InnerListener <T , B : Borrow <Inner <T >>>
893
917
where
894
918
B : Unpin ,
895
919
{
@@ -904,7 +928,7 @@ pin_project_lite::pin_project! {
904
928
listener: Option <sys:: Listener <T >>,
905
929
}
906
930
907
- impl <T , B : Borrow <Inner <T >>> PinnedDrop for Listener <T , B >
931
+ impl <T , B : Borrow <Inner <T >>> PinnedDrop for InnerListener <T , B >
908
932
where
909
933
B : Unpin ,
910
934
{
@@ -916,10 +940,10 @@ pin_project_lite::pin_project! {
916
940
}
917
941
}
918
942
919
- unsafe impl < T : Send , B : Borrow < Inner < T > > + Unpin + Send > Send for Listener < T , B > { }
920
- unsafe impl < T : Send , B : Borrow < Inner < T > > + Unpin + Sync > Sync for Listener < T , B > { }
943
+ unsafe impl < T : Send , B : Borrow < Inner < T > > + Unpin + Send > Send for InnerListener < T , B > { }
944
+ unsafe impl < T : Send , B : Borrow < Inner < T > > + Unpin + Sync > Sync for InnerListener < T , B > { }
921
945
922
- impl < T , B : Borrow < Inner < T > > + Unpin > Listener < T , B > {
946
+ impl < T , B : Borrow < Inner < T > > + Unpin > InnerListener < T , B > {
923
947
/// Wait until the provided deadline.
924
948
#[ cfg( all( feature = "std" , not( target_family = "wasm" ) ) ) ]
925
949
fn wait_internal ( mut self : Pin < & mut Self > , deadline : Option < Instant > ) -> Option < T > {
@@ -1225,3 +1249,11 @@ fn __test_send_and_sync() {
1225
1249
_assert_send :: < EventListener < ( ) > > ( ) ;
1226
1250
_assert_sync :: < EventListener < ( ) > > ( ) ;
1227
1251
}
1252
+
1253
+ #[ doc( hidden) ]
1254
+ mod __private {
1255
+ use super :: EventListener ;
1256
+
1257
+ pub trait Sealed { }
1258
+ impl < T > Sealed for EventListener < T > { }
1259
+ }
0 commit comments