o3 0.16.2

shared-nothing primitives
Documentation
use std::cell::Cell;

use o3::permit::{Lease, Return};

struct Sink<'a>(&'a Cell<Option<u8>>);

impl Return for Sink<'_> {
    type Item = u8;

    fn return_item(&self, item: u8) {
        assert_eq!(self.0.replace(Some(item)), None);
    }
}

#[test]
fn drop_returns_the_item() {
    let returned = Cell::new(None);
    {
        let _permit = Lease::new(Sink(&returned), 7);
    }
    assert_eq!(returned.get(), Some(7));
}

#[test]
fn accessors_borrow_the_sink_and_item() {
    let returned = Cell::new(None);
    let permit = Lease::new(Sink(&returned), 7);
    assert!(std::ptr::eq(permit.sink().0, &returned));
    assert_eq!(*permit.item(), 7);
    drop(permit);
    assert_eq!(returned.get(), Some(7));
}

#[test]
fn into_parts_disarms_the_return() {
    let returned = Cell::new(None);
    let permit = Lease::new(Sink(&returned), 7);
    assert_eq!(
        std::mem::size_of_val(&permit),
        std::mem::size_of::<(Sink<'_>, u8)>()
    );
    let (sink, item) = permit.into_parts();
    assert!(std::ptr::eq(sink.0, &returned));
    assert_eq!(item, 7);
    assert_eq!(returned.get(), None);
}