use crate::structure::concrete_index::FlatIndex;
use bitvec::vec::BitVec;
use serde::{Deserialize, Serialize};
use std::fmt::{Debug, Display};
pub trait AbstractFiberIndex {
fn is_free(&self) -> bool;
fn is_fixed(&self) -> bool {
!self.is_free()
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub enum FiberClassIndex {
Free,
Fixed,
}
impl AbstractFiberIndex for FiberClassIndex {
fn is_free(&self) -> bool {
matches!(self, FiberClassIndex::Free)
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub enum FiberIndex {
Free,
Fixed(usize),
}
impl AbstractFiberIndex for FiberIndex {
fn is_free(&self) -> bool {
matches!(self, FiberIndex::Free)
}
}
impl From<usize> for FiberIndex {
fn from(value: usize) -> Self {
FiberIndex::Fixed(value)
}
}
impl Display for FiberIndex {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
FiberIndex::Fixed(val) => {
write!(f, "{val}")
}
FiberIndex::Free => {
write!(f, ":")
}
}
}
}
pub enum FiberData<'a> {
Single(usize),
Flat(FlatIndex),
BoolFilter(&'a [bool]),
Pos(&'a [isize]),
IntFilter(&'a [u8]),
BitVec(&'a BitVec),
}
impl From<usize> for FiberData<'_> {
fn from(value: usize) -> Self {
Self::Single(value)
}
}
impl<'a> From<&'a [bool]> for FiberData<'a> {
fn from(value: &'a [bool]) -> Self {
Self::BoolFilter(value)
}
}
impl<'a> From<&'a BitVec> for FiberData<'a> {
fn from(value: &'a BitVec) -> Self {
Self::BitVec(value)
}
}
impl<'a> From<&'a [u8]> for FiberData<'a> {
fn from(value: &'a [u8]) -> Self {
Self::IntFilter(value)
}
}
impl<'a> From<&'a [isize]> for FiberData<'a> {
fn from(value: &'a [isize]) -> Self {
Self::Pos(value)
}
}
impl From<FlatIndex> for FiberData<'_> {
fn from(value: FlatIndex) -> Self {
Self::Flat(value)
}
}
pub enum IteratorEnum<A, B> {
A(A),
B(B),
}
impl<A, B> Iterator for IteratorEnum<A, B>
where
A: Iterator,
B: Iterator<Item = A::Item>,
{
type Item = A::Item;
fn next(&mut self) -> Option<Self::Item> {
match self {
IteratorEnum::A(a) => a.next(),
IteratorEnum::B(b) => b.next(),
}
}
}