#![allow(unused)]
use std::rc::Rc;
use super::{MultiplexBase, MultiplexNode, weak_layers::WeakLayer};
mod directed;
mod undirected;
pub use directed::DirectedLayer;
pub use undirected::UndirectedLayer;
#[derive(Clone, PartialEq, Eq)]
pub enum Layer<N, L> {
Undirected(UndirectedLayer<N, L>),
Directed(DirectedLayer<N, L>),
}
impl<N, L> Layer<N, L>
where
N: Clone,
L: Clone,
{
pub(crate) fn rebase(&mut self, nodes: Rc<MultiplexBase<N>>) {
match self {
Layer::Undirected(ul) => ul.nodes = nodes.clone(),
Layer::Directed(dl) => dl.nodes = nodes.clone(),
}
}
fn rebase_with<F, N2>(&self, nodes: Rc<MultiplexBase<N>>, f: F) -> Layer<N2, L>
where
F: Fn(&MultiplexNode<N>) -> N2,
N2: Clone,
L: Clone,
N: Clone,
{
match self {
Layer::Undirected(ul) => Layer::Undirected({
let u = Rc::as_ref(&nodes).iter().map(|n| f(n));
let new_base = MultiplexBase::new(u);
UndirectedLayer {
edges: ul.edges.clone(),
weight: ul.weight.clone(),
edge_type: ul.edge_type,
nodes: new_base,
incidence: ul.incidence.clone(),
}
}),
Layer::Directed(dl) => Layer::Directed({
let u = Rc::as_ref(&nodes).iter().map(|n| f(n));
let new_base = MultiplexBase::new(u);
DirectedLayer {
edges: dl.edges.clone(),
weight: dl.weight.clone(),
edge_type: dl.edge_type,
nodes: new_base,
incidence: dl.incidence.clone(),
}
}),
}
}
pub(crate) fn restrict_to(&self, node_map: &Vec<Option<usize>>) -> Layer<N, L>
where
L: Clone,
{
match self {
Layer::Undirected(ul) => Layer::Undirected(ul.restrict_to(node_map)),
Layer::Directed(dl) => Layer::Directed(dl.restrict_to(node_map)),
}
}
pub(crate) fn weaken(self) -> WeakLayer<L>
where
L: Clone,
{
match self {
Layer::Undirected(ul) => WeakLayer::Undirected(ul.weaken()),
Layer::Directed(dl) => WeakLayer::Directed(dl.weaken()),
}
}
}