use crate::actors::mailbox::Mailbox;
use crate::actors::envelope::Envelope;
use crate::actors::abstract_actor_ref::ActorRef;
use crate::actors::message::Message;
use std::collections::vec_deque::VecDeque;
use std::sync::{Arc, Mutex};
pub struct UnboundMailbox {
is_planned: bool,
queue: VecDeque<Envelope>
}
impl UnboundMailbox {
pub fn new() -> UnboundMailbox {
UnboundMailbox {
is_planned: false,
queue: VecDeque::new()
}
}
}
impl Mailbox for UnboundMailbox {
fn set_planned(self: &mut Self, planned: bool) {
self.is_planned = planned;
}
fn is_planned(self: &Self) -> bool {
self.is_planned
}
fn enqueue(self: &mut Self, envelope: Envelope) {
self.queue.push_back(envelope);
}
fn dequeue(self: &mut Self) -> Envelope {
self.queue.pop_front().unwrap()
}
fn has_messages(self: &Self) -> bool {
self.queue.len() > 0
}
fn clean_up(self: &mut Self, sender: ActorRef, dead_letters: ActorRef) {
let mut dead_letters = dead_letters;
while true {
if self.queue.len() > 0 {
let envelope = self.queue.pop_front().unwrap();
let message = envelope.message.clone();
dead_letters.tell(msg!(message), Some(&sender)); } else {
break;
}
}
}
}