hypergraphx 0.0.5

A hypergraph library for Rust, based on the Python library of the same name.
Documentation
#![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()),
        }
    }
}