use num_traits::{AsPrimitive, PrimInt};
use crate::algorithm::r#move::r#move::Move;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
pub trait Metric {
fn len<T: PrimInt + 'static>(mv: Move) -> T
where
u64: AsPrimitive<T>;
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Stm;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Mtm;
impl Metric for Stm {
fn len<T: PrimInt + 'static>(mv: Move) -> T
where
u64: AsPrimitive<T>,
{
mv.amount().as_()
}
}
impl Metric for Mtm {
fn len<T: PrimInt + 'static>(_mv: Move) -> T
where
u64: AsPrimitive<T>,
{
T::one()
}
}