1use 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#[macro_export]
32macro_rules! foreach {
33 ([$($arg:expr),+ $(,)?] => $logic:expr) => {
34 {
35 let mut logic = {$logic};
36 $(logic($arg);)+
37 }
38 };
39}
40
41#[macro_export]
60macro_rules! foreach_static {
61 ([$($arg:ident),+ $(,)?] => $trait:ident, $method:ident) => {
62 {
63 $(<$arg as $trait>::$method();)+
64 }
65 };
66}
67
68#[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}