use core::marker::PhantomData;
use crate::traits::{
BipartiteGraph, BipartiteGraphBuilder, MonoplexBipartiteGraph, MonoplexGraphBuilder,
};
#[cfg_attr(feature = "mem_size", derive(mem_dbg::MemSize))]
#[cfg_attr(feature = "mem_size", mem_size(rec))]
#[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg))]
#[derive(Clone)]
pub struct GenericMonoplexBipartiteGraphBuilder<G: MonoplexBipartiteGraph> {
left_nodes: Option<G::LeftNodes>,
right_nodes: Option<G::RightNodes>,
edges: Option<G::Edges>,
_graph: PhantomData<G>,
}
impl<G: MonoplexBipartiteGraph> Default for GenericMonoplexBipartiteGraphBuilder<G> {
#[inline]
fn default() -> Self {
Self { left_nodes: None, right_nodes: None, edges: None, _graph: PhantomData }
}
}
impl<G: MonoplexBipartiteGraph> BipartiteGraphBuilder for GenericMonoplexBipartiteGraphBuilder<G> {
type BipartiteGraph = G;
#[inline]
fn left_nodes(self, left_nodes: <Self::BipartiteGraph as BipartiteGraph>::LeftNodes) -> Self {
Self { left_nodes: Some(left_nodes), ..self }
}
#[inline]
fn right_nodes(
self,
right_nodes: <Self::BipartiteGraph as BipartiteGraph>::RightNodes,
) -> Self {
Self { right_nodes: Some(right_nodes), ..self }
}
}
impl<G: MonoplexBipartiteGraph> MonoplexGraphBuilder for GenericMonoplexBipartiteGraphBuilder<G> {
type MonoplexGraph = G;
#[inline]
fn edges(self, edges: <Self::MonoplexGraph as crate::prelude::MonoplexGraph>::Edges) -> Self {
Self { edges: Some(edges), ..self }
}
}
#[derive(Clone, Debug, PartialEq, Eq, thiserror::Error)]
pub enum MonoplexBipartiteGraphBuilderError {
#[error("Missing attribute: {0}")]
MissingAttribute(&'static str),
}
impl<G: MonoplexBipartiteGraph> GenericMonoplexBipartiteGraphBuilder<G>
where
G: TryFrom<(G::LeftNodes, G::RightNodes, G::Edges), Error = MonoplexBipartiteGraphBuilderError>,
{
#[inline]
pub fn build(self) -> Result<G, MonoplexBipartiteGraphBuilderError> {
G::try_from((
self.left_nodes
.ok_or(MonoplexBipartiteGraphBuilderError::MissingAttribute("left_nodes"))?,
self.right_nodes
.ok_or(MonoplexBipartiteGraphBuilderError::MissingAttribute("right_nodes"))?,
self.edges.ok_or(MonoplexBipartiteGraphBuilderError::MissingAttribute("edges"))?,
))
}
}