1use std::collections::HashSet;
2
3use crate::{
4 half_edge::{
5 builder::HedgeNodeBuilder,
6 involution::{EdgeIndex, Hedge, HedgeVec, Involution},
7 subgraph::{
8 subset::SubSet, BaseSubgraph, HedgeNode, Inclusion, InternalSubGraph, ModifySubSet,
9 SuBitGraph, SubSetIter, SubSetLike, SubSetOps,
10 },
11 swap::Swap,
12 HedgeGraph, HedgeGraphError, NodeIndex, NodeVec,
13 },
14 tree::{
15 parent_pointer::{PPNode, ParentPointerStore},
16 Forest, RootData, RootId,
17 },
18};
19
20use super::{NodeStorage, NodeStorageOps};
21
22#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
25pub struct NodeStorageVec<N> {
47 pub(crate) node_data: NodeVec<N>,
49 pub(crate) hedge_data: HedgeVec<NodeIndex>,
51 pub(crate) nodes: NodeVec<SuBitGraph>, }
55
56#[derive(Clone, Debug)]
57pub struct BitVecNeighborIter<'a> {
63 iter_ones: SubSetIter<'a>,
65 len: Hedge,
67}
68
69impl<'a> From<&'a SuBitGraph> for BitVecNeighborIter<'a> {
70 fn from(value: &'a SuBitGraph) -> Self {
71 Self {
72 iter_ones: value.included_iter(),
73 len: Hedge(value.size()),
74 }
75 }
76}
77
78impl<'a> From<BitVecNeighborIter<'a>> for SuBitGraph {
79 fn from(value: BitVecNeighborIter<'a>) -> Self {
80 let len = value.len;
81 SuBitGraph::from_hedge_iter(value, len.0)
82 }
83}
84
85impl<'a> From<BitVecNeighborIter<'a>> for HedgeNode {
86 fn from(value: BitVecNeighborIter<'a>) -> Self {
87 HedgeNode {
88 internal_graph: InternalSubGraph::empty(value.len.0),
89 hairs: value.into(),
90 }
91 }
92}
93
94impl Iterator for BitVecNeighborIter<'_> {
95 type Item = Hedge;
96 fn next(&mut self) -> Option<Self::Item> {
97 self.iter_ones.next()
98 }
99}
100
101impl ExactSizeIterator for BitVecNeighborIter<'_> {
102 fn len(&self) -> usize {
103 self.iter_ones.len()
104 }
105}
106
107impl<N> NodeStorage for NodeStorageVec<N> {
108 type NodeData = N;
109 type Neighbors = SuBitGraph;
110 type NeighborsIter<'a>
111 = BitVecNeighborIter<'a>
112 where
113 Self: 'a;
114 type Storage<M> = NodeStorageVec<M>;
115}
116
117impl<N> NodeStorageVec<N> {
118 fn from_hairs_and_data(
132 node_data: impl Into<NodeVec<N>>,
133 nodes: impl Into<NodeVec<SuBitGraph>>,
134 ) -> Option<Self> {
135 let nodes = nodes.into();
136 let node_data = node_data.into();
137 let n_hedges = nodes[NodeIndex(0)].size();
138 let mut hedge_data: HedgeVec<_> = vec![None; n_hedges].into();
139
140 for (i, n) in nodes.iter() {
141 for h in n.included_iter() {
143 hedge_data[h] = Some(i);
144 }
145 }
146 Some(Self {
147 node_data,
148 hedge_data: hedge_data
149 .into_iter()
150 .map(|(_, i)| i)
151 .collect::<Option<HedgeVec<_>>>()?,
152 nodes,
153 })
154 }
155}
156
157impl<N> Swap<Hedge> for NodeStorageVec<N> {
158 fn is_zero_length(&self) -> bool {
159 self.hedge_data.is_zero_length()
160 }
161 fn len(&self) -> Hedge {
162 self.hedge_data.len()
163 }
164
165 fn swap(&mut self, a: Hedge, b: Hedge) {
166 if a != b {
167 let node_a = self.hedge_data[a];
168 let node_b = self.hedge_data[b];
169
170 self.hedge_data.swap(a, b);
171 self.hedge_data[a] = node_b;
172 self.hedge_data[b] = node_a;
173
174 self.nodes[node_a].swap(a, b);
175 self.nodes[node_b].swap(a, b);
176 }
177 }
178}
179
180impl<N> Swap<NodeIndex> for NodeStorageVec<N> {
181 fn is_zero_length(&self) -> bool {
182 self.nodes.is_zero_length()
183 }
184
185 fn len(&self) -> NodeIndex {
186 self.nodes.len()
187 }
188
189 fn swap(&mut self, a: NodeIndex, b: NodeIndex) {
190 if a != b {
191 for i in self.nodes[a].included_iter() {
192 self.hedge_data[i] = b;
193 }
194 for i in self.nodes[b].included_iter() {
195 self.hedge_data[i] = a;
196 }
197 self.node_data.swap(a, b);
198 self.nodes.swap(a, b);
199 }
200 }
201}
202
203impl<N> NodeStorageOps for NodeStorageVec<N> {
204 type OpStorage<A> = Self::Storage<A>;
205 type Base = SuBitGraph;
206
207 fn check_nodes(&self) -> Result<(), HedgeGraphError> {
208 for (h, n) in &self.hedge_data {
209 if !self.nodes[*n].includes(&h) {
210 Err(HedgeGraphError::NodeDoesNotContainHedge(*n, h))?;
211 }
212 }
213
214 let self_n_h: Hedge = self.len();
215 let mut cover = Self::Base::empty(self_n_h.0);
216 for (i, node) in self.nodes.iter() {
217 for h in node.included_iter() {
218 if cover.includes(&h) {
219 return Err(HedgeGraphError::NodesDoNotPartition(format!(
220 "They overlap for node {i}: Cover:{cover:?}, crown: {h:?}"
221 )));
222 } else {
223 cover.add(h);
224 }
225 }
226 }
227
228 let full = !Self::Base::empty(self_n_h.0);
229
230 if !(cover.sym_diff(&full).is_empty()) {
231 return Err(HedgeGraphError::NodesDoNotPartition(format!(
232 "They do not cover the whole graph: cover {cover:?}"
233 )));
234 }
235
236 Ok(())
237 }
238
239 fn delete<S: SubSetLike<Base = Self::Base>>(&mut self, subgraph: &S) {
240 let mut left = Hedge(0);
242 let mut extracted = self.len();
243 while left < extracted {
244 if !subgraph.includes(&left) {
245 left.0 += 1;
247 } else {
248 extracted.0 -= 1;
250 if !subgraph.includes(&extracted) {
251 self.swap(left, extracted);
253 left.0 += 1;
254 }
255 }
256 }
257
258 let mut left_nodes = NodeIndex(0);
261 let mut extracted_nodes = self.len();
262 while left_nodes < extracted_nodes {
263 if !self.nodes[left_nodes].has_greater(left) {
264 left_nodes.0 += 1;
266 } else {
267 extracted_nodes.0 -= 1;
269 if !self.nodes[extracted_nodes].has_greater(left) {
270 self.swap(left_nodes, extracted_nodes);
272 left_nodes.0 += 1;
273 }
274 }
275 }
276
277 let mut overlapping_nodes = left_nodes;
278 let mut non_overlapping_extracted = self.len();
279
280 while overlapping_nodes < non_overlapping_extracted {
281 if self.nodes[overlapping_nodes].intersects(&(..left)) {
282 overlapping_nodes.0 += 1;
284 } else {
285 non_overlapping_extracted.0 -= 1;
287 if self.nodes[non_overlapping_extracted].intersects(&(..left)) {
288 self.swap(overlapping_nodes, non_overlapping_extracted);
290 overlapping_nodes.0 += 1;
291 }
292 }
293 }
294
295 let _ = self.nodes.split_off(overlapping_nodes);
296 let _ = self.node_data.split_off(overlapping_nodes);
297 let _ = self.hedge_data.split_off(left);
298
299 for i in 0..(left_nodes.0) {
300 let _ = self.nodes[NodeIndex(i)].split_off(left);
301 }
305 for i in (left_nodes.0)..(overlapping_nodes.0) {
306 let _ = self.nodes[NodeIndex(i)].split_off(left);
307 }
308 }
309
310 fn extract_nodes(&mut self, nodes: impl IntoIterator<Item = NodeIndex>) -> (SuBitGraph, Self) {
311 let nodes: HashSet<NodeIndex> = nodes.into_iter().collect();
312 let left_nodes = <Self as Swap<NodeIndex>>::partition(self, |n| !nodes.contains(n));
313
314 let mut extracted = SuBitGraph::empty(self.hedge_data.len().0);
315
316 for i in left_nodes.0..self.node_data.len().0 {
317 extracted.union_with(&self.nodes[NodeIndex(i)]);
318 }
319
320 let left = <Self as Swap<Hedge>>::partition(self, |h| !extracted.includes(h));
321
322 let mut extracted_neighbors = self.nodes.split_off(left_nodes);
323 for (_, s) in &mut self.nodes {
324 s.split_off(left);
325 }
326
327 for (_, s) in &mut extracted_neighbors {
328 *s = s.split_off(left);
329 }
330
331 let extracted_data = self.node_data.split_off(left_nodes);
332 let extracted_hedges = self
333 .hedge_data
334 .split_off(left)
335 .into_iter()
336 .map(|(h, mut n)| {
337 n -= left_nodes;
338 (h, n)
340 })
341 .collect();
342
343 (
344 extracted,
345 Self {
346 nodes: extracted_neighbors,
347 node_data: extracted_data,
348 hedge_data: extracted_hedges,
349 },
350 )
351 }
352
353 fn extract<S: SubSetLike<Base = SuBitGraph>, V2>(
354 &mut self,
355 subgraph: &S,
356 mut split_node: impl FnMut(&Self::NodeData) -> V2,
357 mut owned_node: impl FnMut(Self::NodeData) -> V2,
358 ) -> Self::OpStorage<V2> {
359 let mut left = Hedge(0);
360 let mut extracted = self.len();
361 while left < extracted {
363 if !subgraph.includes(&left) {
364 left.0 += 1;
366 } else {
367 extracted.0 -= 1;
369 if !subgraph.includes(&extracted) {
370 self.swap(left, extracted);
372 left.0 += 1;
373 }
374 }
375 }
376
377 let mut left_nodes = NodeIndex(0);
380 let mut extracted_nodes = self.len();
381 while left_nodes < extracted_nodes {
382 if !self.nodes[left_nodes].has_greater(left) {
383 left_nodes.0 += 1;
385 } else {
386 extracted_nodes.0 -= 1;
392 if !self.nodes[extracted_nodes].has_greater(left) {
395 self.swap(left_nodes, extracted_nodes);
397 left_nodes.0 += 1;
398 }
399 }
400 }
401 let mut overlapping_nodes = left_nodes;
404 let mut non_overlapping_extracted = self.len();
405
406 while overlapping_nodes < non_overlapping_extracted {
407 if self.nodes[overlapping_nodes].intersects(&(..left)) {
408 overlapping_nodes.0 += 1;
410 } else {
411 non_overlapping_extracted.0 -= 1;
413 if self.nodes[non_overlapping_extracted].intersects(&(..left)) {
414 self.swap(overlapping_nodes, non_overlapping_extracted);
416 overlapping_nodes.0 += 1;
417 }
418 }
419 }
420
421 let mut extracted_nodes = self.nodes.split_off(overlapping_nodes);
425 let mut extracted_data: NodeVec<_> = self
426 .node_data
427 .split_off(overlapping_nodes)
428 .into_iter()
429 .map(|(_nid, n)| owned_node(n))
430 .collect();
431
432 let _ = self.hedge_data.split_off(left);
433
434 let mut overlapping_node_hairs = NodeVec::new();
435 let mut overlapping_data = NodeVec::new();
436
437 for i in 0..(left_nodes.0) {
438 let _ = self.nodes[NodeIndex(i)].split_off(left);
439 }
443 for i in (left_nodes.0)..(overlapping_nodes.0) {
444 overlapping_data.push(split_node(&self.node_data[NodeIndex(i)]));
445 let overlapped = self.nodes[NodeIndex(i)].split_off(left);
448 overlapping_node_hairs.push(overlapped);
450 }
451
452 for (_, h) in &mut extracted_nodes {
453 *h = h.split_off(left);
455
456 }
458
459 extracted_nodes.extend(overlapping_node_hairs);
460 extracted_data.extend(overlapping_data);
461
462 NodeStorageVec::from_hairs_and_data(extracted_data, extracted_nodes)
463 .expect("Extracted nodes should cover extracted hedges")
464 }
465
466 fn identify_nodes(
474 &mut self,
475 nodes: &[NodeIndex],
476 node_data_merge: Self::NodeData,
477 ) -> NodeIndex {
478 let n_nodes: NodeIndex = self.len();
479 let n_hedgs: Hedge = self.len();
480 let mut removed = SubSet::<NodeIndex>::empty(n_nodes.0);
481 let mut full_node = SuBitGraph::empty(n_hedgs.0);
482
483 for n in nodes {
484 removed.add(*n);
485 full_node.union_with(&self.nodes[*n]);
486 }
487
488 let replacement = removed.included_iter().next().unwrap();
489
490 for r in removed.included_iter().skip(1).rev() {
491 for (_, hedge) in self.hedge_data.iter_mut() {
495 if *hedge == r {
496 *hedge = replacement;
497 }
498 }
499
500 }
518
519 self.nodes[replacement] = full_node;
520 self.node_data[replacement] = node_data_merge;
521
522 replacement
523 }
524
525 fn forget_identification_history(&mut self) -> NodeVec<Self::NodeData> {
526 let n_nodes: NodeIndex = self.len();
527 let mut to_keep: SubSet<NodeIndex> = SubSet::empty(n_nodes.0);
528
529 for (_, h) in &self.hedge_data {
530 to_keep.add(*h);
531 }
532
533 let notk = !to_keep.clone();
534 let n_hedges: Hedge = self.len();
535 for n in notk.included_iter() {
536 self.nodes[n] = SuBitGraph::empty(n_hedges.0);
537 }
538
539 let mut left_nodes = NodeIndex(0);
540 let mut extracted_nodes = n_nodes;
541 while left_nodes < extracted_nodes {
542 if to_keep[left_nodes] {
543 left_nodes.0 += 1;
545 } else {
546 extracted_nodes.0 -= 1;
548 if to_keep[extracted_nodes] {
549 self.swap(left_nodes, extracted_nodes);
551 left_nodes.0 += 1;
553 }
554 }
555 }
556
557 let _ = self.nodes.split_off(left_nodes);
558 self.node_data.split_off(left_nodes)
559 }
560
561 fn to_forest<U, H>(
562 &self,
563 map_data: impl Fn(&Self::NodeData) -> U,
564 ) -> Forest<U, ParentPointerStore<H>> {
565 let n_hedges: Hedge = self.len();
566 let mut nodes: Vec<_> = std::iter::repeat_with(|| None).take(n_hedges.0).collect();
567
568 let mut roots = vec![];
569
570 for ((_, set), (_, d)) in self.nodes.iter().zip(&self.node_data) {
571 let mut first = None;
572 for i in set.included_iter() {
573 if let Some(root) = first {
574 nodes[i.0] = Some(PPNode::dataless_child(root))
575 } else {
576 first = Some(i.into());
577 nodes[i.0] = Some(PPNode::dataless_root(RootId(roots.len())));
578 }
579 }
580 roots.push(RootData {
581 root_id: first.unwrap(),
582 data: map_data(d),
583 });
584 }
585 Forest {
586 nodes: nodes
587 .into_iter()
588 .collect::<Option<Vec<_>>>()
589 .unwrap()
590 .into_iter()
591 .collect(),
592 roots,
593 }
594 }
595
596 fn iter(&self) -> impl Iterator<Item = (NodeIndex, &Self::NodeData)> {
597 self.node_data.iter()
598 }
599
600 fn drain(self) -> impl Iterator<Item = (NodeIndex, Self::NodeData)> {
601 self.node_data.into_iter()
602 }
603 fn build<I: IntoIterator<Item = HedgeNodeBuilder<N>>>(node_iter: I, n_hedges: usize) -> Self {
604 let mut nodes: NodeVec<SuBitGraph> = NodeVec::new();
605 let mut node_data = NodeVec::new();
606 let mut hedgedata: HedgeVec<_> = vec![None; n_hedges].into();
607
608 for (i, n) in node_iter.into_iter().enumerate() {
609 for h in &n.hedges {
610 hedgedata[*h] = Some(NodeIndex(i));
611 }
612 nodes.push(n.to_base(n_hedges));
613 node_data.push(n.data);
614 }
615
616 let hedge_data = hedgedata.into_iter().map(|(_, x)| x.unwrap()).collect();
617
618 NodeStorageVec {
619 node_data,
620 hedge_data,
621 nodes,
622 }
623 }
624
625 fn build_with_mapping<I: IntoIterator<Item = HedgeNodeBuilder<ND>>, ND>(
626 node_iter: I,
627 n_hedges: usize,
628 mut map_data: impl FnMut(ND) -> Self::NodeData,
629 ) -> Self {
630 let mut nodes: NodeVec<SuBitGraph> = NodeVec::new();
631 let mut node_data = NodeVec::new();
632 let mut hedgedata: HedgeVec<_> = vec![None; n_hedges].into();
633
634 for (i, n) in node_iter.into_iter().enumerate() {
635 for h in &n.hedges {
636 hedgedata[*h] = Some(NodeIndex(i));
637 }
638 nodes.push(n.to_base(n_hedges));
639 node_data.push(map_data(n.data));
640 }
641
642 let hedge_data = hedgedata.into_iter().map(|(_, x)| x.unwrap()).collect();
643
644 NodeStorageVec {
645 node_data,
646 hedge_data,
647 nodes,
648 }
649 }
650
651 fn iter_nodes(
652 &self,
653 ) -> impl Iterator<Item = (NodeIndex, Self::NeighborsIter<'_>, &Self::NodeData)> {
654 self.nodes
655 .iter()
656 .map(|(_, b)| b.into())
657 .zip(self.node_data.iter())
658 .map(|(node, (id, data))| (id, node, data))
659 }
660
661 fn iter_nodes_mut(
662 &mut self,
663 ) -> impl Iterator<Item = (NodeIndex, Self::NeighborsIter<'_>, &mut Self::NodeData)> {
664 self.nodes
665 .iter()
666 .map(|(_, b)| b.into())
667 .zip(self.node_data.iter_mut())
668 .map(|(node, (id, data))| (id, node, data))
669 }
670
671 fn node_id_ref(&self, hedge: Hedge) -> NodeIndex {
672 self.hedge_data[hedge]
673 }
674
675 fn get_neighbor_iterator(&self, node_id: NodeIndex) -> Self::NeighborsIter<'_> {
680 BitVecNeighborIter {
681 iter_ones: self.nodes[node_id].included_iter(),
682 len: self.len(),
683 }
684 }
685
686 fn get_node_data(&self, node_id: NodeIndex) -> &N {
687 &self.node_data[node_id]
688 }
689
690 fn get_node_data_mut(&mut self, node_id: NodeIndex) -> &mut Self::NodeData {
691 &mut self.node_data[node_id]
692 }
693
694 fn extend(self, other: Self) -> Self {
695 let self_n_h: Hedge = self.len();
696 let other_n_h: Hedge = other.len();
697 let self_empty_filter = SuBitGraph::empty(self_n_h.0);
698 let other_empty_filter = SuBitGraph::empty(other_n_h.0);
699 let mut node_data = self.node_data;
700 node_data.extend(other.node_data);
701
702 let nodes: NodeVec<_> = self
703 .nodes
704 .into_iter()
705 .map(|(_, k)| k.join(other_empty_filter.clone()))
706 .chain(other.nodes.into_iter().map(|(_, k)| {
707 let new_hairs = self_empty_filter.clone();
708 new_hairs.join(k.clone())
709 }))
710 .collect();
711
712 let mut hedge_data = self.hedge_data;
713 hedge_data.extend(other.hedge_data);
714
715 NodeStorageVec {
716 node_data,
717 hedge_data,
718 nodes,
719 }
720 }
721
722 fn extend_mut(&mut self, other: Self) {
723 let self_n_h: Hedge = self.len();
724 let other_n_h: Hedge = other.len();
725 let self_empty_filter = SuBitGraph::empty(self_n_h.0);
726 let other_empty_filter = SuBitGraph::empty(other_n_h.0);
727 let node_data = &mut self.node_data;
728 node_data.extend(other.node_data);
729
730 for (_, n) in self.nodes.iter_mut() {
731 n.join_mut(other_empty_filter.clone());
732 }
733
734 let nodes: NodeVec<_> = other
735 .nodes
736 .into_iter()
737 .map(|(_, k)| {
738 let new_hairs = self_empty_filter.clone();
739 new_hairs.join(k.clone())
740 })
741 .collect();
742
743 self.nodes.extend(nodes);
744
745 self.hedge_data.extend(other.hedge_data);
746 }
747 fn add_dangling_edge(self, source: NodeIndex) -> Result<Self, HedgeGraphError> {
748 if self.nodes.len() <= source {
749 return Err(HedgeGraphError::NoNode);
750 }
751 let nodes: NodeVec<_> = self
752 .nodes
753 .into_iter()
754 .map(|(i, mut k)| {
755 if i == source {
756 k.push(true);
757 } else {
758 k.push(false);
759 }
760 k
761 })
762 .collect();
763 let mut hedge_data = self.hedge_data;
764 hedge_data.push(source);
765
766 Ok(NodeStorageVec {
767 node_data: self.node_data,
768 hedge_data,
769 nodes,
770 })
771 }
772
773 fn random(sources: &[Self::Neighbors], sinks: &[Self::Neighbors]) -> Self
774 where
775 N: Default,
776 {
777 let mut nodes = NodeVec::new();
778 let mut node_data: NodeVec<N> = NodeVec::new();
779
780 let mut hedge_data: HedgeVec<_> = vec![NodeIndex(0); sources[0].n_included()].into();
781
782 for (nid, n) in sources.iter().enumerate() {
783 nodes.push(n.clone());
784 node_data.push(N::default());
785 for i in n.included_iter() {
786 hedge_data[i] = NodeIndex(nid);
787 }
788 }
789
790 let len = nodes.len();
791
792 for (nid, n) in sinks.iter().enumerate() {
793 nodes.push(n.clone());
794 node_data.push(N::default());
795
796 for i in n.included_iter() {
797 hedge_data[i] = NodeIndex(nid) + len;
798 }
799 }
800
801 NodeStorageVec {
802 node_data,
803 hedge_data,
804 nodes,
805 }
806 }
807
808 fn check_and_set_nodes(&mut self) -> Result<(), HedgeGraphError> {
809 let self_n_h: Hedge = self.len();
810 let mut cover = SuBitGraph::empty(self_n_h.0);
811 for (i, node) in self.nodes.iter() {
812 for h in node.included_iter() {
813 if cover.includes(&h) {
814 return Err(HedgeGraphError::NodesDoNotPartition(format!(
815 "They overlap. Cover:{cover:?}, crown: {h:?}"
816 )));
817 } else {
818 cover.add(h);
819 self.hedge_data[h] = i;
820 }
821 }
822 }
823
824 let full = !SuBitGraph::empty(self_n_h.0);
825
826 if !(cover.sym_diff(&full).is_empty()) {
827 return Err(HedgeGraphError::NodesDoNotPartition(format!(
828 "They do not cover the whole graph: cover {cover:?}"
829 )));
830 }
831
832 Ok(())
833 }
834
835 fn map_data_ref_graph<'a, E, V2, H>(
836 &'a self,
837 graph: &'a HedgeGraph<E, Self::NodeData, H, Self>,
838 mut node_map: impl FnMut(
839 &'a HedgeGraph<E, Self::NodeData, H, Self>,
840 Self::NeighborsIter<'a>,
841 &'a Self::NodeData,
842 ) -> V2,
843 ) -> Self::OpStorage<V2> {
844 let node_data = self
845 .node_data
846 .iter()
847 .zip(self.nodes.iter())
848 .map(|((_, v), (_, h))| node_map(graph, h.into(), v))
849 .collect();
850
851 NodeStorageVec {
852 node_data,
853 hedge_data: self.hedge_data.clone(),
854 nodes: self.nodes.clone(),
855 }
856 }
857
858 fn map_data_ref_mut_graph<'a, V2>(
899 &'a mut self,
900 mut node_map: impl FnMut(Self::NeighborsIter<'a>, &'a mut Self::NodeData) -> V2,
901 ) -> Self::OpStorage<V2> {
902 let node_data = self
903 .node_data
904 .iter_mut()
905 .zip(self.nodes.iter())
906 .map(|((_, v), (_, h))| node_map(h.into(), v))
907 .collect();
908
909 NodeStorageVec {
910 node_data,
911 hedge_data: self.hedge_data.clone(),
912 nodes: self.nodes.clone(),
913 }
914 }
915
916 fn map_data_ref_graph_result<'a, E, V2, H, Er>(
917 &'a self,
918 graph: &'a HedgeGraph<E, Self::NodeData, H, Self>,
919 mut node_map: impl FnMut(
920 &'a HedgeGraph<E, Self::NodeData, H, Self>,
921 Self::NeighborsIter<'a>,
922 &'a Self::NodeData,
923 ) -> Result<V2, Er>,
924 ) -> Result<Self::OpStorage<V2>, Er> {
925 let node_data: Result<NodeVec<_>, Er> = self
926 .node_data
927 .iter()
928 .zip(self.nodes.iter())
929 .map(|((_, v), (_, h))| node_map(graph, h.into(), v))
930 .collect();
931
932 Ok(NodeStorageVec {
933 node_data: node_data?,
934 hedge_data: self.hedge_data.clone(),
935 nodes: self.nodes.clone(),
936 })
937 }
938
939 fn map_data_graph<'a, V2>(
940 self,
941 involution: &'a Involution<EdgeIndex>,
942 mut f: impl FnMut(&'a Involution<EdgeIndex>, NodeIndex, Self::NodeData) -> V2,
943 ) -> Self::OpStorage<V2> {
944 let node_data = self
945 .node_data
946 .into_iter()
947 .map(|(i, v)| f(involution, i, v))
948 .collect();
949
950 NodeStorageVec {
951 node_data,
952 hedge_data: self.hedge_data,
953 nodes: self.nodes,
954 }
955 }
956
957 fn map_data_graph_result<'a, V2, Err>(
958 self,
959 involution: &'a Involution<EdgeIndex>,
960 mut f: impl FnMut(&'a Involution<EdgeIndex>, NodeIndex, Self::NodeData) -> Result<V2, Err>,
961 ) -> Result<Self::OpStorage<V2>, Err> {
962 let node_data = self
963 .node_data
964 .into_iter()
965 .map(|(i, v)| f(involution, i, v))
966 .collect::<Result<NodeVec<_>, Err>>()?;
967 Ok(NodeStorageVec {
968 node_data,
969 hedge_data: self.hedge_data,
970 nodes: self.nodes,
971 })
972 }
973
974 fn new_nodevec<'a, V2>(
975 &'a self,
976 mut node_map: impl FnMut(NodeIndex, Self::NeighborsIter<'a>, &'a Self::NodeData) -> V2,
977 ) -> NodeVec<V2> {
978 self.node_data
979 .iter()
980 .zip(self.nodes.iter())
981 .map(|((i, v), (_, h))| node_map(i, h.into(), v))
982 .collect()
983 }
984}