use std::marker::PhantomData; #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct Counter { value: usize, marker: PhantomData, } impl Default for Counter { fn default() -> Self { Self::new() } } impl Counter { pub fn new() -> Self { Self { value: 0, marker: PhantomData } } } impl> Counter { pub fn value(&self) -> T { self.value.into() } pub fn increment(&mut self) -> T { self.value += 1; self.value() } } impl From for Counter { fn from(value: usize) -> Self { Counter { value, marker: PhantomData } } } impl From> for usize { fn from(value: Counter) -> Self { value.value } }