unlink/
lib.rs

1//! This crate provides a lock free stack that supports concurrent `push`, `pop`, `peek`, and
2//! `extend`.
3//! ```
4//! use unlink::Stack;
5//! use std::thread;
6//!
7//! let stack = Stack::new();
8//! thread::scope(|s| {
9//!     let stack = &stack;
10//!
11//!     s.spawn(move || {
12//!         for i in 0..100 {
13//!             stack.push(i);
14//!         }
15//!     });
16//!
17//!     s.spawn(move || {
18//!         for _ in 0..100 {
19//!             stack.pop();
20//!         }
21//!     });
22//!
23//!     s.spawn(move || {
24//!         for _ in 0..100 {
25//!             let _ = stack.peek();
26//!         }
27//!     });
28//!
29//!     s.spawn(move || {
30//!         for i in 0..10_usize {
31//!             stack.append(vec![i.pow(2), i.pow(3), i.pow(4)].into_iter().collect());
32//!         }
33//!     });
34//! });
35//!
36//! stack.into_iter().for_each(|v| print!("{}, ", v));
37//! ```
38mod base;
39
40pub use base::Stack;
41
42extern crate alloc;
43
44/// [Operation](Operation) is used for fuzzing purposes to provide randomized input.
45#[cfg(feature = "arbitrary")]
46#[derive(Clone, Debug)]
47#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
48pub enum Operation<T> {
49    Push { item: T },
50    Pop,
51    PopPush,
52    Append { items: Vec<T> },
53    Peek,
54}