use rand::seq::SliceRandom;
use rand::thread_rng;
use std::error::Error;
pub type Result<T, E = Box<dyn Error>> = core::result::Result<T, E>;
pub type SyncResult<T, E = Box<dyn Error + Send + Sync>> = Result<T, E>;
pub fn sleep(len: u64) {
std::thread::sleep(std::time::Duration::from_millis(len));
}
pub fn choose_rand<T: Copy, V: AsRef<[T]>>(v: V) -> Option<T> {
v.as_ref().choose(&mut thread_rng()).map(|value| *value)
}
#[macro_export]
macro_rules! foreach {
([$($arg:expr),+ $(,)?] => $logic:expr) => {
{
let mut logic = {$logic};
$(logic($arg);)+
}
};
}
#[macro_export]
macro_rules! foreach_static {
([$($arg:ident),+ $(,)?] => $trait:ident, $method:ident) => {
{
$(<$arg as $trait>::$method();)+
}
};
}
#[macro_export]
macro_rules! map {
($($k:expr => $v:expr),* $(,)?) => {{
core::convert::From::from([$(($k, $v),)*])
}};
($($v:expr),* $(,)?) => {{
core::convert::From::from([$($v,)*])
}};
}