mirror of https://codeberg.org/topola/topola.git
68 lines
1.7 KiB
Rust
68 lines
1.7 KiB
Rust
use petgraph::stable_graph::StableDiGraph;
|
|
|
|
use crate::graph::{
|
|
BendIndex, DotIndex, Ends, Interior, Label, SegIndex, TaggedIndex, TaggedWeight,
|
|
};
|
|
use crate::primitive::{Bend, Dot, Seg};
|
|
|
|
#[derive(Debug, Clone, Copy)]
|
|
pub struct Bow {
|
|
seg1_dot1: DotIndex,
|
|
seg1: SegIndex,
|
|
seg1_dot2: DotIndex,
|
|
bend: BendIndex,
|
|
seg2_dot1: DotIndex,
|
|
seg2: SegIndex,
|
|
seg2_dot2: DotIndex,
|
|
}
|
|
|
|
impl Bow {
|
|
pub fn from_bend(index: BendIndex, graph: &StableDiGraph<TaggedWeight, Label, usize>) -> Self {
|
|
let bend = index;
|
|
|
|
let seg1_dot2 = Bend::new(bend, graph).prev().unwrap();
|
|
let seg1 = *Dot::new(seg1_dot2, graph)
|
|
.tagged_prev()
|
|
.unwrap()
|
|
.as_seg()
|
|
.unwrap();
|
|
let seg1_dot1 = Seg::new(seg1, graph).prev().unwrap();
|
|
|
|
let seg2_dot1 = Bend::new(bend, graph).next().unwrap();
|
|
let seg2 = *Dot::new(seg2_dot1, graph)
|
|
.tagged_next()
|
|
.unwrap()
|
|
.as_seg()
|
|
.unwrap();
|
|
let seg2_dot2 = Seg::new(seg2, graph).next().unwrap();
|
|
|
|
Self {
|
|
seg1_dot1,
|
|
seg1,
|
|
seg1_dot2,
|
|
bend,
|
|
seg2_dot1,
|
|
seg2,
|
|
seg2_dot2,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Interior<TaggedIndex> for Bow {
|
|
fn interior(&self) -> Vec<TaggedIndex> {
|
|
vec![
|
|
TaggedIndex::Seg(self.seg1),
|
|
TaggedIndex::Dot(self.seg1_dot2),
|
|
TaggedIndex::Bend(self.bend),
|
|
TaggedIndex::Dot(self.seg2_dot1),
|
|
TaggedIndex::Seg(self.seg2),
|
|
]
|
|
}
|
|
}
|
|
|
|
impl Ends<DotIndex, DotIndex> for Bow {
|
|
fn ends(&self) -> (DotIndex, DotIndex) {
|
|
(self.seg1_dot1, self.seg2_dot2)
|
|
}
|
|
}
|