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}