use super::traits::*;
type T2<T> = (T, T);
type T2String = T2<String>;
impl PrefixMatch<T2String> for T2String {
fn get_prefix_from_term(term: &T2String) -> &PrefixStr {
term.0.as_str()
}
fn prefix_terms<'a>(&'a self) -> impl Iterator<Item = &'a T2String> + 'a
where
T2String: 'a,
{
[self].into_iter()
}
}
impl SuffixMatch<T2String> for T2String {
fn get_suffix_from_term(term: &T2String) -> &SuffixStr {
term.1.as_str()
}
fn suffix_terms<'a>(&'a self) -> impl Iterator<Item = &'a T2String> + 'a
where
T2String: 'a,
{
[self].into_iter()
}
}
type T2RefStr<'a> = T2<&'a str>;
impl<'s> PrefixMatch<T2RefStr<'s>> for T2RefStr<'s> {
fn get_prefix_from_term(term: &T2RefStr<'s>) -> &'s PrefixStr {
term.0
}
fn prefix_terms<'a>(&'a self) -> impl Iterator<Item = &'a T2RefStr<'s>> + 'a
where
T2RefStr<'s>: 'a,
{
[self].into_iter()
}
}
impl<'s> SuffixMatch<T2RefStr<'s>> for T2RefStr<'s> {
fn get_suffix_from_term(term: &T2RefStr<'s>) -> &'s SuffixStr {
term.1
}
fn suffix_terms<'a>(&'a self) -> impl Iterator<Item = &'a T2RefStr<'s>> + 'a
where
T2RefStr<'s>: 'a,
{
[self].into_iter()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{test_match_prefix, test_match_suffix};
#[test]
fn test_string() {
let mut tuple: T2String = ("a".into(), "c".into());
test_match_prefix! {
tuple;
"abc" => Some("c")
"alpha" => Some("c")
"argon" => Some("c")
}
test_match_suffix! {
tuple;
"func" => Some("a")
"sync" => Some("a")
"panic" => Some("a")
}
tuple = ("A".into(), "C".into());
test_match_prefix! {
tuple;
"Alpha" => Some("C")
"A, B, C" => Some("C")
"Aaron" => Some("C")
"Arc" => Some("C")
"ARCJ137442" => Some("C")
}
test_match_suffix! {
tuple;
"INC" => Some("A")
"SYNC" => Some("A")
"A, B, C" => Some("A")
"BASIC" => Some("A")
"Objective-C" => Some("A")
}
}
#[test]
fn test_ref_str() {
let mut tuple: T2RefStr = ("a", "c");
test_match_prefix! {
tuple;
"abc" => Some("c")
"alpha" => Some("c")
"argon" => Some("c")
}
test_match_suffix! {
tuple;
"func" => Some("a")
"sync" => Some("a")
"panic" => Some("a")
}
tuple = ("A", "C");
test_match_prefix! {
tuple;
"Alpha" => Some("C")
"A, B, C" => Some("C")
"Aaron" => Some("C")
"Arc" => Some("C")
"ARCJ137442" => Some("C")
}
test_match_suffix! {
tuple;
"INC" => Some("A")
"SYNC" => Some("A")
"A, B, C" => Some("A")
"BASIC" => Some("A")
"Objective-C" => Some("A")
}
}
}