heh
Diffstat (limited to 'src/util.rs')
| -rw-r--r-- | src/util.rs | 60 |
1 files changed, 51 insertions, 9 deletions
diff --git a/src/util.rs b/src/util.rs index e2540c4..24148ec 100644 --- a/src/util.rs +++ b/src/util.rs @@ -10,8 +10,8 @@ pub mod prelude { pub(crate) use super::{bits, dang, leek, mat, shucks, C}; pub use super::{ even, gcd, lcm, pa, GreekTools, IntoCombinations, IntoLines, IterͶ, NumTupleIterTools, - ParseIter, Printable, Skip, TakeLine, TupleIterTools, TupleUtils, UnifiedTupleUtils, Widen, - 読む, Ͷ, Α, Κ, Λ, Μ, + ParseIter, Printable, Skip, TakeLine, TupleIterTools2, TupleIterTools3, TupleUtils, + UnifiedTupleUtils, Widen, 読む, Ͷ, Α, Κ, Λ, Μ, }; pub use itertools::izip; pub use itertools::Itertools; @@ -31,12 +31,19 @@ macro_rules! C { ($buf:ident[$n:expr]) => { unsafe { *$buf.get_unchecked($n) } }; + ($buf:ident[$a:expr] = $rbuf:ident[$b:expr]) => { + *unsafe { $buf.get_unchecked_mut($a) } = unsafe { *$rbuf.get_unchecked($b) } + }; ($buf:ident[$n:expr] = $e:expr) => { *unsafe { $buf.get_unchecked_mut($n) } = $e }; ($buf:ident[$a:expr][$b:expr]) => { unsafe { *$buf.get_unchecked($a).get_unchecked($b) } }; + ($buf:ident[$a:expr][$b:expr] = $rbuf:ident[$ra:expr]) => { + *unsafe { $buf.get_unchecked_mut($a).get_unchecked_mut($b) } = + unsafe { *$rbuf.get_unchecked($ra) } + }; ($buf:ident[$a:expr][$b:expr] = $rbuf:ident[$ra:expr][$rb:expr]) => { *unsafe { $buf.get_unchecked_mut($a).get_unchecked_mut($b) } = unsafe { *$rbuf.get_unchecked($ra).get_unchecked($rb) } @@ -359,9 +366,18 @@ impl<I: Iterator<Item = u64>> IterͶ for I { } } -pub trait TupleIterTools<T, U>: Iterator { - fn rml(self) -> impl Iterator<Item = U>; - fn rmr(self) -> impl Iterator<Item = T>; +pub trait TupleIterTools3<T, U, V>: Iterator { + fn l(self) -> impl Iterator<Item = T>; + fn m(self) -> impl Iterator<Item = U>; + fn r(self) -> impl Iterator<Item = V>; + fn lm(self) -> impl Iterator<Item = (T, U)>; + fn lr(self) -> impl Iterator<Item = (T, V)>; + fn mr(self) -> impl Iterator<Item = (U, V)>; +} + +pub trait TupleIterTools2<T, U>: Iterator { + fn l(self) -> impl Iterator<Item = T>; + fn r(self) -> impl Iterator<Item = U>; } pub trait NumTupleIterTools { @@ -374,12 +390,38 @@ impl<I: Iterator<Item = (u64, u64)>> NumTupleIterTools for I { } } -impl<T, U, I: Iterator<Item = (T, U)>> TupleIterTools<T, U> for I { - fn rml(self) -> impl Iterator<Item = U> { +impl<T, U, I: Iterator<Item = (T, U)>> TupleIterTools2<T, U> for I { + fn l(self) -> impl Iterator<Item = T> { + self.map(|(x, _)| x) + } + fn r(self) -> impl Iterator<Item = U> { self.map(|(_, x)| x) } - fn rmr(self) -> impl Iterator<Item = T> { - self.map(|(x, _)| x) +} + +impl<T, U, V, I: Iterator<Item = (T, U, V)>> TupleIterTools3<T, U, V> for I { + fn l(self) -> impl Iterator<Item = T> { + self.map(|(x, _, _)| x) + } + + fn m(self) -> impl Iterator<Item = U> { + self.map(|(_, x, _)| x) + } + + fn r(self) -> impl Iterator<Item = V> { + self.map(|(_, _, x)| x) + } + + fn lm(self) -> impl Iterator<Item = (T, U)> { + self.map(|(a, b, _)| (a, b)) + } + + fn lr(self) -> impl Iterator<Item = (T, V)> { + self.map(|(a, _, b)| (a, b)) + } + + fn mr(self) -> impl Iterator<Item = (U, V)> { + self.map(|(_, a, b)| (a, b)) } } |