From: Ian Jackson Date: Fri, 12 Feb 2021 00:45:52 +0000 (+0000) Subject: utils: Provide OldNew X-Git-Tag: otter-0.4.0~548 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=32e9512b6a9b84582322f905679c1436e03ff25d;p=otter.git utils: Provide OldNew Will be used by new hidden ocde. Signed-off-by: Ian Jackson --- diff --git a/src/imports.rs b/src/imports.rs index 42d6fbf1..b2e852f9 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -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}; diff --git a/src/utils.rs b/src/utils.rs index ae8bffb6..43e4e472 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -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 for str { } } +#[derive(Copy,Clone,Debug,From,Into)] +#[derive(Hash,Eq,PartialEq)] +pub struct OldNew([T; 2]); + +#[derive(Copy,Clone,Debug)] +#[derive(Hash,Eq,PartialEq)] +pub enum OldNewIndex { Old, New } + +impl OldNew { + pub fn old(&self) -> &T { &self.0[0] } + pub fn new(&self) -> &T { &self.0[0] } + + pub fn map U>(&self, f: F) -> OldNew { + OldNew( + self.iter().map(f) + .collect::>() + .into_inner() + .unwrap_or_else(|_|panic!()) + ) + } + + pub fn as_refs(&self) -> OldNew<&T> { + OldNew( + self.iter() + .collect::>() + .into_inner() + .unwrap_or_else(|_|panic!()) + ) + } + + pub fn iter(&self) -> impl Iterator { + self.0.iter() + } +} + +impl Index for OldNew { + type Output = T; + fn index(&self, i: OldNewIndex) -> &T { &self.0[i as usize] } +} + /* put trait OptionExt { type Output;