weavatrix-graph 0.6.0

Deterministic, evidence-carrying graph primitives for repository intelligence
Documentation
use crate::{EdgeEndpoints, GraphView, IndexGraphView};

#[derive(Debug, Clone, Copy)]
pub struct Reversed<'graph, G> {
    graph: &'graph G,
}

impl<'graph, G> Reversed<'graph, G> {
    #[must_use]
    pub const fn new(graph: &'graph G) -> Self {
        Self { graph }
    }

    #[must_use]
    pub const fn inner(&self) -> &'graph G {
        self.graph
    }
}

impl<G: GraphView> GraphView for Reversed<'_, G> {
    type Node = G::Node;
    type Edge = G::Edge;

    fn node_count(&self) -> usize {
        self.graph.node_count()
    }

    fn edge_count(&self) -> usize {
        self.graph.edge_count()
    }

    fn contains_node(&self, node: Self::Node) -> bool {
        self.graph.contains_node(node)
    }

    fn contains_edge(&self, edge: Self::Edge) -> bool {
        self.graph.contains_edge(edge)
    }

    fn node_indices(&self) -> impl Iterator<Item = Self::Node> + '_ {
        self.graph.node_indices()
    }

    fn edge_indices(&self) -> impl Iterator<Item = Self::Edge> + '_ {
        self.graph.edge_indices()
    }

    fn edge_endpoints(&self, edge: Self::Edge) -> Option<EdgeEndpoints<Self::Node>> {
        let endpoints = self.graph.edge_endpoints(edge)?;
        Some(EdgeEndpoints::new(endpoints.target(), endpoints.source()))
    }

    fn outgoing_edges(&self, node: Self::Node) -> impl Iterator<Item = Self::Edge> + '_ {
        self.graph.incoming_edges(node)
    }

    fn incoming_edges(&self, node: Self::Node) -> impl Iterator<Item = Self::Edge> + '_ {
        self.graph.outgoing_edges(node)
    }
}

impl<G: IndexGraphView> IndexGraphView for Reversed<'_, G> {
    fn node_bound(&self) -> usize {
        self.graph.node_bound()
    }

    fn edge_bound(&self) -> usize {
        self.graph.edge_bound()
    }

    fn node_slot(node: Self::Node) -> usize {
        G::node_slot(node)
    }

    fn edge_slot(edge: Self::Edge) -> usize {
        G::edge_slot(edge)
    }
}

#[must_use]
pub const fn reversed<G>(graph: &G) -> Reversed<'_, G> {
    Reversed::new(graph)
}