use crate::primitives::nibble::Nibble;
use crate::primitives::stream::HashStream;
use crate::primitives::GetTail;
use crate::primitives::Peano;
pub trait Capability: 'static {
type Stream: HashStream;
type Identity: ?Sized + 'static;
type At<D: Peano>: Nibble
where
Self::Stream: GetTail<D>;
}
#[macro_export]
macro_rules! impl_capability {
($name:ty, $id:expr) => {
compile_error!("Manual impl_capability! is deprecated. Use #[derive(Capability)] or update macro to support new stream types.");
};
($name:ty, $stream:ty, $identity:ty) => {
impl $crate::Capability for $name {
type Stream = $stream;
type Identity = $identity;
type At<D: $crate::Peano> = <<Self::Stream as $crate::GetTail<D>>::Out as $crate::HashStream>::Head
where Self::Stream: $crate::GetTail<D>;
}
};
}