1use std::{
2 rc::{
3 Weak,
4 Rc
5 }
6};
7
8use std::fmt::Debug;
9
10use crate::cell::{
11 HedelCell,
12 RefHedel,
13 RefMutHedel,
14};
15use crate::{
16 list::{
17 WeakList,
18 List
19 }
20};
21use crate::errors::HedelError;
22
23#[derive(Debug, Clone)]
26pub struct NodeInner<T: Debug + Clone> {
27 pub next: Option<Node<T>>,
28 pub prev: Option<WeakNode<T>>,
29 pub child: Option<Node<T>>,
30 pub parent: Option<WeakNode<T>>,
31 pub list: Option<WeakList<T>>,
32 pub content: T
33}
34
35#[derive(Debug, Clone)]
42pub struct WeakNode<T: Debug + Clone> {
43 pub inner: Weak<HedelCell<NodeInner<T>>>
44}
45
46impl<T: Debug + Clone> WeakNode<T> {
47 pub fn upgrade(&self) -> Option<Node<T>> {
49 Some(Node::<T> {
50 inner: self.inner.upgrade()?
51 })
52 }
53}
54
55#[derive(Debug)]
58pub struct Node<T: Debug + Clone > {
59 pub inner: Rc<HedelCell<NodeInner<T>>>,
60}
61
62impl<T: Debug + Clone> Clone for Node<T> {
63 fn clone(&self) -> Self {
64 Self {
65 inner: Rc::clone(&self.inner),
66 }
67 }
68}
69
70impl<T: Debug + Clone> Node<T> {
71 pub fn new(content: T) -> Self {
75 Self {
76 inner: Rc::new(HedelCell::new(NodeInner::<T> {
77 next: None,
78 prev: None,
79 child: None,
80 parent: None,
81 list: None,
82 content
83 })),
84 }
85 }
86
87 pub fn downgrade(&self) -> WeakNode<T> {
90 WeakNode {
91 inner: Rc::downgrade(&self.inner)
92 }
93 }
94
95 pub fn try_get(&self) -> Result<RefHedel<NodeInner<T>>, HedelError> {
98 Ok(self.inner.try_get()?)
99 }
100
101 pub fn get(&self) -> RefHedel<NodeInner<T>> {
104 self.inner.get()
105 }
106
107 pub fn try_get_mut(&self) -> RefMutHedel<'_, NodeInner<T>> {
110 self.inner.get_mut()
111 }
112
113 pub fn get_mut(&self) -> RefMutHedel<'_, NodeInner<T>> {
116 self.inner.get_mut()
117 }
118
119 pub fn next(&self) -> Option<Node<T>> {
121 self.get().next.clone()
122 }
123
124 pub fn prev(&self) -> Option<Node<T>> {
126 if let Some(ref p) = self.get().prev {
127 return p.upgrade()
128 } None
129 }
130
131 pub fn parent(&self) -> Option<Node<T>> {
133 if let Some(ref p) = self.get().parent {
134 return p.upgrade();
135 } None
136 }
137
138 pub fn list(&self) -> Option<List<T>> {
140 if let Some(ref l) = self.get().list {
141 return Some(l.upgrade()?);
142 } None
143 }
144
145 pub fn child(&self) -> Option<Node<T>> {
147 self.get().child.clone()
148 }
149
150 pub fn to_content(self) -> T {
151 self.get().content.clone()
152 }
153
154 pub fn free(&self) {
164 let mut node = self.get_mut();
165 node.parent = None;
166 node.next = None;
167 node.prev = None;
168 }
169}
170
171#[macro_export]
190macro_rules! as_content {
191 ($self: expr, |$ident: ident| $cl: expr) => {
192 {
193 let $ident = $self.get().content;
194 $cl
195 }
196 }
197}
198
199pub trait DetachNode<T: Debug + Clone> {
200 fn detach(&self);
201 fn detach_preserve(&self, vec: &mut NodeCollection<T>);
202}
203
204impl<T: Debug + Clone> DetachNode<T> for Node<T> {
205 fn detach(&self) {
212 let mut tuple: (Option<Node<T>>, Option<Node<T>>) = ( None, None );
214
215 if let Some(one) = self.prev() {
216 if let Some(three) = self.next() {
218 tuple = (Some(one), Some(three));
219 } else {
220 tuple = (Some(one), None);
222 }
223 } else {
224 if let Some(three) = self.next() {
226 tuple = ( None, Some(three));
227 }
228 }
229
230 match tuple {
231 (Some(one), Some(three)) => {
232 one.get_mut().next = Some(three.clone());
233 three.get_mut().prev = Some(one.downgrade());
234 },
235 (Some(one), None) => {
236 one.get_mut().next = None;
237 },
238 (None, Some(three)) => {
239 three.get_mut().prev = None;
240 if let Some(parent) = self.parent() {
241 parent.get_mut().child = Some(three.clone());
242 }
243 },
244 (None, None) => {
245 if let Some(parent) = self.parent() {
246 parent.get_mut().child = None;
247 }
248 }
249 }
250
251 self.free();
252 }
253 fn detach_preserve(&self, vec: &mut NodeCollection<T>) {
328 let mut tuple: (Option<Node<T>>, Option<Node<T>>) = ( None, None );
330
331 if let Some(one) = self.prev() {
332 if let Some(three) = self.next() {
334 tuple = (Some(one), Some(three));
335 } else {
336 tuple = (Some(one), None);
338 }
339 } else {
340 if let Some(three) = self.next() {
342 tuple = ( None, Some(three));
343 }
344 }
345
346 match tuple {
347 (Some(one), Some(three)) => {
348 one.get_mut().next = Some(three.clone());
349 three.get_mut().prev = Some(one.downgrade());
350 },
351 (Some(one), None) => {
352 one.get_mut().next = None;
353 },
354 (None, Some(three)) => {
355 three.get_mut().prev = None;
356 if let Some(parent) = self.parent() {
357 parent.get_mut().child = Some(three.clone());
358 }
359 },
360 (None, None) => {
361 if let Some(parent) = self.parent() {
362 parent.get_mut().child = None;
363 }
364 }
365 }
366
367 vec.push(self.clone());
368 }
369}
370
371pub struct NodeCollection<T: Debug + Clone> {
376 pub nodes: Vec<Node<T>>
377}
378
379impl<T: Debug + Clone> NodeCollection<T> {
380
381 pub fn from_vec(nodes: Vec<Node<T>>) -> Self {
383 Self {
384 nodes
385 }
386 }
387
388 pub fn new() -> Self {
389 Self {
390 nodes: Vec::new()
391 }
392 }
393 pub fn into_nodes(self) -> Vec<Node<T>> {
395 self.nodes
396 }
397
398 pub fn as_nodes(&self) -> &Vec<Node<T>> {
400 &self.nodes
401 }
402
403 pub fn as_mut_nodes(&mut self) -> &mut Vec<Node<T>> {
405 &mut self.nodes
406 }
407
408 pub fn push(&mut self, node: Node<T>) {
410 self.nodes.push(node);
411 }
412
413 pub fn free(&self) {
420 for node in self.nodes.iter() {
421 node.free();
422 }
423 }
424
425}
426
427impl<T: Debug + Clone> IntoIterator for NodeCollection<T> {
428 type Item = Node<T>;
429 type IntoIter = std::vec::IntoIter<Node<T>>;
430
431 fn into_iter(self) -> Self::IntoIter {
432 self.nodes.into_iter()
433 }
434}
435
436pub trait CompareNode<T: Debug + Clone> {
466 fn compare(&self, node: &Node<T>) -> bool;
467}
468
469pub trait CollectNode<T: Debug + Clone, I: CompareNode<T>> {
470 fn collect_siblings(&self, ident: &I) -> NodeCollection<T>;
471 fn collect_children(&self, ident: &I) -> NodeCollection<T>;
472 fn collect_linked_list(&self, ident: &I) -> NodeCollection<T>;
473}
474
475impl<T: Debug + Clone, I: CompareNode<T>> CollectNode<T, I> for Node<T> {
476 fn collect_siblings(&self, ident: &I) -> NodeCollection<T> {
480
481 let mut collection = Vec::new();
482
483 if ident.compare(&self) {
484 collection.push(self.clone());
485 }
486
487 let mut current;
491
492 if let Some(prev) = self.prev() {
493
494 {
495
496 current = prev;
497
498 if ident.compare(¤t) {
499 collection.push(current.clone());
500 }
501
502 } while let Some(prev) = current.prev() {
503
504 current = prev;
505
506 if ident.compare(¤t) {
507 collection.push(current.clone());
508 }
509 }
510 }
511
512 if let Some(next) = self.next() {
513
514 {
515
516 current = next;
517
518 if ident.compare(¤t) {
519 collection.push(current.clone());
520 }
521
522 } while let Some(next) = current.next() {
523
524 current = next;
525
526 if ident.compare(¤t) {
527 collection.push(current.clone());
528 }
529 }
530 }
531
532 NodeCollection::<T>::from_vec(collection)
533 }
534
535 fn collect_children(&self, ident: &I) -> NodeCollection<T> {
538
539 let mut collection = Vec::new();
540
541 if let Some(child) = self.child() {
542
543 let mut child = child;
544
545 while let Some(c) = child.child() {
546
547 child = c;
550
551 if ident.compare(&child) {
552 collection.push(child.clone());
553 }
554
555 if let Some(prev) = child.prev() {
558 let mut prev = prev;
559
560 {
561
562 if ident.compare(&prev) {
563 collection.push(prev.clone());
564 }
565
566 collection.extend(prev.collect_children(ident).nodes);
567
568 } while let Some(p) = prev.prev() {
569
570 prev = p;
571
572 if ident.compare(&prev) {
573 collection.push(prev.clone());
574 }
575
576 collection.extend(prev.collect_children(ident).nodes);
577 }
578 }
579
580 if let Some(n) = child.next() {
583
584 let mut next = n;
585
586 {
587
588 if ident.compare(&next) {
589 collection.push(next.clone());
590 }
591
592 collection.extend(next.collect_children(ident).nodes);
593
594 } while let Some(n) = next.next() {
595
596 next = n;
597
598 if ident.compare(&next) {
599 collection.push(next.clone());
600 }
601
602 collection.extend(next.collect_children(ident).nodes);
603 }
604 }
605 }
606 }
607
608 NodeCollection::<T>::from_vec(collection)
609 }
610
611 fn collect_linked_list(&self, ident: &I) -> NodeCollection<T> {
670
671 let mut collection = Vec::new();
672
673 if let Some(parent) = self.parent() {
678 let mut parent = parent;
679
680 while let Some(p) = parent.parent() {
681 parent = p;
682 }
683
684 if ident.compare(&parent) {
687 collection.push(parent.clone());
688 }
689
690 collection.extend(parent.collect_children(ident).nodes);
691
692 if let Some(n) = parent.prev() {
695 let mut prev = n;
696
697 {
698
699 if ident.compare(&prev) {
700 collection.push(prev.clone());
701 }
702
703 collection.extend(prev.collect_children(ident).nodes);
704
705 } while let Some(n) = prev.prev() {
706 prev = n;
707
708 if ident.compare(&prev) {
709 collection.push(prev.clone());
710 }
711
712 collection.extend(prev.collect_children(ident).nodes);
713 }
714 }
715
716 if let Some(n) = parent.next() {
717 let mut next = n;
718
719 {
720
721 if ident.compare(&next) {
722 collection.push(next.clone());
723 }
724
725 collection.extend(next.collect_children(ident).nodes);
726
727 } while let Some(n) = next.next() {
728 next = n;
729
730 if ident.compare(&next) {
731 collection.push(next.clone());
732 }
733
734 collection.extend(next.collect_children(ident).nodes);
735 }
736 }
737 } else {
738 if ident.compare(&self) {
743 collection.push(self.clone());
744 }
745
746 collection.extend(self.collect_children(ident).nodes);
747
748 if let Some(n) = self.prev() {
749 let mut prev = n;
750
751 {
752
753 if ident.compare(&prev) {
754 collection.push(prev.clone());
755 }
756
757 collection.extend(prev.collect_children(ident).nodes);
758
759 } while let Some(n) = prev.prev() {
760 prev = n;
761
762 if ident.compare(&prev) {
763 collection.push(prev.clone());
764 }
765
766 collection.extend(prev.collect_children(ident).nodes);
767 }
768 }
769
770 if let Some(n) = self.next() {
771 let mut next = n;
772
773 {
774
775 if ident.compare(&next) {
776 collection.push(next.clone());
777 }
778
779 collection.extend(next.collect_children(ident).nodes);
780
781 } while let Some(n) = next.next() {
782 next = n;
783
784 if ident.compare(&next) {
785 collection.push(next.clone());
786 }
787
788 collection.extend(next.collect_children(ident).nodes);
789 }
790 }
791 }
792
793 NodeCollection::<T>::from_vec(collection)
794 }
795}
796
797pub trait FindNode<T: Debug + Clone, I: CompareNode<T>> {
798 fn find_next(&self, ident: &I) -> Option<Node<T>>;
799 fn find_prev(&self, ident: &I) -> Option<Node<T>>;
800 fn find_sibling(&self, ident: &I) -> Option<Node<T>>;
801 fn find_child(&self, ident: &I) -> Option<Node<T>>;
802 fn find_linked_list(&self, ident: &I) -> Option<Node<T>>;
803}
804
805impl<T: Debug + Clone, I: CompareNode<T>> FindNode<T, I> for Node<T> {
806 fn find_next(&self, ident: &I) -> Option<Node<T>> {
860 if let Some(next) = self.next() {
861 let mut next = next;
862
863 {
864
865 if ident.compare(&next) {
866 return Some(next);
867 }
868
869 } while let Some(n) = next.next() {
870 next = n;
871
872 if ident.compare(&next) {
873 return Some(next);
874 }
875 }
876 }
877
878 None
879 }
880
881 fn find_prev(&self, ident: &I) -> Option<Node<T>> {
885 if let Some(prev) = self.prev() {
886 let mut prev = prev;
887
888 {
889
890 if ident.compare(&prev) {
891 return Some(prev);
892 }
893
894 } while let Some(n) = prev.prev() {
895 prev = n;
896
897 if ident.compare(&prev) {
898 return Some(prev);
899 }
900
901 }
902 }
903 None
904
905 }
906
907 fn find_linked_list(&self, ident: &I) -> Option<Node<T>> {
912 if let Some(parent) = self.parent() {
913 let mut parent = parent;
914
915 while let Some(p) = parent.parent() {
916 parent = p;
917 }
918
919 if ident.compare(&parent) {
922 return Some(parent);
923 }
924
925 if let Some(c) = parent.find_child(ident) {
926 return Some(c);
927 }
928
929 if let Some(n) = parent.prev() {
932 let mut prev = n;
933
934 {
935
936 if ident.compare(&prev) {
937 return Some(prev);
938 }
939
940 if let Some(c) = prev.find_child(ident) {
941 return Some(c);
942 }
943
944 } while let Some(n) = prev.prev() {
945 prev = n;
946
947 if ident.compare(&prev) {
948 return Some(prev);
949 }
950
951 if let Some(c) = prev.find_child(ident) {
952 return Some(c);
953 }
954 }
955 }
956
957 if let Some(n) = parent.next() {
958 let mut next = n;
959
960 {
961
962 if ident.compare(&next) {
963 return Some(next);
964 }
965
966 if let Some(c) = next.find_child(ident) {
967 return Some(c);
968 }
969
970 } while let Some(n) = next.next() {
971 next = n;
972
973 if ident.compare(&next) {
974 return Some(next);
975 }
976
977 if let Some(c) = next.find_child(ident) {
978 return Some(c);
979 }
980 }
981 }
982
983 } else {
984
985 if ident.compare(&self) {
986 return Some(self.clone());
987 }
988
989 if let Some(child) = self.find_child(ident) {
990 return Some(child);
991 }
992
993 if let Some(n) = self.prev() {
994 let mut prev = n;
995
996 {
997
998 if ident.compare(&prev) {
999 return Some(prev);
1000 }
1001
1002 if let Some(child) = prev.find_child(ident) {
1003 return Some(child);
1004 }
1005
1006 } while let Some(n) = prev.prev() {
1007 prev = n;
1008
1009 if ident.compare(&prev) {
1010 return Some(prev);
1011 }
1012
1013 if let Some(child) = prev.find_child(ident) {
1014 return Some(child);
1015 }
1016 }
1017 }
1018
1019 if let Some(n) = self.next() {
1020 let mut next = n;
1021
1022 {
1023
1024 if ident.compare(&next) {
1025 return Some(next);
1026 }
1027
1028 if let Some(child) = next.find_child(ident) {
1029 return Some(child);
1030 }
1031
1032 } while let Some(n) = next.next() {
1033 next = n;
1034
1035 if ident.compare(&next) {
1036 return Some(next);
1037 }
1038
1039 if let Some(child) = next.find_child(ident) {
1040 return Some(child);
1041 }
1042 }
1043 }
1044 }
1045
1046 None
1047 }
1048
1049 fn find_child(&self, ident: &I) -> Option<Node<T>> {
1054 if let Some(child) = self.child() {
1055 let mut child = child;
1056 {
1057
1058 if ident.compare(&child) {
1059 return Some(child);
1060 }
1061
1062 if let Some(next) = child.next() {
1063 let mut next = next;
1064 {
1065 if ident.compare(&next) {
1066 return Some(next);
1067 }
1068
1069 if let Some(c) = next.find_child(ident) {
1070 return Some(c);
1071 }
1072 } while let Some(n) = next.next() {
1073
1074 next = n;
1075
1076 if ident.compare(&next) {
1077 return Some(next);
1078 }
1079
1080 if let Some(c) = next.find_child(ident) {
1081 return Some(c);
1082 }
1083 }
1084 }
1085
1086 } while let Some(c) = child.child() {
1087 child = c;
1088
1089 if ident.compare(&child) {
1090 return Some(child);
1091 }
1092
1093 if let Some(next) = child.next() {
1094 let mut next = next;
1095 {
1096 if ident.compare(&next) {
1097 return Some(next);
1098 }
1099
1100 if let Some(c) = next.find_child(ident) {
1101 return Some(c);
1102 }
1103 } while let Some(n) = next.next() {
1104
1105 next = n;
1106
1107 if ident.compare(&next) {
1108 return Some(next);
1109 }
1110
1111 if let Some(c) = next.find_child(ident) {
1112 return Some(c);
1113 }
1114 }
1115 }
1116
1117 }
1118 }
1119
1120 None
1121 }
1122
1123 fn find_sibling(&self, ident: &I) -> Option<Node<T>> {
1127 if let Some(n) = self.prev() {
1136 let mut prev = n;
1137
1138 {
1139
1140 if ident.compare(&prev) {
1141 return Some(prev);
1142 }
1143
1144 if let Some(child) = prev.find_child(ident) {
1145 return Some(child);
1146 }
1147
1148 } while let Some(n) = prev.prev() {
1149 prev = n;
1150
1151 if ident.compare(&prev) {
1152 return Some(prev);
1153 }
1154
1155 if let Some(child) = prev.find_child(ident) {
1156 return Some(child);
1157 }
1158 }
1159 }
1160
1161 if let Some(n) = self.next() {
1162 let mut next = n;
1163
1164 {
1165
1166 if ident.compare(&next) {
1167 return Some(next);
1168 }
1169
1170 if let Some(child) = next.find_child(ident) {
1171 return Some(child);
1172 }
1173
1174 } while let Some(n) = next.next() {
1175 next = n;
1176
1177 if ident.compare(&next) {
1178 return Some(next);
1179 }
1180
1181 if let Some(child) = next.find_child(ident) {
1182 return Some(child);
1183 }
1184 }
1185 }
1186
1187 None
1188 }
1189
1190}
1191
1192pub trait GetNode<T: Debug + Clone> {
1193 fn get_first_sibling(&self) -> Option<Node<T>>;
1194 fn get_last_sibling(&self) -> Option<Node<T>>;
1195 fn get_last_child(&self) -> Option<Node<T>>;
1196}
1197
1198impl<T: Debug + Clone> GetNode<T> for Node<T> {
1199
1200 fn get_first_sibling(&self) -> Option<Node<T>> {
1203
1204 if let Some(parent) = self.parent() {
1206 return parent.child();
1207 }
1208
1209 let mut first;
1210
1211 {
1212
1213 if let Some(prev) = self.prev() {
1214 first = prev;
1215 } else { return None; }
1216
1217 } while let Some(prev) = first.prev() {
1218 first = prev;
1219 }
1220
1221 Some(first)
1222 }
1223
1224 fn get_last_sibling(&self) -> Option<Node<T>> {
1227
1228 let mut last;
1229
1230 {
1231
1232 if let Some(next) = self.next() {
1233 last = next;
1234 } else { return None; }
1235
1236 } while let Some(next) = last.next() {
1237 last = next;
1238 }
1239
1240 Some(last)
1241 }
1242
1243 fn get_last_child(&self) -> Option<Node<T>> {
1247
1248 if let Some(child) = self.child() {
1249
1250 let child = child;
1251
1252 if let Some(s) = child.get_last_sibling() {
1253 return Some(s);
1254 }
1255
1256 return Some(child);
1257
1258 } None
1259 }
1260}
1261
1262pub trait AppendNode<T: Debug + Clone> {
1263 fn append_next(&self, node: Node<T>);
1264 fn append_child(&self, node: Node<T>);
1265 fn append_prev(&self, node: Node<T>);
1266}
1267
1268impl<T: Debug + Clone> AppendNode<T> for Node<T> {
1269
1270 fn append_next(&self, node: Node<T>) {
1286 if let Some(parent) = self.parent() {
1287 node.get_mut().parent = Some(parent.downgrade());
1288 }
1289
1290 if let Some(next) = self.next() {
1291 next.get_mut().prev = Some(node.downgrade());
1292 node.get_mut().next = Some(next);
1293 }
1294
1295 self.get_mut().next = Some(node.clone());
1296 node.get_mut().prev = Some(self.downgrade());
1297 }
1298
1299 fn append_prev(&self, node: Node<T>) {
1315
1316
1317
1318
1319 if let Some(prev) = self.prev() {
1320 prev.get_mut().next = Some(node.clone());
1321 node.get_mut().prev = Some(prev.downgrade());
1322 self.get_mut().prev = Some(node.downgrade());
1323 node.get_mut().next = Some(self.clone());
1324
1325
1326 } else {
1327 if let Some(list) = self.list() {
1328
1329 self.get_mut().prev = Some(node.downgrade());
1330 node.get_mut().next = Some(self.clone());
1331 node.get_mut().list = Some(list.downgrade());
1332 *list.first.get_mut() = Some(node.clone());
1333
1334 } else { }
1335 }
1336
1337 if let Some(parent) = self.parent() {
1338 node.get_mut().parent = Some(parent.downgrade());
1339 parent.get_mut().child = Some(node.clone());
1340 }
1341 }
1342
1343 fn append_child(&self, node: Node<T>) {
1358 node.get_mut().parent = Some(self.downgrade());
1359 if let Some(last_child) = self.get_last_child() {
1360 last_child.get_mut().next = Some(node.clone());
1361 node.get_mut().prev = Some(last_child.downgrade());
1362 } else {
1363 self.get_mut().child = Some(node);
1364 }
1365 }
1366}
1367pub trait InsertNode<T: Debug + Clone> {
1368 fn insert_sibling(&self, position: usize, node: Node<T>);
1369 fn insert_child(&self, position: usize, node: Node<T>);
1370}
1371
1372impl<T: Debug + Clone> InsertNode<T> for Node<T> {
1373 fn insert_sibling(&self, position: usize, node: Node<T>) {
1395
1396 let mut sibling = self.clone();
1397
1398 let mut c = 0;
1399
1400 if c != position {
1401 while let Some(sib) = sibling.next() {
1402 sibling = sib;
1403 c += 1;
1404 if c == position {
1405 break;
1406 }
1407 }
1408 }
1409
1410 if c != position {
1420 sibling.append_next(node.clone());
1422 } else {
1423
1424 if let Some(parent) = self.parent() {
1425 node.get_mut().parent = Some(parent.downgrade());
1426 }
1427
1428 if let Some(prev) = sibling.prev() {
1429 let previous = prev;
1430 previous.get_mut().next = Some(node.clone());
1431 } else {
1432 if let Some(parent) = self.parent() {
1433 parent.get_mut().child = Some(node.clone());
1435 }
1436 }
1437
1438 sibling.get_mut().prev = Some(node.downgrade());
1439 }
1440 }
1441
1442 fn insert_child(&self, position: usize, node: Node<T>) {
1462 if let Some(first_child) = self.child() {
1463 first_child.insert_sibling(position, node);
1464 } else {
1465 node.get_mut().parent = Some(self.downgrade());
1466 self.get_mut().child = Some(node);
1467 }
1468 }
1469}
1470#[macro_export]
1488macro_rules! node {
1489 ($content: expr $(,$node: expr)*) => {
1490 {
1491 let mut node = hedel_rs::Node::new($content);
1492
1493 let mut children: Vec<hedel_rs::Node<_>> = Vec::new();
1494
1495 let mut lists: Vec<usize> = Vec::new();
1496
1497 let mut c = 0;
1498
1499 $(
1500 let n: hedel_rs::Node::<_> = $node.into();
1501
1502 if let Some(_) = n.get().list {
1503 lists.push(c as usize);
1504 }
1505
1506 children.push(n);
1507
1508 c += 1;
1509 )*
1510
1511 if children.len() > 0 {
1512 node.get_mut().child = Some(children[0].clone());
1513
1514 c = 0;
1515
1516 let max_idx = children.len() - 1;
1517
1518 for ref child in &children {
1519 let mut borrow = child.get_mut();
1520
1521 if c != max_idx {
1522 borrow.next = Some(children[c + 1].clone());
1523 }
1524
1525 if c != 0 {
1526 borrow.prev = Some(children[c - 1].downgrade());
1527 }
1528
1529 borrow.parent = Some(hedel_rs::WeakNode {
1530 inner: std::rc::Rc::downgrade(&node.inner)
1531 });
1532
1533 c += 1;
1534 }
1535
1536 }
1537
1538 for idx in lists.into_iter() {
1539
1540 let first = children[idx].clone();
1541
1542 if idx > 0 {
1543 if let Some(prev) = children.get(idx - 1) {
1544 prev.get_mut().next = Some(first.clone());
1545 first.get_mut().prev = Some(prev.downgrade());
1546 }
1547 }
1548
1549 if let Some(last) = first.get_last_sibling() {
1550 if let Some(next) = children.get(idx + 1) {
1551 next.get_mut().prev = Some(last.downgrade());
1552 last.get_mut().next = Some(next.clone());
1553 }
1554 }
1555
1556 let mut child = first;
1557
1558 {
1559
1560 child.get_mut().parent = Some(node.downgrade());
1561
1562 } while let Some(ch) = child.next() {
1563 child = ch;
1564 child.get_mut().parent = Some(node.downgrade());
1565 }
1566 }
1567
1568 node
1569 }
1570 }
1571}
1572
1573