libsync 0.3.0

A channels library
use std::sync::Arc;

use crossbeam_queue::ArrayQueue;

use crate::{ChannelSharedDetails, LimitedWakerPermitQueue};

use super::{Sender, Receiver};

pub fn channel<T>(size: usize) -> (Sender<T>, Receiver<T>)
{

    let queue = ArrayQueue::<T>::new(size);

    let lwpq = LimitedWakerPermitQueue::new(size);

    let shared_details = Arc::new(ChannelSharedDetails::new(queue, lwpq));

    let senders_count = Arc::new(());

    let weak_sender_count = Arc::downgrade(&senders_count);

    let receivers_count = Arc::new(());

    let weak_receivers_count = Arc::downgrade(&receivers_count);

    let sender = Sender::new(&shared_details, senders_count, weak_receivers_count);

    let receiver = Receiver::new(shared_details, weak_sender_count, receivers_count);

    (sender, receiver)

}