Increment last event count on next instead of iter (#2382)
# Objective Currently, simply calling `iter` on an event reader will mark all of it's events as read, even if the returned iterator is never used ## Solution With this, the cursor will simply move to the last unread, but available event when iter is called, and incremented by one per `next` call. Co-authored-by: Carter Anderson <mcanders1@gmail.com>
This commit is contained in:
parent
6a499b125b
commit
ce752d2522
@ -194,13 +194,13 @@ impl<T> Default for ManualEventReader<T> {
|
|||||||
|
|
||||||
impl<T> ManualEventReader<T> {
|
impl<T> ManualEventReader<T> {
|
||||||
/// See [`EventReader::iter`]
|
/// See [`EventReader::iter`]
|
||||||
pub fn iter<'a>(&mut self, events: &'a Events<T>) -> impl DoubleEndedIterator<Item = &'a T> {
|
pub fn iter<'a>(&'a mut self, events: &'a Events<T>) -> impl DoubleEndedIterator<Item = &'a T> {
|
||||||
internal_event_reader(&mut self.last_event_count, events).map(|(e, _)| e)
|
internal_event_reader(&mut self.last_event_count, events).map(|(e, _)| e)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// See [`EventReader::iter_with_id`]
|
/// See [`EventReader::iter_with_id`]
|
||||||
pub fn iter_with_id<'a>(
|
pub fn iter_with_id<'a>(
|
||||||
&mut self,
|
&'a mut self,
|
||||||
events: &'a Events<T>,
|
events: &'a Events<T>,
|
||||||
) -> impl DoubleEndedIterator<Item = (&'a T, EventId<T>)> {
|
) -> impl DoubleEndedIterator<Item = (&'a T, EventId<T>)> {
|
||||||
internal_event_reader(&mut self.last_event_count, events)
|
internal_event_reader(&mut self.last_event_count, events)
|
||||||
@ -210,7 +210,7 @@ impl<T> ManualEventReader<T> {
|
|||||||
/// Like [`iter_with_id`](EventReader::iter_with_id) except not emitting any traces for read
|
/// Like [`iter_with_id`](EventReader::iter_with_id) except not emitting any traces for read
|
||||||
/// messages.
|
/// messages.
|
||||||
fn internal_event_reader<'a, T>(
|
fn internal_event_reader<'a, T>(
|
||||||
last_event_count: &mut usize,
|
last_event_count: &'a mut usize,
|
||||||
events: &'a Events<T>,
|
events: &'a Events<T>,
|
||||||
) -> impl DoubleEndedIterator<Item = (&'a T, EventId<T>)> {
|
) -> impl DoubleEndedIterator<Item = (&'a T, EventId<T>)> {
|
||||||
// if the reader has seen some of the events in a buffer, find the proper index offset.
|
// if the reader has seen some of the events in a buffer, find the proper index offset.
|
||||||
@ -225,37 +225,17 @@ fn internal_event_reader<'a, T>(
|
|||||||
} else {
|
} else {
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
*last_event_count = events.event_count;
|
let a = events.events_a.get(a_index..).unwrap_or_else(|| &[]);
|
||||||
match events.state {
|
let b = events.events_b.get(b_index..).unwrap_or_else(|| &[]);
|
||||||
State::A => events
|
let unread_count = a.len() + b.len();
|
||||||
.events_b
|
*last_event_count = events.event_count - unread_count;
|
||||||
.get(b_index..)
|
let iterator = match events.state {
|
||||||
.unwrap_or_else(|| &[])
|
State::A => b.iter().chain(a.iter()),
|
||||||
.iter()
|
State::B => a.iter().chain(b.iter()),
|
||||||
.map(map_instance_event_with_id)
|
};
|
||||||
.chain(
|
iterator
|
||||||
events
|
.map(map_instance_event_with_id)
|
||||||
.events_a
|
.inspect(move |(_, id)| *last_event_count = (id.id + 1).max(*last_event_count))
|
||||||
.get(a_index..)
|
|
||||||
.unwrap_or_else(|| &[])
|
|
||||||
.iter()
|
|
||||||
.map(map_instance_event_with_id),
|
|
||||||
),
|
|
||||||
State::B => events
|
|
||||||
.events_a
|
|
||||||
.get(a_index..)
|
|
||||||
.unwrap_or_else(|| &[])
|
|
||||||
.iter()
|
|
||||||
.map(map_instance_event_with_id)
|
|
||||||
.chain(
|
|
||||||
events
|
|
||||||
.events_b
|
|
||||||
.get(b_index..)
|
|
||||||
.unwrap_or_else(|| &[])
|
|
||||||
.iter()
|
|
||||||
.map(map_instance_event_with_id),
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'w, 's, T: Resource> EventReader<'w, 's, T> {
|
impl<'w, 's, T: Resource> EventReader<'w, 's, T> {
|
||||||
|
|||||||
@ -316,6 +316,7 @@ pub fn scene_spawner_system(world: &mut World) {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let mut updated_spawned_scenes = Vec::new();
|
let mut updated_spawned_scenes = Vec::new();
|
||||||
|
let scene_spawner = &mut *scene_spawner;
|
||||||
for event in scene_spawner
|
for event in scene_spawner
|
||||||
.scene_asset_event_reader
|
.scene_asset_event_reader
|
||||||
.iter(scene_asset_events)
|
.iter(scene_asset_events)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user