#[cfg(feature = "multi_threaded")]
use crate::message::MessageMutParIter;
use crate::{
message::{
Message, MessageCursor, MessageId, MessageMutIterator, MessageMutIteratorWithId, Messages,
WriteBatchIds,
},
system::{Local, ResMut, SystemParam},
};
#[derive(SystemParam, Debug)]
pub struct MessageMutator<'w, 's, M: Message> {
pub(super) reader: Local<'s, MessageCursor<M>>,
#[system_param(validation_message = "Message not initialized")]
messages: ResMut<'w, Messages<M>>,
}
impl<'w, 's, M: Message> MessageMutator<'w, 's, M> {
pub fn read(&mut self) -> MessageMutIterator<'_, M> {
self.reader.read_mut(&mut self.messages)
}
pub fn read_with_id(&mut self) -> MessageMutIteratorWithId<'_, M> {
self.reader.read_mut_with_id(&mut self.messages)
}
#[cfg(feature = "multi_threaded")]
pub fn par_read(&mut self) -> MessageMutParIter<'_, M> {
self.reader.par_read_mut(&mut self.messages)
}
pub fn len(&self) -> usize {
self.reader.len(&self.messages)
}
pub fn is_empty(&self) -> bool {
self.reader.is_empty(&self.messages)
}
pub fn clear(&mut self) {
self.reader.clear(&self.messages);
}
#[track_caller]
pub fn write(&mut self, message: M) -> MessageId<M> {
self.messages.write(message)
}
#[track_caller]
pub fn write_batch(&mut self, messages: impl IntoIterator<Item = M>) -> WriteBatchIds<M> {
self.messages.write_batch(messages)
}
#[track_caller]
pub fn write_default(&mut self) -> MessageId<M>
where
M: Default,
{
self.messages.write_default()
}
}