use regex::Regex;
use std::collections::{BTreeSet, HashSet};
pub trait Clear {
fn clear(_: &mut String);
}
pub trait ExtractRegexStr {
fn extract_regex(&self, regex: &Regex) -> Option<String>;
}
pub trait ExtractRegexArray {
fn extract_regex(&self, regex: &Regex) -> Option<Vec<String>>;
}
impl ExtractRegexArray for [String] {
fn extract_regex(&self, regex: &Regex) -> Option<Vec<String>> {
let mut result: Vec<String> = Vec::new();
for i in self {
match regex.find(i) {
Some(fin) => {
result.push(fin.as_str().to_string());
}
_ => continue,
}
}
if result.is_empty() {
return None;
}
Some(result)
}
}
impl ExtractRegexStr for str {
fn extract_regex(&self, regex: &Regex) -> Option<String> {
let result = regex.find(self).map(|m| m.as_str().to_string());
result
}
}
impl Clear for String {
fn clear(string: &mut String) {
string.replace_range(0..string.len(), "")
}
}
pub fn unique_sorted<T: Ord>(array: impl IntoIterator<Item = T>) -> impl IntoIterator<Item = T> {
let set = BTreeSet::from_iter(array);
set.into_iter()
}
pub fn unique_ch<T: Ord + std::hash::Hash>(
array: impl IntoIterator<Item = T>,
) -> impl IntoIterator<Item = T> {
let mut set = HashSet::new();
for value in array {
set.insert(value);
}
set.into_iter()
}
pub fn unique<T: PartialEq>(array: impl IntoIterator<Item = T>) -> impl IntoIterator<Item = T> {
let mut vec = Vec::new();
for value in array {
if !vec.contains(&value) {
vec.push(value)
}
}
vec.into_iter()
}