trapezoid-core 0.3.0

A PSX emulator, backed by vulkano for rendering
Documentation
use std::sync::mpsc::{Receiver, TryRecvError};

pub(crate) struct PeekableReceiver<T> {
    rx: Receiver<T>,
    peeked: Option<T>,
}

impl<T> PeekableReceiver<T> {
    pub(crate) fn new(rx: Receiver<T>) -> Self {
        Self { rx, peeked: None }
    }

    pub(crate) fn is_empty(&mut self) -> bool {
        self.peek().is_none()
    }

    pub(crate) fn peek(&mut self) -> Option<&T> {
        if self.peeked.is_some() {
            self.peeked.as_ref()
        } else {
            match self.rx.try_recv() {
                Ok(value) => {
                    self.peeked = Some(value);
                    self.peeked.as_ref()
                }
                Err(_) => None,
            }
        }
    }

    pub(crate) fn try_recv(&mut self) -> Result<T, TryRecvError> {
        if let Some(value) = self.peeked.take() {
            Ok(value)
        } else {
            self.rx.try_recv()
        }
    }
}