tbg 0.1.3

A library for implementing turn based games logic
Documentation
use std::marker::PhantomData;
pub trait USizeWrapper {
    fn usize_unwrap(self) -> usize;
    fn usize_wrap(_: usize) -> Self;
}

macro_rules! id_wrappers {
    ( $( $x:ident ),* $(,)* ) => {
        $(
            #[derive(Serialize,Deserialize,Clone,Copy,Debug,Default,PartialEq,Eq,PartialOrd,Ord,Hash)]
            pub struct $x(usize);

            impl USizeWrapper for $x {
                fn usize_unwrap(self) -> usize {
                    let $x(ix) = self;
                    ix
                }
                fn usize_wrap(id: usize) -> $x {
                    $x(id)
                }
            }
        )*
    }
}

#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Default)]
pub struct IDCounter<ID>(usize, PhantomData<ID>);

impl<ID> IDCounter<ID>
where
    ID: USizeWrapper,
{
    pub fn increment(&mut self) -> ID {
        let id = USizeWrapper::usize_wrap(self.0);
        self.0 += 1;
        id
    }
}

id_wrappers!(PlayerID, DeckID, CardID, GridID, EventID,);