module/types/first.rs
1//! A no-op merge that retains the first value.
2//!
3//! See: [`First`].
4
5use super::prelude::*;
6
7merge_thin_wrapper! {
8 /// A no-op merge that retains the first value.
9 ///
10 /// This type provides a merge implementation that _does nothing_. Merging
11 /// anything with a value of this type results in the other value getting
12 /// discarded.
13 ///
14 /// The opposite of this is [`Last`].
15 ///
16 /// # Example
17 ///
18 /// ```rust
19 /// # use module::types::First;
20 /// # use module::merge::Merge;
21 /// let a = First(vec![0, 1, 2]);
22 /// let b = First(vec![3, 4]);
23 ///
24 /// let merged = a.merge(b).unwrap();
25 ///
26 /// assert_eq!(*merged, &[0, 1, 2]);
27 /// ```
28 ///
29 /// # serde
30 ///
31 /// This type deserializes like `T`.
32 ///
33 /// [`Last`]: crate::types::Last
34 #[cfg_attr(feature = "serde", derive(serde::Deserialize))]
35 pub struct First;
36}
37
38impl<T> Merge for First<T> {
39 #[inline]
40 fn merge_ref(&mut self, _: Self) -> Result<(), Error> {
41 Ok(())
42 }
43}
44
45#[cfg(test)]
46mod tests {
47 use super::*;
48
49 #[test]
50 fn test_merge_ab() {
51 let a = First(42);
52 let b = First(43);
53
54 let merged = a.merge(b).unwrap();
55 assert_eq!(*merged, 42);
56 }
57
58 #[test]
59 fn test_merge_ba() {
60 let a = First(42);
61 let b = First(43);
62
63 let merged = b.merge(a).unwrap();
64 assert_eq!(*merged, 43);
65 }
66}
67
68#[cfg(test)]
69#[cfg(feature = "serde")]
70mod serde_tests {
71 use super::*;
72
73 #[test]
74 fn test_deserialize() {
75 let x: First<i32> = serde_json::from_str("42").unwrap();
76 assert_eq!(*x, 42);
77 }
78}