#[path = "type_guard.rs"]
mod guard;
pub(crate) use guard::first_duplicate_position;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Bounded<T, const N: usize>(Vec<T>);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct NonEmpty<T, const N: usize> {
head: T,
tail: Vec<T>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct KeyedRoster<T, K, const N: usize> {
members: NonEmpty<T, N>,
keys: NonEmpty<K, N>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct KeyedRosterAssignment<D, K, P, S, const N: usize> {
denominator: KeyedRoster<D, K, N>,
payloads: KeyedRoster<P, S, N>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct DuplicateKey<K, const N: usize> {
key: K,
first: usize,
repeated: NonEmpty<usize, N>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ForeignRosterReference<K> {
key: K,
offered_position: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct UnassignedRosterMember<K> {
key: K,
denominator_position: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Capped<T, const N: usize> {
items: NonEmpty<T, N>,
capping: Capping,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Capping {
Complete,
Truncated {
omitted: usize,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Overflow {
pub capacity: usize,
pub offered: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Empty;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum NonEmptyError {
Empty(Empty),
Overflow(Overflow),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum KeyedRosterError<K, const N: usize> {
Empty(Empty),
Overflow(Overflow),
DuplicateKeys(NonEmpty<DuplicateKey<K, N>, N>),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum KeyedRosterAssignmentError<K, S, const N: usize> {
Empty(Empty),
Overflow(Overflow),
ForeignReferences(NonEmpty<ForeignRosterReference<K>, N>),
DuplicateReferences(NonEmpty<DuplicateKey<K, N>, N>),
ReusedPayloadSeats(NonEmpty<DuplicateKey<S, N>, N>),
MissingMembers(NonEmpty<UnassignedRosterMember<K>, N>),
}