pub struct MessageReader<'w, 's, E>where
E: Message,{ /* private fields */ }
Expand description
Reads Message
s of type T
in order and tracks which messages have already been read.
§Concurrency
Unlike MessageWriter<T>
, systems with MessageReader<T>
param can be executed concurrently
(but not concurrently with MessageWriter<T>
or MessageMutator<T>
systems for the same message type).
Implementations§
Source§impl<'w, 's, E> MessageReader<'w, 's, E>where
E: Message,
impl<'w, 's, E> MessageReader<'w, 's, E>where
E: Message,
Sourcepub fn read(&mut self) -> MessageIterator<'_, E> ⓘ
pub fn read(&mut self) -> MessageIterator<'_, E> ⓘ
Iterates over the messages this MessageReader
has not seen yet. This updates the
MessageReader
’s message counter, which means subsequent message reads will not include messages
that happened before now.
Sourcepub fn read_with_id(&mut self) -> MessageIteratorWithId<'_, E> ⓘ
pub fn read_with_id(&mut self) -> MessageIteratorWithId<'_, E> ⓘ
Sourcepub fn par_read(&mut self) -> MessageParIter<'_, E>
pub fn par_read(&mut self) -> MessageParIter<'_, E>
Returns a parallel iterator over the messages this MessageReader
has not seen yet.
See also for_each
.
§Example
#[derive(Message)]
struct MyMessage {
value: usize,
}
#[derive(Resource, Default)]
struct Counter(AtomicUsize);
// setup
let mut world = World::new();
world.init_resource::<Messages<MyMessage>>();
world.insert_resource(Counter::default());
let mut schedule = Schedule::default();
schedule.add_systems(|mut messages: MessageReader<MyMessage>, counter: Res<Counter>| {
messages.par_read().for_each(|MyMessage { value }| {
counter.0.fetch_add(*value, Ordering::Relaxed);
});
});
for value in 0..100 {
world.write_message(MyMessage { value });
}
schedule.run(&mut world);
let Counter(counter) = world.remove_resource::<Counter>().unwrap();
// all messages were processed
assert_eq!(counter.into_inner(), 4950);
Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Determines the number of messages available to be read from this MessageReader
without consuming any.
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true
if there are no messages available to read.
§Example
The following example shows a useful pattern where some behavior is triggered if new messages are available.
MessageReader::clear()
is used so the same messages don’t re-trigger the behavior the next time the system runs.
#[derive(Message)]
struct Collision;
fn play_collision_sound(mut messages: MessageReader<Collision>) {
if !messages.is_empty() {
messages.clear();
// Play a sound
}
}
Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Consumes all available messages.
This means these messages will not appear in calls to MessageReader::read()
or
MessageReader::read_with_id()
and MessageReader::is_empty()
will return true
.
For usage, see MessageReader::is_empty()
.
Trait Implementations§
Source§impl<'w, 's, E> Debug for MessageReader<'w, 's, E>
impl<'w, 's, E> Debug for MessageReader<'w, 's, E>
Source§impl<E> SystemParam for MessageReader<'_, '_, E>where
E: Message,
impl<E> SystemParam for MessageReader<'_, '_, E>where
E: Message,
Source§type Item<'w, 's> = MessageReader<'w, 's, E>
type Item<'w, 's> = MessageReader<'w, 's, E>
Self
, instantiated with new lifetimes. Read moreSource§fn init_state(
world: &mut World,
) -> <MessageReader<'_, '_, E> as SystemParam>::State
fn init_state( world: &mut World, ) -> <MessageReader<'_, '_, E> as SystemParam>::State
State
.Source§fn init_access(
state: &<MessageReader<'_, '_, E> as SystemParam>::State,
system_meta: &mut SystemMeta,
component_access_set: &mut FilteredAccessSet,
world: &mut World,
)
fn init_access( state: &<MessageReader<'_, '_, E> as SystemParam>::State, system_meta: &mut SystemMeta, component_access_set: &mut FilteredAccessSet, world: &mut World, )
World
access used by this SystemParam
Source§fn apply(
state: &mut <MessageReader<'_, '_, E> as SystemParam>::State,
system_meta: &SystemMeta,
world: &mut World,
)
fn apply( state: &mut <MessageReader<'_, '_, E> as SystemParam>::State, system_meta: &SystemMeta, world: &mut World, )
SystemParam
’s state.
This is used to apply Commands
during ApplyDeferred
.Source§fn queue(
state: &mut <MessageReader<'_, '_, E> as SystemParam>::State,
system_meta: &SystemMeta,
world: DeferredWorld<'_>,
)
fn queue( state: &mut <MessageReader<'_, '_, E> as SystemParam>::State, system_meta: &SystemMeta, world: DeferredWorld<'_>, )
ApplyDeferred
.Source§unsafe fn validate_param<'w, 's>(
state: &'s mut <MessageReader<'_, '_, E> as SystemParam>::State,
_system_meta: &SystemMeta,
_world: UnsafeWorldCell<'w>,
) -> Result<(), SystemParamValidationError>
unsafe fn validate_param<'w, 's>( state: &'s mut <MessageReader<'_, '_, E> as SystemParam>::State, _system_meta: &SystemMeta, _world: UnsafeWorldCell<'w>, ) -> Result<(), SystemParamValidationError>
Source§unsafe fn get_param<'w, 's>(
state: &'s mut <MessageReader<'_, '_, E> as SystemParam>::State,
system_meta: &SystemMeta,
world: UnsafeWorldCell<'w>,
change_tick: Tick,
) -> <MessageReader<'_, '_, E> as SystemParam>::Item<'w, 's>
unsafe fn get_param<'w, 's>( state: &'s mut <MessageReader<'_, '_, E> as SystemParam>::State, system_meta: &SystemMeta, world: UnsafeWorldCell<'w>, change_tick: Tick, ) -> <MessageReader<'_, '_, E> as SystemParam>::Item<'w, 's>
SystemParamFunction
. Read moreimpl<'w, 's, E> ReadOnlySystemParam for MessageReader<'w, 's, E>where
E: Message,
Local<'s, MessageCursor<E>>: ReadOnlySystemParam,
Res<'w, Messages<E>>: ReadOnlySystemParam,
Auto Trait Implementations§
impl<'w, 's, E> Freeze for MessageReader<'w, 's, E>
impl<'w, 's, E> RefUnwindSafe for MessageReader<'w, 's, E>where
E: RefUnwindSafe,
impl<'w, 's, E> Send for MessageReader<'w, 's, E>
impl<'w, 's, E> Sync for MessageReader<'w, 's, E>
impl<'w, 's, E> Unpin for MessageReader<'w, 's, E>
impl<'w, 's, E> !UnwindSafe for MessageReader<'w, 's, E>
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T
ShaderType
for self
. When used in AsBindGroup
derives, it is safe to assume that all images in self
exist.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
, which can then be
downcast
into Box<dyn ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
, which can then be further
downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more