1use std::collections::HashMap;
19use std::fmt::Debug;
20use std::fmt::Formatter;
21use std::hash::Hash;
22use std::iter;
23use std::iter::zip;
24use std::ops::Deref;
25use std::slice;
26
27use futures::future::try_join_all;
28use itertools::Itertools as _;
29use smallvec::SmallVec;
30use smallvec::smallvec;
31use smallvec::smallvec_inline;
32
33use crate::content_hash::ContentHash;
34use crate::content_hash::DigestUpdate;
35
36#[derive(Copy, Clone, Debug, PartialEq, Eq)]
41pub struct Diff<T> {
42 pub before: T,
44 pub after: T,
46}
47
48impl<T> Diff<T> {
49 pub fn new(before: T, after: T) -> Self {
51 Self { before, after }
52 }
53
54 pub fn map<U>(self, mut f: impl FnMut(T) -> U) -> Diff<U> {
56 Diff {
57 before: f(self.before),
58 after: f(self.after),
59 }
60 }
61
62 pub fn zip<U>(self, other: Diff<U>) -> Diff<(T, U)> {
64 Diff {
65 before: (self.before, other.before),
66 after: (self.after, other.after),
67 }
68 }
69
70 pub fn invert(self) -> Self {
72 Self {
73 before: self.after,
74 after: self.before,
75 }
76 }
77
78 pub fn as_ref(&self) -> Diff<&T> {
80 Diff {
81 before: &self.before,
82 after: &self.after,
83 }
84 }
85
86 pub fn as_deref(&self) -> Diff<&T::Target>
89 where
90 T: Deref,
91 {
92 self.as_ref().map(Deref::deref)
93 }
94
95 pub fn into_array(self) -> [T; 2] {
97 [self.before, self.after]
98 }
99}
100
101impl<T: Eq> Diff<T> {
102 pub fn is_changed(&self) -> bool {
105 self.before != self.after
106 }
107}
108
109#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize)]
111#[serde(rename_all = "kebab-case")]
112pub enum SameChange {
113 Keep,
115 Accept,
122}
123
124pub fn trivial_merge<T>(values: &[T], same_change: SameChange) -> Option<&T>
127where
128 T: Eq + Hash,
129{
130 assert!(
131 values.len() % 2 == 1,
132 "trivial_merge() requires an odd number of terms"
133 );
134 if let [add] = values {
136 return Some(add);
137 } else if let [add0, remove, add1] = values {
138 return if add0 == add1 && same_change == SameChange::Accept {
139 Some(add0)
140 } else if add0 == remove {
141 Some(add1)
142 } else if add1 == remove {
143 Some(add0)
144 } else {
145 None
146 };
147 }
148
149 let mut counts: HashMap<&T, i32> = HashMap::new();
153 for (value, n) in zip(values, [1, -1].into_iter().cycle()) {
154 counts.entry(value).and_modify(|e| *e += n).or_insert(n);
155 }
156
157 counts.retain(|_, count| *count != 0);
160 if counts.len() == 1 {
161 let (value, count) = counts.into_iter().next().unwrap();
163 assert_eq!(count, 1);
164 Some(value)
165 } else if counts.len() == 2 && same_change == SameChange::Accept {
166 let [(value1, count1), (value2, count2)] = counts.into_iter().next_array().unwrap();
168 assert_eq!(count1 + count2, 1);
169 if count1 > 0 {
170 Some(value1)
171 } else {
172 Some(value2)
173 }
174 } else {
175 None
176 }
177}
178
179#[derive(PartialEq, Eq, Hash, Clone, serde::Serialize)]
185#[serde(transparent)]
186pub struct Merge<T> {
187 values: SmallVec<[T; 1]>,
189}
190
191impl<T: ContentHash> ContentHash for Merge<T> {
192 fn hash(&self, state: &mut impl DigestUpdate) {
193 self.as_slice().hash(state);
194 }
195}
196
197impl<T: Debug> Debug for Merge<T> {
198 fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> {
199 if let Some(value) = self.as_resolved() {
202 f.debug_tuple("Resolved").field(value).finish()
203 } else {
204 f.debug_tuple("Conflicted").field(&self.values).finish()
205 }
206 }
207}
208
209impl<T> Merge<T> {
210 pub fn from_vec(values: impl Into<SmallVec<[T; 1]>>) -> Self {
213 let values = values.into();
214 assert!(values.len() % 2 != 0, "must have an odd number of terms");
215 Self { values }
216 }
217
218 pub fn from_removes_adds(
220 removes: impl IntoIterator<Item = T>,
221 adds: impl IntoIterator<Item = T>,
222 ) -> Self {
223 let removes = removes.into_iter();
224 let mut adds = adds.into_iter();
225 let mut values = SmallVec::with_capacity(removes.size_hint().0 * 2 + 1);
226 values.push(adds.next().expect("must have at least one add"));
227 for diff in removes.zip_longest(adds) {
228 let (remove, add) = diff.both().expect("must have one more adds than removes");
229 values.extend([remove, add]);
230 }
231 Self { values }
232 }
233
234 pub fn from_diffs(first_side: T, diffs: impl IntoIterator<Item = Diff<T>>) -> Self {
237 let values = iter::once(first_side)
238 .chain(diffs.into_iter().flat_map(Diff::into_array))
239 .collect();
240 Self { values }
241 }
242
243 pub const fn resolved(value: T) -> Self {
245 Self {
246 values: smallvec_inline![value],
247 }
248 }
249
250 pub fn repeated(value: T, num_sides: usize) -> Self
252 where
253 T: Clone,
254 {
255 Self {
256 values: smallvec![value; num_sides * 2 - 1],
257 }
258 }
259
260 pub fn removes(&self) -> impl ExactSizeIterator<Item = &T> {
262 self.values[1..].iter().step_by(2)
263 }
264
265 pub fn adds(&self) -> impl ExactSizeIterator<Item = &T> {
267 self.values.iter().step_by(2)
268 }
269
270 pub fn into_removes_adds(
272 self,
273 ) -> (
274 impl ExactSizeIterator<Item = T>,
275 impl ExactSizeIterator<Item = T>,
276 ) {
277 let (removes, adds): (Vec<_>, Vec<_>) = self
278 .values
279 .into_iter()
280 .enumerate()
281 .partition(|(n, _)| *n % 2 == 1);
282 (
283 removes.into_iter().map(|(_, item)| item),
284 adds.into_iter().map(|(_, item)| item),
285 )
286 }
287
288 pub fn first(&self) -> &T {
290 &self.values[0]
291 }
292
293 pub fn get_remove(&self, index: usize) -> Option<&T> {
296 self.values.get(index * 2 + 1)
297 }
298
299 pub fn get_add(&self, index: usize) -> Option<&T> {
303 self.values.get(index * 2)
304 }
305
306 pub fn swap_remove(&mut self, remove_index: usize, add_index: usize) -> (T, T) {
309 let add = self.values.swap_remove(add_index * 2);
311 let remove = self.values.swap_remove(remove_index * 2 + 1);
312 (remove, add)
313 }
314
315 pub fn num_sides(&self) -> usize {
317 self.values.len() / 2 + 1
318 }
319
320 pub fn is_resolved(&self) -> bool {
322 self.values.len() == 1
323 }
324
325 pub fn as_resolved(&self) -> Option<&T> {
328 if let [value] = &self.values[..] {
329 Some(value)
330 } else {
331 None
332 }
333 }
334
335 pub fn into_resolved(mut self) -> Result<T, Self> {
338 if self.values.len() == 1 {
339 Ok(self.values.pop().unwrap())
340 } else {
341 Err(self)
342 }
343 }
344
345 fn get_simplified_mapping(&self) -> Vec<usize>
351 where
352 T: PartialEq,
353 {
354 let unsimplified_len = self.values.len();
355 let mut simplified_to_original_indices = (0..unsimplified_len).collect_vec();
356
357 let mut add_index = 0;
358 while add_index < simplified_to_original_indices.len() {
359 let add = &self.values[simplified_to_original_indices[add_index]];
360 let mut remove_indices = simplified_to_original_indices
361 .iter()
362 .enumerate()
363 .skip(1)
364 .step_by(2);
365 if let Some((remove_index, _)) = remove_indices
366 .find(|&(_, original_remove_index)| &self.values[*original_remove_index] == add)
367 {
368 simplified_to_original_indices.swap(remove_index + 1, add_index);
371 simplified_to_original_indices.drain(remove_index..remove_index + 2);
372 } else {
373 add_index += 2;
374 }
375 }
376
377 simplified_to_original_indices
378 }
379
380 #[must_use]
382 fn apply_simplified_mapping(&self, mapping: &[usize]) -> Self
383 where
384 T: Clone,
385 {
386 let values = mapping
388 .iter()
389 .map(|index| self.values[*index].clone())
390 .collect();
391 Self { values }
392 }
393
394 #[must_use]
397 pub fn simplify(&self) -> Self
398 where
399 T: PartialEq + Clone,
400 {
401 let mapping = self.get_simplified_mapping();
402 self.apply_simplified_mapping(&mapping)
403 }
404
405 #[must_use]
407 pub fn simplify_by<'a, U>(&'a self, f: impl FnMut(&'a T) -> U) -> Self
408 where
409 T: Clone,
410 U: PartialEq,
411 {
412 let mapping = self.map(f).get_simplified_mapping();
413 self.apply_simplified_mapping(&mapping)
414 }
415
416 pub fn update_from_simplified(mut self, simplified: Self) -> Self
418 where
419 T: PartialEq,
420 {
421 let mapping = self.get_simplified_mapping();
422 assert_eq!(mapping.len(), simplified.values.len());
423 for (index, value) in mapping.into_iter().zip(simplified.values) {
424 self.values[index] = value;
425 }
426 self
427 }
428
429 pub fn resolve_trivial(&self, same_change: SameChange) -> Option<&T>
432 where
433 T: Eq + Hash,
434 {
435 trivial_merge(&self.values, same_change)
436 }
437
438 pub fn pad_to(&mut self, num_sides: usize, value: &T)
441 where
442 T: Clone,
443 {
444 if num_sides <= self.num_sides() {
445 return;
446 }
447 self.values.resize(num_sides * 2 - 1, value.clone());
448 }
449
450 pub fn as_slice(&self) -> &[T] {
454 &self.values
455 }
456
457 pub fn iter(&self) -> slice::Iter<'_, T> {
461 self.values.iter()
462 }
463
464 pub fn iter_mut(&mut self) -> slice::IterMut<'_, T> {
466 self.values.iter_mut()
467 }
468
469 pub fn map<'a, U>(&'a self, f: impl FnMut(&'a T) -> U) -> Merge<U> {
471 let values = self.values.iter().map(f).collect();
472 Merge { values }
473 }
474
475 pub fn into_map<U>(self, f: impl FnMut(T) -> U) -> Merge<U> {
478 let values = self.values.into_iter().map(f).collect();
479 Merge { values }
480 }
481
482 pub fn try_map<'a, U, E>(
485 &'a self,
486 f: impl FnMut(&'a T) -> Result<U, E>,
487 ) -> Result<Merge<U>, E> {
488 let values = self.values.iter().map(f).try_collect()?;
489 Ok(Merge { values })
490 }
491
492 pub async fn try_map_async<'a, F, U, E>(
496 &'a self,
497 f: impl FnMut(&'a T) -> F,
498 ) -> Result<Merge<U>, E>
499 where
500 F: Future<Output = Result<U, E>>,
501 {
502 let values = try_join_all(self.values.iter().map(f)).await?;
503 Ok(Merge {
504 values: values.into(),
505 })
506 }
507
508 pub fn as_ref(&self) -> Merge<&T> {
510 let values = self.values.iter().collect();
511 Merge { values }
512 }
513
514 pub fn zip<U>(self, other: Merge<U>) -> Merge<(T, U)> {
517 assert_eq!(self.values.len(), other.values.len());
518 let values = self.values.into_iter().zip(other.values).collect();
519 Merge { values }
520 }
521}
522
523impl<T, U> Merge<(T, U)> {
524 pub fn unzip(self) -> (Merge<T>, Merge<U>) {
526 let (left, right) = self.values.into_iter().unzip();
527 (Merge { values: left }, Merge { values: right })
528 }
529}
530
531impl<T> Merge<&'_ T> {
532 pub fn cloned(&self) -> Merge<T>
534 where
535 T: Clone,
536 {
537 self.map(|&term| term.clone())
538 }
539}
540
541#[derive(Clone, Debug, PartialEq, Eq)]
550pub struct MergeBuilder<T> {
551 values: SmallVec<[T; 1]>,
552}
553
554impl<T> Default for MergeBuilder<T> {
555 fn default() -> Self {
556 Self {
557 values: Default::default(),
558 }
559 }
560}
561
562impl<T> MergeBuilder<T> {
563 pub fn build(self) -> Merge<T> {
566 Merge::from_vec(self.values)
567 }
568}
569
570impl<T> IntoIterator for Merge<T> {
571 type Item = T;
572 type IntoIter = smallvec::IntoIter<[T; 1]>;
573
574 fn into_iter(self) -> Self::IntoIter {
575 self.values.into_iter()
576 }
577}
578
579impl<'a, T> IntoIterator for &'a Merge<T> {
580 type Item = &'a T;
581 type IntoIter = slice::Iter<'a, T>;
582
583 fn into_iter(self) -> Self::IntoIter {
584 self.iter()
585 }
586}
587
588impl<'a, T> IntoIterator for &'a mut Merge<T> {
589 type Item = &'a mut T;
590 type IntoIter = slice::IterMut<'a, T>;
591
592 fn into_iter(self) -> Self::IntoIter {
593 self.iter_mut()
594 }
595}
596
597impl<T> FromIterator<T> for MergeBuilder<T> {
598 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
599 let mut builder = Self::default();
600 builder.extend(iter);
601 builder
602 }
603}
604
605impl<T> Extend<T> for MergeBuilder<T> {
606 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
607 self.values.extend(iter);
608 }
609}
610
611impl<T> Merge<Option<T>> {
612 pub const fn absent() -> Self {
614 Self::resolved(None)
615 }
616
617 pub fn normal(value: T) -> Self {
619 Self::resolved(Some(value))
620 }
621
622 pub fn from_legacy_form(
625 removes: impl IntoIterator<Item = T>,
626 adds: impl IntoIterator<Item = T>,
627 ) -> Self {
628 let removes = removes.into_iter();
629 let mut adds = adds.into_iter().fuse();
630 let mut values = smallvec_inline![adds.next()];
631 for diff in removes.zip_longest(adds) {
632 let (remove, add) = diff.map_any(Some, Some).or_default();
633 values.extend([remove, add]);
634 }
635 Self { values }
636 }
637
638 pub fn is_absent(&self) -> bool {
640 matches!(self.as_resolved(), Some(None))
641 }
642
643 pub fn is_present(&self) -> bool {
645 !self.is_absent()
646 }
647
648 pub fn as_normal(&self) -> Option<&T> {
650 self.as_resolved()?.as_ref()
651 }
652
653 pub fn present_removes(&self) -> impl Iterator<Item = &T> {
655 self.removes().flatten()
656 }
657
658 pub fn present_adds(&self) -> impl Iterator<Item = &T> {
660 self.adds().flatten()
661 }
662
663 pub fn into_legacy_form(self) -> (Vec<T>, Vec<T>) {
667 let mut removes = Vec::with_capacity(self.values.len() / 2);
669 let mut adds = Vec::with_capacity(self.values.len() / 2 + 1);
670 let mut values = self.values.into_iter();
671 adds.extend(values.next().unwrap());
672 while let Some(remove) = values.next() {
673 removes.extend(remove);
674 adds.extend(values.next().unwrap());
675 }
676 (removes, adds)
677 }
678}
679
680impl<T: Clone> Merge<Option<&T>> {
681 pub fn cloned(&self) -> Merge<Option<T>> {
683 self.map(|value| value.cloned())
684 }
685}
686
687impl<T> Merge<Merge<T>> {
688 pub fn flatten(self) -> Merge<T> {
706 let mut outer_values = self.values.into_iter();
707 let mut result = outer_values.next().unwrap();
708 while let Some(mut remove) = outer_values.next() {
709 remove.values.rotate_left(1);
712 for i in 0..remove.values.len() / 2 {
713 remove.values.swap(i * 2, i * 2 + 1);
714 }
715 result.values.extend(remove.values);
716 let add = outer_values.next().unwrap();
717 result.values.extend(add.values);
718 }
719 result
720 }
721}
722
723#[cfg(test)]
724mod tests {
725 use test_case::test_case;
726
727 use super::*;
728
729 #[test]
730 fn test_diff_map() {
731 let diff = Diff::new(1, 2);
732 assert_eq!(diff.map(|x| x + 2), Diff::new(3, 4));
733 }
734
735 #[test]
736 fn test_diff_zip() {
737 let diff1 = Diff::new(1, 2);
738 let diff2 = Diff::new(3, 4);
739 assert_eq!(diff1.zip(diff2), Diff::new((1, 3), (2, 4)));
740 }
741
742 #[test]
743 fn test_diff_invert() {
744 let diff = Diff::new(1, 2);
745 assert_eq!(diff.invert(), Diff::new(2, 1));
746 }
747
748 #[test]
749 fn test_diff_as_ref() {
750 let diff = Diff::new(1, 2);
751 assert_eq!(diff.as_ref(), Diff::new(&1, &2));
752 }
753
754 #[test]
755 fn test_diff_into_array() {
756 let diff = Diff::new(1, 2);
757 assert_eq!(diff.into_array(), [1, 2]);
758 }
759
760 #[test]
761 fn test_merge_from_diffs() {
762 assert_eq!(Merge::from_diffs(1, []), Merge::resolved(1));
763 assert_eq!(
764 Merge::from_diffs(1, [Diff::new(2, 3)]),
765 Merge::from_vec(vec![1, 2, 3])
766 );
767 assert_eq!(
768 Merge::from_diffs(1, [Diff::new(2, 3), Diff::new(4, 5)]),
769 Merge::from_vec(vec![1, 2, 3, 4, 5])
770 );
771 }
772
773 fn c<T: Clone>(terms: &[T]) -> Merge<T> {
774 Merge::from_vec(terms.to_vec())
775 }
776
777 #[test_case(SameChange::Keep)]
778 #[test_case(SameChange::Accept)]
779 fn test_trivial_merge(same_change: SameChange) {
780 let accept_same_change = same_change == SameChange::Accept;
781 let merge = |values| trivial_merge(values, same_change);
782 assert_eq!(merge(&[0]), Some(&0));
783 assert_eq!(merge(&[0, 0, 0]), Some(&0));
784 assert_eq!(merge(&[0, 0, 1]), Some(&1));
785 assert_eq!(merge(&[0, 1, 0]), accept_same_change.then_some(&0));
786 assert_eq!(merge(&[0, 1, 1]), Some(&0));
787 assert_eq!(merge(&[0, 1, 2]), None);
788 assert_eq!(merge(&[0, 0, 0, 0, 0]), Some(&0));
789 assert_eq!(merge(&[0, 0, 0, 0, 1]), Some(&1));
790 assert_eq!(merge(&[0, 0, 0, 1, 0]), accept_same_change.then_some(&0));
791 assert_eq!(merge(&[0, 0, 0, 1, 1]), Some(&0));
792 assert_eq!(merge(&[0, 0, 0, 1, 2]), None);
793 assert_eq!(merge(&[0, 0, 1, 0, 0]), Some(&1));
794 assert_eq!(merge(&[0, 0, 1, 0, 1]), accept_same_change.then_some(&1));
795 assert_eq!(merge(&[0, 0, 1, 0, 2]), None);
796 assert_eq!(merge(&[0, 0, 1, 1, 0]), Some(&0));
797 assert_eq!(merge(&[0, 0, 1, 1, 1]), Some(&1));
798 assert_eq!(merge(&[0, 0, 1, 1, 2]), Some(&2));
799 assert_eq!(merge(&[0, 0, 1, 2, 0]), None);
800 assert_eq!(merge(&[0, 0, 1, 2, 1]), accept_same_change.then_some(&1));
801 assert_eq!(merge(&[0, 0, 1, 2, 2]), Some(&1));
802 assert_eq!(merge(&[0, 0, 1, 2, 3]), None);
803 assert_eq!(merge(&[0, 1, 0, 0, 0]), accept_same_change.then_some(&0));
804 assert_eq!(merge(&[0, 1, 0, 0, 1]), Some(&0));
805 assert_eq!(merge(&[0, 1, 0, 0, 2]), None);
806 assert_eq!(merge(&[0, 1, 0, 1, 0]), accept_same_change.then_some(&0));
807 assert_eq!(merge(&[0, 1, 0, 1, 1]), accept_same_change.then_some(&0));
808 assert_eq!(merge(&[0, 1, 0, 1, 2]), None);
809 assert_eq!(merge(&[0, 1, 0, 2, 0]), None);
810 assert_eq!(merge(&[0, 1, 0, 2, 1]), accept_same_change.then_some(&0));
811 assert_eq!(merge(&[0, 1, 0, 2, 2]), accept_same_change.then_some(&0));
812 assert_eq!(merge(&[0, 1, 0, 2, 3]), None);
813 assert_eq!(merge(&[0, 1, 1, 0, 0]), Some(&0));
814 assert_eq!(merge(&[0, 1, 1, 0, 1]), Some(&1));
815 assert_eq!(merge(&[0, 1, 1, 0, 2]), Some(&2));
816 assert_eq!(merge(&[0, 1, 1, 1, 0]), accept_same_change.then_some(&0));
817 assert_eq!(merge(&[0, 1, 1, 1, 1]), Some(&0));
818 assert_eq!(merge(&[0, 1, 1, 1, 2]), None);
819 assert_eq!(merge(&[0, 1, 1, 2, 0]), accept_same_change.then_some(&0));
820 assert_eq!(merge(&[0, 1, 1, 2, 1]), None);
821 assert_eq!(merge(&[0, 1, 1, 2, 2]), Some(&0));
822 assert_eq!(merge(&[0, 1, 1, 2, 3]), None);
823 assert_eq!(merge(&[0, 1, 2, 0, 0]), None);
824 assert_eq!(merge(&[0, 1, 2, 0, 1]), Some(&2));
825 assert_eq!(merge(&[0, 1, 2, 0, 2]), accept_same_change.then_some(&2));
826 assert_eq!(merge(&[0, 1, 2, 0, 3]), None);
827 assert_eq!(merge(&[0, 1, 2, 1, 0]), None);
828 assert_eq!(merge(&[0, 1, 2, 1, 1]), None);
829 assert_eq!(merge(&[0, 1, 2, 1, 2]), None);
830 assert_eq!(merge(&[0, 1, 2, 1, 3]), None);
831 assert_eq!(merge(&[0, 1, 2, 2, 0]), accept_same_change.then_some(&0));
832 assert_eq!(merge(&[0, 1, 2, 2, 1]), Some(&0));
833 assert_eq!(merge(&[0, 1, 2, 2, 2]), None);
834 assert_eq!(merge(&[0, 1, 2, 2, 3]), None);
835 assert_eq!(merge(&[0, 1, 2, 3, 0]), None);
836 assert_eq!(merge(&[0, 1, 2, 3, 1]), None);
837 assert_eq!(merge(&[0, 1, 2, 3, 2]), None);
838 assert_eq!(merge(&[0, 1, 2, 3, 3]), None);
839 assert_eq!(merge(&[0, 1, 2, 3, 4]), None);
840 }
841
842 #[test]
843 fn test_legacy_form_conversion() {
844 fn test_equivalent<T>(legacy_form: (Vec<T>, Vec<T>), merge: Merge<Option<T>>)
845 where
846 T: Clone + PartialEq + std::fmt::Debug,
847 {
848 assert_eq!(merge.clone().into_legacy_form(), legacy_form);
849 assert_eq!(Merge::from_legacy_form(legacy_form.0, legacy_form.1), merge);
850 }
851 test_equivalent(
853 (vec![], vec![0]),
854 Merge::from_removes_adds(vec![], vec![Some(0)]),
855 );
856 test_equivalent(
858 (vec![0], vec![1, 2]),
859 Merge::from_removes_adds(vec![Some(0)], vec![Some(1), Some(2)]),
860 );
861 test_equivalent(
863 (vec![0], vec![1]),
864 Merge::from_removes_adds(vec![Some(0)], vec![Some(1), None]),
865 );
866 test_equivalent(
868 (vec![], vec![0, 1]),
869 Merge::from_removes_adds(vec![None], vec![Some(0), Some(1)]),
870 );
871 test_equivalent(
873 (vec![0, 1], vec![2, 3, 4]),
874 Merge::from_removes_adds(vec![Some(0), Some(1)], vec![Some(2), Some(3), Some(4)]),
875 );
876 test_equivalent(
878 (vec![0, 1], vec![]),
879 Merge::from_removes_adds(vec![Some(0), Some(1)], vec![None, None, None]),
880 );
881 }
882
883 #[test]
884 fn test_as_resolved() {
885 assert_eq!(
886 Merge::from_removes_adds(vec![], vec![0]).as_resolved(),
887 Some(&0)
888 );
889 assert_eq!(
891 Merge::from_removes_adds(vec![0], vec![0, 1]).as_resolved(),
892 None
893 );
894 }
895
896 #[test]
897 fn test_get_simplified_mapping() {
898 assert_eq!(c(&[0]).get_simplified_mapping(), vec![0]);
900 assert_eq!(c(&[0, 0, 0]).get_simplified_mapping(), vec![2]);
902 assert_eq!(c(&[0, 0, 1]).get_simplified_mapping(), vec![2]);
903 assert_eq!(c(&[0, 1, 0]).get_simplified_mapping(), vec![0, 1, 2]);
904 assert_eq!(c(&[0, 1, 1]).get_simplified_mapping(), vec![0]);
905 assert_eq!(c(&[0, 1, 2]).get_simplified_mapping(), vec![0, 1, 2]);
906 assert_eq!(c(&[0, 0, 0, 0, 0]).get_simplified_mapping(), vec![4]);
908 assert_eq!(c(&[0, 0, 0, 0, 1]).get_simplified_mapping(), vec![4]);
909 assert_eq!(c(&[0, 0, 0, 1, 0]).get_simplified_mapping(), vec![2, 3, 4]);
910 assert_eq!(c(&[0, 0, 0, 1, 1]).get_simplified_mapping(), vec![2]);
911 assert_eq!(c(&[0, 0, 0, 1, 2]).get_simplified_mapping(), vec![2, 3, 4]);
912 assert_eq!(c(&[0, 0, 1, 0, 0]).get_simplified_mapping(), vec![2]);
913 assert_eq!(c(&[0, 0, 1, 0, 1]).get_simplified_mapping(), vec![2, 3, 4]);
914 assert_eq!(c(&[0, 0, 1, 0, 2]).get_simplified_mapping(), vec![2, 3, 4]);
915 assert_eq!(c(&[0, 0, 1, 1, 0]).get_simplified_mapping(), vec![4]);
916 assert_eq!(c(&[0, 0, 1, 1, 1]).get_simplified_mapping(), vec![4]);
917 assert_eq!(c(&[0, 0, 1, 1, 2]).get_simplified_mapping(), vec![4]);
918 assert_eq!(c(&[0, 0, 2, 1, 0]).get_simplified_mapping(), vec![2, 3, 4]);
919 assert_eq!(c(&[0, 0, 2, 1, 1]).get_simplified_mapping(), vec![2]);
920 assert_eq!(c(&[0, 0, 2, 1, 2]).get_simplified_mapping(), vec![2, 3, 4]);
921 assert_eq!(c(&[0, 0, 2, 1, 3]).get_simplified_mapping(), vec![2, 3, 4]);
922 assert_eq!(c(&[0, 1, 0, 0, 0]).get_simplified_mapping(), vec![4, 1, 2]);
923 assert_eq!(c(&[0, 1, 0, 0, 1]).get_simplified_mapping(), vec![2]);
924 assert_eq!(c(&[0, 1, 0, 0, 2]).get_simplified_mapping(), vec![4, 1, 2]);
925 assert_eq!(
926 c(&[0, 1, 0, 1, 0]).get_simplified_mapping(),
927 vec![0, 1, 2, 3, 4]
928 );
929 assert_eq!(c(&[0, 1, 0, 1, 1]).get_simplified_mapping(), vec![0, 3, 2]);
930 assert_eq!(
931 c(&[0, 1, 0, 1, 2]).get_simplified_mapping(),
932 vec![0, 1, 2, 3, 4]
933 );
934 assert_eq!(
935 c(&[0, 1, 0, 2, 0]).get_simplified_mapping(),
936 vec![0, 1, 2, 3, 4]
937 );
938 assert_eq!(c(&[0, 1, 0, 2, 1]).get_simplified_mapping(), vec![0, 3, 2]);
939 assert_eq!(c(&[0, 1, 0, 2, 2]).get_simplified_mapping(), vec![0, 1, 2]);
940 assert_eq!(
941 c(&[0, 1, 0, 2, 3]).get_simplified_mapping(),
942 vec![0, 1, 2, 3, 4]
943 );
944 assert_eq!(c(&[0, 1, 1, 0, 0]).get_simplified_mapping(), vec![4]);
945 assert_eq!(c(&[0, 1, 1, 0, 1]).get_simplified_mapping(), vec![2]);
946 assert_eq!(c(&[0, 1, 1, 0, 2]).get_simplified_mapping(), vec![4]);
947 assert_eq!(c(&[0, 1, 1, 1, 0]).get_simplified_mapping(), vec![0, 3, 4]);
948 assert_eq!(c(&[0, 1, 1, 1, 1]).get_simplified_mapping(), vec![0]);
949 assert_eq!(c(&[0, 1, 1, 1, 2]).get_simplified_mapping(), vec![0, 3, 4]);
950 assert_eq!(c(&[0, 1, 1, 2, 0]).get_simplified_mapping(), vec![0, 3, 4]);
951 assert_eq!(c(&[0, 1, 1, 2, 1]).get_simplified_mapping(), vec![0, 3, 4]);
952 assert_eq!(c(&[0, 1, 1, 2, 2]).get_simplified_mapping(), vec![0]);
953 assert_eq!(c(&[0, 1, 1, 2, 3]).get_simplified_mapping(), vec![0, 3, 4]);
954 assert_eq!(c(&[0, 1, 2, 0, 0]).get_simplified_mapping(), vec![4, 1, 2]);
955 assert_eq!(c(&[0, 1, 2, 0, 1]).get_simplified_mapping(), vec![2]);
956 assert_eq!(c(&[0, 1, 2, 0, 2]).get_simplified_mapping(), vec![4, 1, 2]);
957 assert_eq!(c(&[0, 1, 2, 0, 3]).get_simplified_mapping(), vec![4, 1, 2]);
958 assert_eq!(
959 c(&[0, 1, 2, 1, 0]).get_simplified_mapping(),
960 vec![0, 1, 2, 3, 4]
961 );
962 assert_eq!(c(&[0, 1, 2, 1, 1]).get_simplified_mapping(), vec![0, 3, 2]);
963 assert_eq!(
964 c(&[0, 1, 2, 1, 2]).get_simplified_mapping(),
965 vec![0, 1, 2, 3, 4]
966 );
967 assert_eq!(
968 c(&[0, 1, 2, 1, 3]).get_simplified_mapping(),
969 vec![0, 1, 2, 3, 4]
970 );
971 assert_eq!(c(&[0, 1, 2, 2, 0]).get_simplified_mapping(), vec![0, 1, 4]);
972 assert_eq!(c(&[0, 1, 2, 2, 1]).get_simplified_mapping(), vec![0]);
973 assert_eq!(c(&[0, 1, 2, 2, 2]).get_simplified_mapping(), vec![0, 1, 4]);
974 assert_eq!(c(&[0, 1, 2, 2, 3]).get_simplified_mapping(), vec![0, 1, 4]);
975 assert_eq!(
976 c(&[0, 1, 2, 3, 0]).get_simplified_mapping(),
977 vec![0, 1, 2, 3, 4]
978 );
979 assert_eq!(c(&[0, 1, 2, 3, 1]).get_simplified_mapping(), vec![0, 3, 2]);
980 assert_eq!(
981 c(&[0, 1, 2, 3, 2]).get_simplified_mapping(),
982 vec![0, 1, 2, 3, 4]
983 );
984 assert_eq!(
985 c(&[0, 1, 2, 3, 4, 5, 1]).get_simplified_mapping(),
986 vec![0, 3, 4, 5, 2]
987 );
988 assert_eq!(
989 c(&[0, 1, 2, 3, 4]).get_simplified_mapping(),
990 vec![0, 1, 2, 3, 4]
991 );
992 assert_eq!(c(&[2, 0, 3, 1, 1]).get_simplified_mapping(), vec![0, 1, 2]);
993 }
994
995 #[test]
996 fn test_simplify() {
997 assert_eq!(c(&[0]).simplify(), c(&[0]));
999 assert_eq!(c(&[0, 0, 0]).simplify(), c(&[0]));
1001 assert_eq!(c(&[0, 0, 1]).simplify(), c(&[1]));
1002 assert_eq!(c(&[1, 0, 0]).simplify(), c(&[1]));
1003 assert_eq!(c(&[1, 0, 1]).simplify(), c(&[1, 0, 1]));
1004 assert_eq!(c(&[1, 0, 2]).simplify(), c(&[1, 0, 2]));
1005 assert_eq!(c(&[0, 0, 0, 0, 0]).simplify(), c(&[0]));
1007 assert_eq!(c(&[0, 0, 0, 0, 1]).simplify(), c(&[1]));
1008 assert_eq!(c(&[0, 0, 0, 1, 0]).simplify(), c(&[0, 1, 0]));
1009 assert_eq!(c(&[0, 0, 0, 1, 1]).simplify(), c(&[0]));
1010 assert_eq!(c(&[0, 0, 0, 1, 2]).simplify(), c(&[0, 1, 2]));
1011 assert_eq!(c(&[0, 0, 1, 0, 0]).simplify(), c(&[1]));
1012 assert_eq!(c(&[0, 0, 1, 0, 1]).simplify(), c(&[1, 0, 1]));
1013 assert_eq!(c(&[0, 0, 1, 0, 2]).simplify(), c(&[1, 0, 2]));
1014 assert_eq!(c(&[0, 0, 1, 1, 0]).simplify(), c(&[0]));
1015 assert_eq!(c(&[0, 0, 1, 1, 1]).simplify(), c(&[1]));
1016 assert_eq!(c(&[0, 0, 1, 1, 2]).simplify(), c(&[2]));
1017 assert_eq!(c(&[0, 0, 2, 1, 0]).simplify(), c(&[2, 1, 0]));
1018 assert_eq!(c(&[0, 0, 2, 1, 1]).simplify(), c(&[2]));
1019 assert_eq!(c(&[0, 0, 2, 1, 2]).simplify(), c(&[2, 1, 2]));
1020 assert_eq!(c(&[0, 0, 2, 1, 3]).simplify(), c(&[2, 1, 3]));
1021 assert_eq!(c(&[0, 1, 0, 0, 0]).simplify(), c(&[0, 1, 0]));
1022 assert_eq!(c(&[0, 1, 0, 0, 1]).simplify(), c(&[0]));
1023 assert_eq!(c(&[0, 1, 0, 0, 2]).simplify(), c(&[2, 1, 0]));
1024 assert_eq!(c(&[0, 1, 0, 1, 0]).simplify(), c(&[0, 1, 0, 1, 0]));
1025 assert_eq!(c(&[0, 1, 0, 1, 1]).simplify(), c(&[0, 1, 0]));
1026 assert_eq!(c(&[0, 1, 0, 1, 2]).simplify(), c(&[0, 1, 0, 1, 2]));
1027 assert_eq!(c(&[0, 1, 0, 2, 0]).simplify(), c(&[0, 1, 0, 2, 0]));
1028 assert_eq!(c(&[0, 1, 0, 2, 1]).simplify(), c(&[0, 2, 0]));
1029 assert_eq!(c(&[0, 1, 0, 2, 2]).simplify(), c(&[0, 1, 0]));
1030 assert_eq!(c(&[0, 1, 0, 2, 3]).simplify(), c(&[0, 1, 0, 2, 3]));
1031 assert_eq!(c(&[0, 1, 1, 0, 0]).simplify(), c(&[0]));
1032 assert_eq!(c(&[0, 1, 1, 0, 1]).simplify(), c(&[1]));
1033 assert_eq!(c(&[0, 1, 1, 0, 2]).simplify(), c(&[2]));
1034 assert_eq!(c(&[0, 1, 1, 1, 0]).simplify(), c(&[0, 1, 0]));
1035 assert_eq!(c(&[0, 1, 1, 1, 1]).simplify(), c(&[0]));
1036 assert_eq!(c(&[0, 1, 1, 1, 2]).simplify(), c(&[0, 1, 2]));
1037 assert_eq!(c(&[0, 1, 1, 2, 0]).simplify(), c(&[0, 2, 0]));
1038 assert_eq!(c(&[0, 1, 1, 2, 1]).simplify(), c(&[0, 2, 1]));
1039 assert_eq!(c(&[0, 1, 1, 2, 2]).simplify(), c(&[0]));
1040 assert_eq!(c(&[0, 1, 1, 2, 3]).simplify(), c(&[0, 2, 3]));
1041 assert_eq!(c(&[0, 1, 2, 0, 0]).simplify(), c(&[0, 1, 2]));
1042 assert_eq!(c(&[0, 1, 2, 0, 1]).simplify(), c(&[2]));
1043 assert_eq!(c(&[0, 1, 2, 0, 2]).simplify(), c(&[2, 1, 2]));
1044 assert_eq!(c(&[0, 1, 2, 0, 3]).simplify(), c(&[3, 1, 2]));
1045 assert_eq!(c(&[0, 1, 2, 1, 0]).simplify(), c(&[0, 1, 2, 1, 0]));
1046 assert_eq!(c(&[0, 1, 2, 1, 1]).simplify(), c(&[0, 1, 2]));
1047 assert_eq!(c(&[0, 1, 2, 1, 2]).simplify(), c(&[0, 1, 2, 1, 2]));
1048 assert_eq!(c(&[0, 1, 2, 1, 3]).simplify(), c(&[0, 1, 2, 1, 3]));
1049 assert_eq!(c(&[0, 1, 2, 2, 0]).simplify(), c(&[0, 1, 0]));
1050 assert_eq!(c(&[0, 1, 2, 2, 1]).simplify(), c(&[0]));
1051 assert_eq!(c(&[0, 1, 2, 2, 2]).simplify(), c(&[0, 1, 2]));
1052 assert_eq!(c(&[0, 1, 2, 2, 3]).simplify(), c(&[0, 1, 3]));
1053 assert_eq!(c(&[0, 1, 2, 3, 0]).simplify(), c(&[0, 1, 2, 3, 0]));
1054 assert_eq!(c(&[0, 1, 2, 3, 1]).simplify(), c(&[0, 3, 2]));
1055 assert_eq!(c(&[0, 1, 2, 3, 2]).simplify(), c(&[0, 1, 2, 3, 2]));
1056 assert_eq!(c(&[0, 1, 2, 3, 3]).simplify(), c(&[0, 1, 2]));
1057 assert_eq!(c(&[0, 1, 2, 3, 4]).simplify(), c(&[0, 1, 2, 3, 4]));
1058 assert_eq!(c(&[0, 1, 2, 3, 4, 5, 1]).simplify(), c(&[0, 3, 4, 5, 2]));
1059 }
1060
1061 #[test]
1062 fn test_simplify_by() {
1063 fn enumerate_and_simplify_by(merge: Merge<i32>) -> Merge<(usize, i32)> {
1064 let enumerated = Merge::from_vec(merge.iter().copied().enumerate().collect_vec());
1065 enumerated.simplify_by(|&(_index, value)| value)
1066 }
1067
1068 assert_eq!(enumerate_and_simplify_by(c(&[0])), c(&[(0, 0)]));
1070 assert_eq!(enumerate_and_simplify_by(c(&[1, 0, 0])), c(&[(0, 1)]));
1072 assert_eq!(
1073 enumerate_and_simplify_by(c(&[1, 0, 2])),
1074 c(&[(0, 1), (1, 0), (2, 2)])
1075 );
1076 assert_eq!(enumerate_and_simplify_by(c(&[0, 0, 0, 0, 0])), c(&[(4, 0)]));
1078 assert_eq!(enumerate_and_simplify_by(c(&[0, 0, 0, 0, 1])), c(&[(4, 1)]));
1079 assert_eq!(
1080 enumerate_and_simplify_by(c(&[0, 0, 0, 1, 2])),
1081 c(&[(2, 0), (3, 1), (4, 2)])
1082 );
1083 assert_eq!(
1084 enumerate_and_simplify_by(c(&[0, 1, 2, 2, 0])),
1085 c(&[(0, 0), (1, 1), (4, 0)])
1086 );
1087 assert_eq!(
1088 enumerate_and_simplify_by(c(&[0, 1, 2, 2, 2])),
1089 c(&[(0, 0), (1, 1), (4, 2)])
1090 );
1091 assert_eq!(
1092 enumerate_and_simplify_by(c(&[0, 1, 2, 2, 3])),
1093 c(&[(0, 0), (1, 1), (4, 3)])
1094 );
1095 assert_eq!(
1096 enumerate_and_simplify_by(c(&[0, 1, 2, 3, 4])),
1097 c(&[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)])
1098 );
1099 }
1100
1101 #[test]
1102 fn test_update_from_simplified() {
1103 assert_eq!(c(&[0]).update_from_simplified(c(&[1])), c(&[1]));
1105 assert_eq!(c(&[0, 0, 0]).update_from_simplified(c(&[1])), c(&[0, 0, 1]));
1107 assert_eq!(c(&[1, 0, 0]).update_from_simplified(c(&[2])), c(&[2, 0, 0]));
1108 assert_eq!(
1109 c(&[1, 0, 2]).update_from_simplified(c(&[2, 1, 3])),
1110 c(&[2, 1, 3])
1111 );
1112 assert_eq!(
1114 c(&[0, 0, 0, 0, 0]).update_from_simplified(c(&[1])),
1115 c(&[0, 0, 0, 0, 1])
1116 );
1117 assert_eq!(
1118 c(&[0, 0, 0, 1, 0]).update_from_simplified(c(&[2, 3, 1])),
1119 c(&[0, 0, 2, 3, 1])
1120 );
1121 assert_eq!(
1122 c(&[0, 1, 0, 0, 0]).update_from_simplified(c(&[2, 3, 1])),
1123 c(&[0, 3, 1, 0, 2])
1124 );
1125 assert_eq!(
1126 c(&[2, 0, 3, 1, 4]).update_from_simplified(c(&[3, 1, 4, 2, 5])),
1127 c(&[3, 1, 4, 2, 5])
1128 );
1129
1130 assert_eq!(c(&[0, 0, 3, 1, 3, 2, 4]).simplify(), c(&[3, 1, 3, 2, 4]));
1131 assert_eq!(
1134 c(&[0, 0, 3, 1, 3, 2, 4]).update_from_simplified(c(&[10, 1, 11, 2, 4])),
1135 c(&[0, 0, 10, 1, 11, 2, 4])
1136 );
1137 }
1138
1139 #[test]
1140 fn test_merge_invariants() {
1141 fn check_invariants(terms: &[u32]) {
1142 let merge = Merge::from_vec(terms.to_vec());
1143 assert_eq!(
1145 merge.simplify().simplify(),
1146 merge.simplify(),
1147 "simplify() not idempotent for {merge:?}"
1148 );
1149 assert_eq!(
1151 merge.simplify().resolve_trivial(SameChange::Accept),
1152 merge.resolve_trivial(SameChange::Accept),
1153 "simplify() changed result of resolve_trivial() for {merge:?}"
1154 );
1155 }
1156 check_invariants(&[0]);
1158 for i in 0..=1 {
1159 for j in 0..=i + 1 {
1160 check_invariants(&[i, 0, j]);
1162 for k in 0..=j + 1 {
1163 for l in 0..=k + 1 {
1164 check_invariants(&[0, i, j, k, l]);
1166 }
1167 }
1168 }
1169 }
1170 }
1171
1172 #[test]
1173 fn test_swap_remove() {
1174 let mut x = c(&[0, 1, 2, 3, 4, 5, 6]);
1175 assert_eq!(x.swap_remove(0, 1), (1, 2));
1176 assert_eq!(x, c(&[0, 5, 6, 3, 4]));
1177 assert_eq!(x.swap_remove(1, 0), (3, 0));
1178 assert_eq!(x, c(&[4, 5, 6]));
1179 assert_eq!(x.swap_remove(0, 1), (5, 6));
1180 assert_eq!(x, c(&[4]));
1181 }
1182
1183 #[test]
1184 fn test_pad_to() {
1185 let mut x = c(&[1]);
1186 x.pad_to(3, &2);
1187 assert_eq!(x, c(&[1, 2, 2, 2, 2]));
1188 x.pad_to(1, &3);
1190 assert_eq!(x, c(&[1, 2, 2, 2, 2]));
1191 }
1192
1193 #[test]
1194 fn test_iter() {
1195 assert_eq!(c(&[1]).iter().collect_vec(), vec![&1]);
1197 assert_eq!(
1199 c(&[1, 2, 3, 4, 5]).iter().collect_vec(),
1200 vec![&1, &2, &3, &4, &5]
1201 );
1202 }
1203
1204 #[test]
1205 fn test_from_iter() {
1206 assert_eq!(MergeBuilder::from_iter([1]).build(), c(&[1]));
1208 assert_eq!(
1210 MergeBuilder::from_iter([1, 2, 3, 4, 5]).build(),
1211 c(&[1, 2, 3, 4, 5])
1212 );
1213 }
1214
1215 #[test]
1216 #[should_panic]
1217 fn test_from_iter_empty() {
1218 MergeBuilder::from_iter([1; 0]).build();
1219 }
1220
1221 #[test]
1222 #[should_panic]
1223 fn test_from_iter_even() {
1224 MergeBuilder::from_iter([1, 2]).build();
1225 }
1226
1227 #[test]
1228 fn test_extend() {
1229 let mut builder: MergeBuilder<i32> = Default::default();
1231 builder.extend([1]);
1232 assert_eq!(builder.build(), c(&[1]));
1233 let mut builder: MergeBuilder<i32> = Default::default();
1235 builder.extend([1, 2]);
1236 builder.extend([3, 4, 5]);
1237 assert_eq!(builder.build(), c(&[1, 2, 3, 4, 5]));
1238 }
1239
1240 #[test]
1241 fn test_map() {
1242 fn increment(i: &i32) -> i32 {
1243 i + 1
1244 }
1245 assert_eq!(c(&[1]).map(increment), c(&[2]));
1247 assert_eq!(c(&[1, 3, 5]).map(increment), c(&[2, 4, 6]));
1249 }
1250
1251 #[test]
1252 fn test_try_map() {
1253 fn sqrt(i: &i32) -> Result<i32, ()> {
1254 if *i >= 0 {
1255 Ok(f64::from(*i).sqrt() as i32)
1256 } else {
1257 Err(())
1258 }
1259 }
1260 assert_eq!(c(&[1]).try_map(sqrt), Ok(c(&[1])));
1262 assert_eq!(c(&[-1]).try_map(sqrt), Err(()));
1263 assert_eq!(c(&[1, 4, 9]).try_map(sqrt), Ok(c(&[1, 2, 3])));
1265 assert_eq!(c(&[-1, 4, 9]).try_map(sqrt), Err(()));
1266 assert_eq!(c(&[1, -4, 9]).try_map(sqrt), Err(()));
1267 }
1268
1269 #[test]
1270 fn test_flatten() {
1271 assert_eq!(c(&[c(&[0])]).flatten(), c(&[0]));
1273 assert_eq!(c(&[c(&[0, 1, 2])]).flatten(), c(&[0, 1, 2]));
1275 assert_eq!(c(&[c(&[0]), c(&[1]), c(&[2])]).flatten(), c(&[0, 1, 2]));
1277 assert_eq!(
1279 c(&[c(&[0, 1, 2]), c(&[3, 4, 5]), c(&[6, 7, 8])]).flatten(),
1280 c(&[0, 1, 2, 5, 4, 3, 6, 7, 8])
1281 );
1282 }
1283
1284 #[test]
1285 fn test_zip() {
1286 assert_eq!(c(&[1]).zip(c(&[2])), c(&[(1, 2)]));
1288 assert_eq!(
1290 c(&[1, 2, 3]).zip(c(&[4, 5, 6])),
1291 c(&[(1, 4), (2, 5), (3, 6)])
1292 );
1293 }
1294
1295 #[test]
1296 fn test_unzip() {
1297 assert_eq!(c(&[(1, 2)]).unzip(), (c(&[1]), c(&[2])));
1299 assert_eq!(
1301 c(&[(1, 4), (2, 5), (3, 6)]).unzip(),
1302 (c(&[1, 2, 3]), c(&[4, 5, 6]))
1303 );
1304 }
1305}