use std::cmp::max;
pub fn hrule1_smush(ch1: u8, ch2: u8, hardBlank: u8) -> Option<u8> {
if ch1 == ch2 && ch1 != hardBlank {
Some(ch1)
} else {
None
}
}
pub fn hrule2_smush(ch1: u8, ch2: u8) -> Option<u8> {
const RULE: &'static str = "|/\\[]{}()<>";
match (ch1, ch2) {
(b'_', _) if RULE.find(ch2 as char).is_some() => Some(ch2),
(_, b'_') if RULE.find(ch1 as char).is_some() => Some(ch1),
_ => None,
}
}
pub fn hrule3_smush(ch1: u8, ch2: u8) -> Option<u8> {
const RULE: &'static str = "|/\\[]{}()<>";
if let (Some(p1), Some(p2)) = find_indexes(RULE, ch1, ch2) {
if p1 != p2 && (p1 as i32 - p2 as i32).abs() != 1 {
return Some(RULE.as_bytes()[max(p1, p2)] as u8);
}
}
None
}
pub fn hrule4_smush(ch1: u8, ch2: u8) -> Option<u8> {
const RULE: &'static str = "[] {} ()";
if let (Some(p1), Some(p2)) = find_indexes(RULE, ch1, ch2) {
if (p1 as i32 - p2 as i32).abs() <= 1 {
return Some(b'|');
}
}
None
}
pub fn hrule5_smush(c1: u8, c2: u8) -> Option<u8> {
match (c1, c2) {
(b'/', b'\\') => Some(b'|'),
(b'\\', b'/') => Some(b'Y'),
(b'>', b'<') => Some(b'X'),
_ => None,
}
}
pub fn hrule6_smush(c1: u8, c2: u8, hard_blank: u8) -> Option<u8> {
if c1 == hard_blank && c2 == hard_blank {
Some(hard_blank)
} else {
None
}
}
pub fn vrule1_smush(c1: u8, c2: u8) -> Option<u8> {
if c1 == c2 {
Some(c1)
} else {
None
}
}
pub fn vrule2_smush(c1: u8, c2: u8) -> Option<u8> {
hrule2_smush(c1, c2)
}
pub fn vrule3_smush(c1: u8, c2: u8) -> Option<u8> {
hrule3_smush(c1, c2)
}
pub fn vrule4_smush(c1: u8, c2: u8) -> Option<u8> {
match (c1, c2) {
(b'-', b'_') | (b'_', b'-') => Some(b'='),
_ => None,
}
}
pub fn vrule5_smush(c1: u8, c2: u8) -> Option<u8> {
if c1 == b'|' && c2 == b'|' {
Some(b'|')
} else {
None
}
}
pub fn uni_smush(c1: u8, c2: u8, hard_blank: u8) -> u8 {
if c2 == b' ' {
c1
} else if c2 == hard_blank && c1 != b' ' {
c1
} else {
c2
}
}
pub fn find_indexes(string: &'static str, c1: u8, c2: u8) -> (Option<usize>, Option<usize>) {
(string.find(c1 as char), string.find(c2 as char))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_hrule3_smush() {
assert_eq!(hrule3_smush(b'[', b')'), Some(b')'));
assert_eq!(hrule3_smush(b'>', b')'), Some(b'>'));
assert_eq!(hrule3_smush(b'>', b'_'), None);
}
#[test]
fn test_hrule5_smush() {
assert_eq!(hrule5_smush(b'/', b'\\'), Some(b'|'));
assert_eq!(hrule5_smush(b'\\', b'/'), Some(b'Y'));
assert_eq!(hrule5_smush(b'>', b'<'), Some(b'X'));
assert_eq!(hrule5_smush(b'>', b'_'), None);
}
}