use std::array;
pub(crate) trait ArrayInit<T> {
fn init_from_fn(init: impl FnMut() -> T) -> Self;
}
impl<T, const N: usize> ArrayInit<T> for [T; N] {
fn init_from_fn(mut init: impl FnMut() -> T) -> Self {
array::from_fn(|_| init())
}
}
unsafe impl Label for () {
type Array<T> = [T; 1];
fn to_usize(&self) -> usize {
0
}
fn iter() -> impl Iterator<Item = Self>
where
Self: Sized,
{
[()].into_iter()
}
fn iter_ref() -> impl Iterator<Item = &'static Self>
where
Self: Sized + 'static,
{
[&()].into_iter()
}
}
pub unsafe trait Label: Eq + Copy {
#[allow(private_bounds)]
type Array<T>: AsRef<[T]> + AsMut<[T]> + ArrayInit<T>;
fn to_usize(&self) -> usize;
fn iter() -> impl Iterator<Item = Self>
where
Self: Sized;
fn iter_ref() -> impl Iterator<Item = &'static Self>
where
Self: Sized + 'static;
}
#[macro_export]
macro_rules! query_regex {
($label_type:path: $($regex:tt)*) => {
{
$crate::compile_regex!(type QueryRegex<$label_type> = $($regex)*);
QueryRegex::new()
}
};
}