chiark / gitweb /
utils: Provide OldNew
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 12 Feb 2021 00:45:52 +0000 (00:45 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 12 Feb 2021 01:38:24 +0000 (01:38 +0000)
Will be used by new hidden ocde.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/imports.rs
src/utils.rs

index 42d6fbf17880f0a6dd4127d0d6ff6f87deb2b123..b2e852f9f03a3540d86e54e63f48ef0a49471b12 100644 (file)
@@ -46,6 +46,7 @@ pub use anyhow::{anyhow, Context};
 pub use arrayvec::ArrayVec;
 pub use boolinator::Boolinator as _;
 pub use delegate::delegate;
+pub use derive_more::*;
 pub use either::{Either, Left, Right};
 pub use enum_map::{Enum, EnumMap};
 pub use fehler::{throw, throws};
index ae8bffb6ad45b8ac0156292b5d85b8ea0bac612e..43e4e472fd1acc690ef6931843ae4e16bf2f7fec 100644 (file)
@@ -5,9 +5,11 @@
 use std::fmt::{self, Debug};
 use std::fs;
 use std::io;
-use std::ops::Deref;
+use std::ops::{Deref, Index};
 use std::os::unix::io::IntoRawFd;
 
+use arrayvec::ArrayVec;
+use derive_more::*;
 use fehler::{throw, throws};
 use libc;
 
@@ -48,6 +50,46 @@ impl SplitAtDelim<char> for str {
   }
 }
 
+#[derive(Copy,Clone,Debug,From,Into)]
+#[derive(Hash,Eq,PartialEq)]
+pub struct OldNew<T>([T; 2]);
+
+#[derive(Copy,Clone,Debug)]
+#[derive(Hash,Eq,PartialEq)]
+pub enum OldNewIndex { Old, New }
+
+impl<T> OldNew<T> {
+  pub fn old(&self) -> &T { &self.0[0] }
+  pub fn new(&self) -> &T { &self.0[0] }
+
+  pub fn map<U, F: FnMut(&T) -> U>(&self, f: F) -> OldNew<U> {
+    OldNew(
+      self.iter().map(f)
+        .collect::<ArrayVec<[U; 2]>>()
+        .into_inner()
+        .unwrap_or_else(|_|panic!())
+    )
+  }
+
+  pub fn as_refs(&self) -> OldNew<&T> {
+    OldNew(
+      self.iter()
+        .collect::<ArrayVec<[&T; 2]>>()
+        .into_inner()
+        .unwrap_or_else(|_|panic!())
+    )
+  }
+
+  pub fn iter(&self) -> impl Iterator<Item=&T> {
+    self.0.iter()
+  }
+}
+
+impl<T> Index<OldNewIndex> for OldNew<T> {
+  type Output = T;
+  fn index(&self, i: OldNewIndex) -> &T { &self.0[i as usize] }
+}
+
 /*
 put trait OptionExt {
   type Output;