diff --git a/crates/bevy_ecs/src/event/collections.rs b/crates/bevy_ecs/src/event/collections.rs index 5175efb03a..545e6b31a7 100644 --- a/crates/bevy_ecs/src/event/collections.rs +++ b/crates/bevy_ecs/src/event/collections.rs @@ -280,6 +280,16 @@ impl Events { .map(|i| i.event) } + /// Drains all events, resending any that pass the specified predicate back into the event buffer. + pub fn retain bool>(&mut self, predicate: T) -> impl Iterator + '_ { + // Utilize the existing drain, then partition the resulting iterator with the passed predicate + let (kept, drained): (Vec, Vec) = self.drain().partition(predicate); + // Resend any retained events as a batch + self.send_batch(kept); + // Return the drained events as an iterator matching Events::drain + drained.into_iter() + } + /// Iterates over events that happened since the last "update" call. /// WARNING: You probably don't want to use this call. In most cases you should use an /// [`EventReader`]. You should only use this if you know you only need to consume events