disrustor 0.3.0

This project is a port of the LMAX Disruptor to Rust
Documentation
use crate::prelude::*;
use std::sync::{
    atomic::{AtomicBool, Ordering},
    Arc,
};

pub struct ProcessingSequenceBarrier<W: WaitStrategy> {
    gating_sequences: Vec<Arc<AtomicSequence>>,
    wait_strategy: Arc<W>,
    is_alerted: Arc<AtomicBool>,
}

impl<W: WaitStrategy> ProcessingSequenceBarrier<W> {
    pub fn new(
        wait_strategy: Arc<W>,
        gating_sequences: Vec<Arc<AtomicSequence>>,
        is_alerted: Arc<AtomicBool>,
    ) -> Self {
        ProcessingSequenceBarrier {
            wait_strategy,
            gating_sequences,
            is_alerted,
        }
    }
}

impl<W: WaitStrategy> SequenceBarrier for ProcessingSequenceBarrier<W> {
    fn wait_for(&self, sequence: Sequence) -> Option<Sequence> {
        self.wait_strategy
            .wait_for(sequence, &self.gating_sequences, || {
                self.is_alerted.load(Ordering::Relaxed)
            })
    }

    fn signal(&self) {
        self.wait_strategy.signal();
    }
}