@@ -19,14 +19,25 @@ use std::{
19
19
option,
20
20
} ;
21
21
22
- /// Wrapper around a [`ManualEventReader<Entity>`] so that we
22
+ /// Wrapper around [`Entity`] for [`RemovedComponents`].
23
+ /// Internally, `RemovedComponents` uses these as an `Events<RemovedComponentEntity>`.
24
+ #[ derive( Debug , Clone ) ]
25
+ pub struct RemovedComponentEntity ( Entity ) ;
26
+
27
+ impl From < RemovedComponentEntity > for Entity {
28
+ fn from ( value : RemovedComponentEntity ) -> Self {
29
+ value. 0
30
+ }
31
+ }
32
+
33
+ /// Wrapper around a [`ManualEventReader<RemovedComponentEntity>`] so that we
23
34
/// can differentiate events between components.
24
35
#[ derive( Debug ) ]
25
36
pub struct RemovedComponentReader < T >
26
37
where
27
38
T : Component ,
28
39
{
29
- reader : ManualEventReader < Entity > ,
40
+ reader : ManualEventReader < RemovedComponentEntity > ,
30
41
marker : PhantomData < T > ,
31
42
}
32
43
@@ -40,7 +51,7 @@ impl<T: Component> Default for RemovedComponentReader<T> {
40
51
}
41
52
42
53
impl < T : Component > Deref for RemovedComponentReader < T > {
43
- type Target = ManualEventReader < Entity > ;
54
+ type Target = ManualEventReader < RemovedComponentEntity > ;
44
55
fn deref ( & self ) -> & Self :: Target {
45
56
& self . reader
46
57
}
@@ -52,11 +63,11 @@ impl<T: Component> DerefMut for RemovedComponentReader<T> {
52
63
}
53
64
}
54
65
55
- /// Wrapper around a map of components to [`Events<Entity >`].
66
+ /// Wrapper around a map of components to [`Events<RemovedComponentEntity >`].
56
67
/// So that we can find the events without naming the type directly.
57
68
#[ derive( Default , Debug ) ]
58
69
pub struct RemovedComponentEvents {
59
- event_sets : SparseSet < ComponentId , Events < Entity > > ,
70
+ event_sets : SparseSet < ComponentId , Events < RemovedComponentEntity > > ,
60
71
}
61
72
62
73
impl RemovedComponentEvents {
@@ -70,14 +81,17 @@ impl RemovedComponentEvents {
70
81
}
71
82
}
72
83
73
- pub fn get ( & self , component_id : impl Into < ComponentId > ) -> Option < & Events < Entity > > {
84
+ pub fn get (
85
+ & self ,
86
+ component_id : impl Into < ComponentId > ,
87
+ ) -> Option < & Events < RemovedComponentEntity > > {
74
88
self . event_sets . get ( component_id. into ( ) )
75
89
}
76
90
77
91
pub fn send ( & mut self , component_id : impl Into < ComponentId > , entity : Entity ) {
78
92
self . event_sets
79
93
. get_or_insert_with ( component_id. into ( ) , Default :: default)
80
- . send ( entity) ;
94
+ . send ( RemovedComponentEntity ( entity) ) ;
81
95
}
82
96
}
83
97
@@ -122,8 +136,10 @@ pub struct RemovedComponents<'w, 's, T: Component> {
122
136
/// Iterator over entities that had a specific component removed.
123
137
///
124
138
/// See [`RemovedComponents`].
125
- pub type RemovedIter < ' a > =
126
- iter:: Flatten < option:: IntoIter < iter:: Cloned < ManualEventIterator < ' a , Entity > > > > ;
139
+ pub type RemovedIter < ' a > = iter:: Map <
140
+ iter:: Flatten < option:: IntoIter < iter:: Cloned < ManualEventIterator < ' a , RemovedComponentEntity > > > > ,
141
+ fn ( RemovedComponentEntity ) -> Entity ,
142
+ > ;
127
143
128
144
impl < ' w , ' s , T : Component > RemovedComponents < ' w , ' s , T > {
129
145
pub fn iter ( & mut self ) -> RemovedIter < ' _ > {
@@ -132,6 +148,7 @@ impl<'w, 's, T: Component> RemovedComponents<'w, 's, T> {
132
148
. map ( |events| self . reader . iter ( events) . cloned ( ) )
133
149
. into_iter ( )
134
150
. flatten ( )
151
+ . map ( RemovedComponentEntity :: into)
135
152
}
136
153
}
137
154
0 commit comments