1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
pub use crate::map_variant;
pub mod cached;
pub mod cached_str;
pub mod lazy;
pub mod memoized;
pub mod n_iter;
pub mod prefetch;
pub use {def::*, vec::*};

pub type STR = &'static str;
pub type Str = Box<str>;
pub type Astr = std::sync::Arc<str>;

pub fn Box<T>(v: T) -> Box<T> {
	Box::new(v)
}

pub fn Def<T: Default>() -> T {
	Default::default()
}

pub trait InspectCell<T> {
	fn inspect<R>(&self, f: impl Fn(&T) -> R) -> R;
}
impl<T> InspectCell<T> for std::cell::Cell<T> {
	fn inspect<R>(&self, f: impl Fn(&T) -> R) -> R {
		let s = unsafe { &*self.as_ptr() };
		f(s)
	}
}

pub trait OptionSink {
	fn sink(self);
}
impl<T> OptionSink for Option<T> {
	fn sink(self) {
		let _ = self;
	}
}
impl<T, R> OptionSink for Result<T, R> {
	fn sink(self) {
		let _ = self;
	}
}

#[macro_export]
macro_rules! map_variant {
	($t: pat = $e: expr => $do: expr) => {{
		if let $t = $e {
			Some($do)
		} else {
			None
		}
	}};
}

mod def;
mod vec;