himark 0.2.0

For those who crave more ergonomic marker traits
Documentation
use std::marker::PhantomData;

use himark as hi;

#[hi::marker]
trait Array {}

#[hi::marker]
trait Uniform {}

#[hi::marker]
trait V {}

#[hi::mark(Array, Uniform, V)]
pub struct EmptyStruct;

#[hi::mark(Array, Uniform, V)]
pub enum EmptyEnum {}

pub mod type_ {
    use super::*;

    #[hi::mark(Array, Uniform, V)]
    pub struct TestSingle<T>(PhantomData<T>);

    #[hi::mark(Array, Uniform, V)]
    pub struct TestMany<T, B, C>(PhantomData<(T, B, C)>);

    #[hi::mark(Array, Uniform, V)]
    pub struct TestWhereBoundSingle<T>(PhantomData<T>)
    where
        T: Default;

    #[hi::mark(Array, Uniform, V)]
    pub struct TestWhereBoundMany<T, B>(PhantomData<(T, B)>)
    where
        T: Default,
        B: core::fmt::Debug;

    #[hi::mark(Array, Uniform, V)]
    pub struct TestInnerBoundSingle<T: Default>(PhantomData<T>);

    #[hi::mark(Array, Uniform, V)]
    pub struct TestInnerBoundMany<T: Default + core::fmt::Debug, B: ?Sized>(PhantomData<(T, B)>);

    #[hi::mark(Array, Uniform, V)]
    pub struct TestMixedBoundMany<T: Default + core::fmt::Debug, B>(PhantomData<(T, B)>)
    where
        B: ?Sized;
}

pub mod const_ {
    use super::*;

    #[hi::mark(Array, Uniform, V)]
    pub struct TestSingle<const N: usize>;

    #[hi::mark(Array, Uniform, V)]
    pub struct TestMany<const N: usize, const M: usize>;

    #[hi::mark(Array, Uniform, V)]
    pub struct TestSingleBound<const N: usize>
    where
        [i32; N]: Default;

    #[hi::mark(Array, Uniform, V)]
    pub struct TestManyBound<const N: usize, const M: usize>
    where
        [i32; N]: Default,
        [(); N]: Clone;
}

#[hi::mark(Array, Uniform, V)]
pub struct TestAll<T: Default, const N: usize>(PhantomData<T>)
where
    [T; N]: Sized;