@@ -140,144 +140,6 @@ impl<T> Default for Events<T> {
140
140
}
141
141
}
142
142
143
- fn map_instance_event_with_id < T > ( event_instance : & EventInstance < T > ) -> ( & T , EventId < T > ) {
144
- ( & event_instance. event , event_instance. event_id )
145
- }
146
-
147
- fn map_instance_event < T > ( event_instance : & EventInstance < T > ) -> & T {
148
- & event_instance. event
149
- }
150
-
151
- /// Reads events of type `T` in order and tracks which events have already been read.
152
- pub struct EventReader < ' a , T : Component > {
153
- last_event_count : Local < ' a , ( usize , PhantomData < T > ) > ,
154
- events : & ' a Events < T > ,
155
- }
156
-
157
- impl < ' a , T : Component > SystemParam for EventReader < ' a , T > {
158
- type Fetch = ResState < Events < T > > ;
159
- }
160
-
161
- /// Sends events of type `T`.
162
- pub struct EventWriter < ' a , T : Component > {
163
- events : & ' a mut Events < T > ,
164
- }
165
-
166
- impl < ' a , T : Component > SystemParam for EventWriter < ' a , T > {
167
- type Fetch = ResMutState < Events < T > > ;
168
- }
169
-
170
- impl < ' a , T : Component > EventWriter < ' a , T > {
171
- pub fn new ( events : & ' a mut Events < T > ) -> Self {
172
- EventWriter :: < ' a , T > { events }
173
- }
174
-
175
- pub fn send ( & mut self , event : T ) {
176
- self . events . send ( event) ;
177
- }
178
-
179
- pub fn send_batch ( & mut self , events : impl Iterator < Item = T > ) {
180
- self . events . extend ( events) ;
181
- }
182
- }
183
-
184
- pub struct ManualEventReader < T > {
185
- last_event_count : usize ,
186
- _marker : PhantomData < T > ,
187
- }
188
-
189
- impl < T > Default for ManualEventReader < T > {
190
- fn default ( ) -> Self {
191
- ManualEventReader {
192
- last_event_count : 0 ,
193
- _marker : Default :: default ( ) ,
194
- }
195
- }
196
- }
197
-
198
- impl < T > ManualEventReader < T > {
199
- /// See [`EventReader::iter`]
200
- pub fn iter < ' a > ( & mut self , events : & ' a Events < T > ) -> impl DoubleEndedIterator < Item = & ' a T > {
201
- internal_event_reader ( & mut self . last_event_count , events) . map ( |( e, _) | e)
202
- }
203
-
204
- /// See [`EventReader::iter_with_id`]
205
- pub fn iter_with_id < ' a > (
206
- & mut self ,
207
- events : & ' a Events < T > ,
208
- ) -> impl DoubleEndedIterator < Item = ( & ' a T , EventId < T > ) > {
209
- internal_event_reader ( & mut self . last_event_count , events)
210
- }
211
- }
212
-
213
- /// Like [`iter_with_id`](EventReader::iter_with_id) except not emitting any traces for read
214
- /// messages.
215
- fn internal_event_reader < ' a , T > (
216
- last_event_count : & mut usize ,
217
- events : & ' a Events < T > ,
218
- ) -> impl DoubleEndedIterator < Item = ( & ' a T , EventId < T > ) > {
219
- // if the reader has seen some of the events in a buffer, find the proper index offset.
220
- // otherwise read all events in the buffer
221
- let a_index = if * last_event_count > events. a_start_event_count {
222
- * last_event_count - events. a_start_event_count
223
- } else {
224
- 0
225
- } ;
226
- let b_index = if * last_event_count > events. b_start_event_count {
227
- * last_event_count - events. b_start_event_count
228
- } else {
229
- 0
230
- } ;
231
- * last_event_count = events. event_count ;
232
- match events. state {
233
- State :: A => events
234
- . events_b
235
- . get ( b_index..)
236
- . unwrap_or_else ( || & [ ] )
237
- . iter ( )
238
- . map ( map_instance_event_with_id)
239
- . chain (
240
- events
241
- . events_a
242
- . get ( a_index..)
243
- . unwrap_or_else ( || & [ ] )
244
- . iter ( )
245
- . map ( map_instance_event_with_id) ,
246
- ) ,
247
- State :: B => events
248
- . events_a
249
- . get ( a_index..)
250
- . unwrap_or_else ( || & [ ] )
251
- . iter ( )
252
- . map ( map_instance_event_with_id)
253
- . chain (
254
- events
255
- . events_b
256
- . get ( b_index..)
257
- . unwrap_or_else ( || & [ ] )
258
- . iter ( )
259
- . map ( map_instance_event_with_id) ,
260
- ) ,
261
- }
262
- }
263
-
264
- impl < ' a , T : Component > EventReader < ' a , T > {
265
- /// Iterates over the events this EventReader has not seen yet. This updates the EventReader's
266
- /// event counter, which means subsequent event reads will not include events that happened
267
- /// before now.
268
- pub fn iter ( & mut self ) -> impl DoubleEndedIterator < Item = & T > {
269
- self . iter_with_id ( ) . map ( |( event, _id) | event)
270
- }
271
-
272
- /// Like [`iter`](Self::iter), except also returning the [`EventId`] of the events.
273
- pub fn iter_with_id ( & mut self ) -> impl DoubleEndedIterator < Item = ( & T , EventId < T > ) > {
274
- internal_event_reader ( & mut self . last_event_count . 0 , & self . events ) . map ( |( event, id) | {
275
- trace ! ( "EventReader::iter() -> {}" , id) ;
276
- ( event, id)
277
- } )
278
- }
279
- }
280
-
281
143
impl < T : Component > Events < T > {
282
144
/// "Sends" an `event` by writing it to the current event buffer. [EventReader]s can then read
283
145
/// the event.
@@ -390,6 +252,143 @@ impl<T: Component> Events<T> {
390
252
}
391
253
}
392
254
255
+ fn map_instance_event_with_id < T > ( event_instance : & EventInstance < T > ) -> ( & T , EventId < T > ) {
256
+ ( & event_instance. event , event_instance. event_id )
257
+ }
258
+
259
+ fn map_instance_event < T > ( event_instance : & EventInstance < T > ) -> & T {
260
+ & event_instance. event
261
+ }
262
+
263
+ /// Like [`iter_with_id`](EventReader::iter_with_id) except not emitting any traces for read
264
+ /// messages.
265
+ fn internal_event_reader < ' a , T > (
266
+ last_event_count : & mut usize ,
267
+ events : & ' a Events < T > ,
268
+ ) -> impl DoubleEndedIterator < Item = ( & ' a T , EventId < T > ) > {
269
+ // if the reader has seen some of the events in a buffer, find the proper index offset.
270
+ // otherwise read all events in the buffer
271
+ let a_index = if * last_event_count > events. a_start_event_count {
272
+ * last_event_count - events. a_start_event_count
273
+ } else {
274
+ 0
275
+ } ;
276
+ let b_index = if * last_event_count > events. b_start_event_count {
277
+ * last_event_count - events. b_start_event_count
278
+ } else {
279
+ 0
280
+ } ;
281
+ * last_event_count = events. event_count ;
282
+ match events. state {
283
+ State :: A => events
284
+ . events_b
285
+ . get ( b_index..)
286
+ . unwrap_or_else ( || & [ ] )
287
+ . iter ( )
288
+ . map ( map_instance_event_with_id)
289
+ . chain (
290
+ events
291
+ . events_a
292
+ . get ( a_index..)
293
+ . unwrap_or_else ( || & [ ] )
294
+ . iter ( )
295
+ . map ( map_instance_event_with_id) ,
296
+ ) ,
297
+ State :: B => events
298
+ . events_a
299
+ . get ( a_index..)
300
+ . unwrap_or_else ( || & [ ] )
301
+ . iter ( )
302
+ . map ( map_instance_event_with_id)
303
+ . chain (
304
+ events
305
+ . events_b
306
+ . get ( b_index..)
307
+ . unwrap_or_else ( || & [ ] )
308
+ . iter ( )
309
+ . map ( map_instance_event_with_id) ,
310
+ ) ,
311
+ }
312
+ }
313
+ /// Sends events of type `T`.
314
+ pub struct EventWriter < ' a , T : Component > {
315
+ events : & ' a mut Events < T > ,
316
+ }
317
+
318
+ impl < ' a , T : Component > SystemParam for EventWriter < ' a , T > {
319
+ type Fetch = ResMutState < Events < T > > ;
320
+ }
321
+
322
+ impl < ' a , T : Component > EventWriter < ' a , T > {
323
+ pub fn new ( events : & ' a mut Events < T > ) -> Self {
324
+ EventWriter :: < ' a , T > { events }
325
+ }
326
+
327
+ pub fn send ( & mut self , event : T ) {
328
+ self . events . send ( event) ;
329
+ }
330
+
331
+ pub fn send_batch ( & mut self , events : impl Iterator < Item = T > ) {
332
+ self . events . extend ( events) ;
333
+ }
334
+ }
335
+
336
+ /// Reads events of type `T` in order and tracks which events have already been read.
337
+ pub struct EventReader < ' a , T : Component > {
338
+ last_event_count : Local < ' a , ( usize , PhantomData < T > ) > ,
339
+ events : & ' a Events < T > ,
340
+ }
341
+
342
+ impl < ' a , T : Component > SystemParam for EventReader < ' a , T > {
343
+ type Fetch = ResState < Events < T > > ;
344
+ }
345
+
346
+ impl < ' a , T : Component > EventReader < ' a , T > {
347
+ /// Iterates over the events this EventReader has not seen yet. This updates the EventReader's
348
+ /// event counter, which means subsequent event reads will not include events that happened
349
+ /// before now.
350
+ pub fn iter ( & mut self ) -> impl DoubleEndedIterator < Item = & T > {
351
+ self . iter_with_id ( ) . map ( |( event, _id) | event)
352
+ }
353
+
354
+ /// Like [`iter`](Self::iter), except also returning the [`EventId`] of the events.
355
+ pub fn iter_with_id ( & mut self ) -> impl DoubleEndedIterator < Item = ( & T , EventId < T > ) > {
356
+ internal_event_reader ( & mut self . last_event_count . 0 , & self . events ) . map ( |( event, id) | {
357
+ trace ! ( "EventReader::iter() -> {}" , id) ;
358
+ ( event, id)
359
+ } )
360
+ }
361
+ }
362
+
363
+ pub struct ManualEventReader < T > {
364
+ last_event_count : usize ,
365
+ _marker : PhantomData < T > ,
366
+ }
367
+
368
+ impl < T > Default for ManualEventReader < T > {
369
+ fn default ( ) -> Self {
370
+ ManualEventReader {
371
+ last_event_count : 0 ,
372
+ _marker : Default :: default ( ) ,
373
+ }
374
+ }
375
+ }
376
+
377
+ impl < T > ManualEventReader < T > {
378
+ /// See [`EventReader::iter`]
379
+ pub fn iter < ' a > ( & mut self , events : & ' a Events < T > ) -> impl DoubleEndedIterator < Item = & ' a T > {
380
+ internal_event_reader ( & mut self . last_event_count , events) . map ( |( e, _) | e)
381
+ }
382
+
383
+ /// See [`EventReader::iter_with_id`]
384
+ pub fn iter_with_id < ' a > (
385
+ & mut self ,
386
+ events : & ' a Events < T > ,
387
+ ) -> impl DoubleEndedIterator < Item = ( & ' a T , EventId < T > ) > {
388
+ internal_event_reader ( & mut self . last_event_count , events)
389
+ }
390
+ }
391
+
393
392
#[ cfg( test) ]
394
393
mod tests {
395
394
use super :: * ;
0 commit comments