libdx/
lib.rs

1/*
2* when the imposter is sus! 😳
3* - Cherry, 4/27/2023
4*/
5
6use rand::seq::SliceRandom;
7use rand::thread_rng;
8use std::error::Error;
9
10pub type Result<T, E = Box<dyn Error>> = core::result::Result<T, E>;
11pub type SyncResult<T, E = Box<dyn Error + Send + Sync>> = Result<T, E>;
12
13pub fn sleep(len: u64) {
14    std::thread::sleep(std::time::Duration::from_millis(len));
15}
16
17pub fn choose_rand<T: Copy, V: AsRef<[T]>>(v: V) -> Option<T> {
18    v.as_ref().choose(&mut thread_rng()).map(|value| *value)
19}
20
21/// Expands to repeat some code for each item in
22/// a provided list of values.
23///
24/// # Example
25/// ```
26/// # use libdx::foreach;
27/// let mut vec = Vec::new();
28/// foreach!([1, 2, 3] => |x| vec.push(x));
29/// assert_eq!(vec, [1, 2, 3]);
30/// ```
31#[macro_export]
32macro_rules! foreach {
33	([$($arg:expr),+ $(,)?] => $logic:expr) => {
34		{
35			let mut logic = {$logic};
36			$(logic($arg);)+
37		}
38	};
39}
40
41/// Run a static method on each type provided.
42///
43/// # Example
44/// ```
45/// # use libdx::foreach_static;
46/// struct Foo;
47/// struct Bar;
48///
49/// trait Quacks {
50///     fn static_quack() { println!("Quack!"); }
51/// }
52///
53/// impl Quacks for Foo {};
54/// impl Quacks for Bar {};
55///
56/// foreach_static!([Foo, Bar] => Quacks, static_quack);
57/// ```
58///
59#[macro_export]
60macro_rules! foreach_static {
61    ([$($arg:ident),+ $(,)?] => $trait:ident, $method:ident) => {
62        {
63            $(<$arg as $trait>::$method();)+
64        }
65    };
66}
67
68/// Praise Shepmaster
69/// https://stackoverflow.com/a/27582993/8149876
70#[macro_export]
71macro_rules! map {
72    ($($k:expr => $v:expr),* $(,)?) => {{
73        core::convert::From::from([$(($k, $v),)*])
74    }};
75
76    ($($v:expr),* $(,)?) => {{
77        core::convert::From::from([$($v,)*])
78    }};
79}