use derive_more::{ Deref, DerefMut };
#[derive(Debug, Default, Clone, Deref, DerefMut, Eq, PartialEq)]
pub struct Alignment(Vec<(usize, usize)>);
impl Alignment {
pub fn wrap(vec: Vec<(usize, usize)>) -> Self {
Self(vec)
}
}
pub type Aligner<T> = fn(&Vec<T>, &Vec<T>) -> Alignment;
impl Alignment {
pub fn corresponding<T>(
row1: &Vec<T>,
row2: &Vec<T>
) -> Self {
let r1 = row1.len();
let r2 = row2.len();
let max = if r1 > r2 { r2 } else { r1 };
let mut vec = Vec::new();
for i in 0..max {
vec.push((i, i))
}
Self::wrap(vec)
}
pub fn reversed<T>(
row1: &Vec<T>,
row2: &Vec<T>
) -> Self {
let r1 = row1.len();
let r2 = row2.len();
let max = if r1 > r2 { r2 } else { r1 };
let mut vec = Vec::new();
for i in 0..max {
vec.push((0+i, r2-1-i))
}
Self::wrap(vec)
}
pub fn random<T>(
row1: &Vec<T>,
row2: &Vec<T>
) -> Self {
let r1 = row1.len();
let r2 = row2.len();
let max = if r1 > r2 { r2 } else { r1 };
let mut vec1 = Vec::new();
let mut vec2 = Vec::new();
for _1 in 0..r1 {
vec1.push(_1)
}
for _2 in 0..r2 {
vec2.push(_2)
}
use rand::seq::SliceRandom;
vec1.shuffle(&mut rand::thread_rng());
vec2.shuffle(&mut rand::thread_rng());
let mut vec = Vec::new();
for i in 0..max {
vec.push((vec1[i], vec2[i]))
}
Self::wrap(vec)
}
pub fn dense<T>(
row1: &Vec<T>,
row2: &Vec<T>
) -> Self {
let r1 = row1.len();
let r2 = row2.len();
let mut vec = Vec::new();
for _1 in 0..r1 {
for _2 in 0..r2 {
vec.push((_1, _2))
}
}
Self::wrap(vec)
}
pub fn centered<T>(
row1: &Vec<T>,
row2: &Vec<T>
) -> Self {
let r1 = row1.len();
let r2 = row2.len();
let (max, diff) = if r1 > r2 {
(r2, r1 - r2)
} else {
(r1, r2 - r1)
};
let offset = diff / 2;
let mut vec = Vec::new();
if r1 > r2 {
for i in 0..max {
vec.push((i+offset, i))
}
} else {
for i in 0..max {
vec.push((i, i+offset))
}
}
Self::wrap(vec)
}
pub fn none<T>(
_row1: &Vec<T>,
_row2: &Vec<T>
) -> Self {
Self::default()
}
}