summaryrefslogtreecommitdiffstats
path: root/src/minusplus.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/minusplus.rs')
-rw-r--r--src/minusplus.rs51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/minusplus.rs b/src/minusplus.rs
new file mode 100644
index 00000000..e37c801c
--- /dev/null
+++ b/src/minusplus.rs
@@ -0,0 +1,51 @@
+use std::ops::{Index, IndexMut};
+
+/// Represent data related to removed/minus and added/plus lines which
+/// can be indexed with [`MinusPlusIndex::{Plus`](MinusPlusIndex::Plus)`,`[`Minus}`](MinusPlusIndex::Minus).
+#[derive(Debug, PartialEq, Eq)]
+pub struct MinusPlus<T> {
+ pub minus: T,
+ pub plus: T,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum MinusPlusIndex {
+ Minus,
+ Plus,
+}
+
+pub use MinusPlusIndex::*;
+
+impl<T> Index<MinusPlusIndex> for MinusPlus<T> {
+ type Output = T;
+ fn index(&self, side: MinusPlusIndex) -> &Self::Output {
+ match side {
+ Minus => &self.minus,
+ Plus => &self.plus,
+ }
+ }
+}
+
+impl<T> IndexMut<MinusPlusIndex> for MinusPlus<T> {
+ fn index_mut(&mut self, side: MinusPlusIndex) -> &mut Self::Output {
+ match side {
+ Minus => &mut self.minus,
+ Plus => &mut self.plus,
+ }
+ }
+}
+
+impl<T> MinusPlus<T> {
+ pub fn new(minus: T, plus: T) -> Self {
+ MinusPlus { minus, plus }
+ }
+}
+
+impl<T: Default> Default for MinusPlus<T> {
+ fn default() -> Self {
+ Self {
+ minus: T::default(),
+ plus: T::default(),
+ }
+ }
+}