use crate::consts::*;
pub fn into_v16(s: &str) -> Vec<u16> {
String::from(s).encode_utf16().filter(|c| *c != 13).collect()
}
pub fn drop_while(v: &Vec<u16>, c: u16) -> Vec<u16> {
let mut index = 0;
while index < v.len() {
if v[index] != c {
break;
}
index += 1;
}
v[index..].to_vec()
}
pub fn take_while(v: &Vec<u16>, c: u16) -> Vec<u16> {
let mut index = 0;
while index < v.len() {
if v[index] != c {
break;
}
index += 1;
}
v[0..index].to_vec()
}
pub fn take_and_drop_while(v: &Vec<u16>, c: u16) -> (Vec<u16>, Vec<u16>) {
let mut index = 0;
while index < v.len() {
if v[index] != c {
break;
}
index += 1;
}
(v[0..index].to_vec(), v[index..].to_vec())
}
pub fn get_bracket_end_index(v: &[u16], index: usize) -> Option<usize> {
get_partner_index(v, index, U16_LEFT_SQUARE_BRACKET, U16_RIGHT_SQUARE_BRACKET)
}
pub fn get_parenthesis_end_index(v: &Vec<u16>, index: usize) -> Option<usize> {
get_partner_index(v, index, U16_LEFT_PARENTHESIS, U16_RIGHT_PARENTHESIS)
}
pub fn get_curly_brace_end_index(v: &Vec<u16>, index: usize) -> Option<usize> {
get_partner_index(v, index, U16_LEFT_CURLY_BRACE, U16_RIGHT_CURLY_BRACE)
}
fn get_partner_index(v: &[u16], begin_index: usize, s: u16, p: u16) -> Option<usize> {
let mut stack: i32 = 0;
for index in begin_index..v.len() {
if v[index] == s {
stack += 1;
}
else if v[index] == p {
stack -= 1;
if stack == 0 {
return Some(index);
}
}
}
None
}
pub fn remove_special_characters(line: &Vec<u16>) -> Vec<u16> {
line.iter().filter(
|c| &47 < *c && *c < &58 ||
&64 < *c && *c < &91 ||
&96 < *c && *c < &123 ||
&44031 < *c && *c < &55203
).map(|c| *c).collect()
}
pub fn lowercase(c: u16) -> u16 {
if U16_BIG_A <= c && c <= U16_BIG_Z {
c + 32
}
else {
c
}
}
pub fn is_alphabet(c: u16) -> bool {
U16_BIG_A <= c && c <= U16_BIG_Z || U16_SMALL_A <= c && c <= U16_SMALL_Z
}
pub fn lowercase_and_remove_spaces(content: &[u16]) -> Vec<u16> {
content.iter().filter(|c| *c != &U16_SPACE).map(|c| lowercase(*c)).collect::<Vec<u16>>()
}
#[cfg(test)]
mod tests {
#[test]
fn partner_test() {
use crate::utils::{get_parenthesis_end_index, get_bracket_end_index};
let org = "[name](link)".encode_utf16().collect::<Vec<u16>>();
assert_eq!(get_bracket_end_index(&org, 0), Some(5));
assert_eq!(get_bracket_end_index(&org, 1), None);
assert_eq!(get_parenthesis_end_index(&org, 6), Some(11));
assert_eq!(get_parenthesis_end_index(&org, 7), None);
}
}