use ferray_core::Array;
use ferray_core::dimension::Dimension;
use ferray_core::error::FerrayResult;
use crate::string_array::StringArray;
pub fn str_len<D: Dimension>(a: &StringArray<D>) -> FerrayResult<Array<i64, D>> {
let data: Vec<i64> = a.iter().map(|s| s.chars().count() as i64).collect();
Array::from_vec(a.dim().clone(), data)
}
pub fn swapcase<D: Dimension>(a: &StringArray<D>) -> FerrayResult<StringArray<D>> {
a.map(|s| {
s.chars()
.map(|c| {
if c.is_uppercase() {
c.to_lowercase().collect::<String>()
} else if c.is_lowercase() {
c.to_uppercase().collect::<String>()
} else {
c.to_string()
}
})
.collect()
})
}
pub fn equal<D: Dimension>(a: &StringArray<D>, b: &StringArray<D>) -> FerrayResult<Array<bool, D>> {
let data: Vec<bool> = a.iter().zip(b.iter()).map(|(x, y)| x == y).collect();
Array::from_vec(a.dim().clone(), data)
}
pub fn not_equal<D: Dimension>(
a: &StringArray<D>,
b: &StringArray<D>,
) -> FerrayResult<Array<bool, D>> {
let data: Vec<bool> = a.iter().zip(b.iter()).map(|(x, y)| x != y).collect();
Array::from_vec(a.dim().clone(), data)
}
pub fn less<D: Dimension>(a: &StringArray<D>, b: &StringArray<D>) -> FerrayResult<Array<bool, D>> {
let data: Vec<bool> = a.iter().zip(b.iter()).map(|(x, y)| x < y).collect();
Array::from_vec(a.dim().clone(), data)
}
pub fn greater<D: Dimension>(
a: &StringArray<D>,
b: &StringArray<D>,
) -> FerrayResult<Array<bool, D>> {
let data: Vec<bool> = a.iter().zip(b.iter()).map(|(x, y)| x > y).collect();
Array::from_vec(a.dim().clone(), data)
}
pub fn less_equal<D: Dimension>(
a: &StringArray<D>,
b: &StringArray<D>,
) -> FerrayResult<Array<bool, D>> {
let data: Vec<bool> = a.iter().zip(b.iter()).map(|(x, y)| x <= y).collect();
Array::from_vec(a.dim().clone(), data)
}
pub fn greater_equal<D: Dimension>(
a: &StringArray<D>,
b: &StringArray<D>,
) -> FerrayResult<Array<bool, D>> {
let data: Vec<bool> = a.iter().zip(b.iter()).map(|(x, y)| x >= y).collect();
Array::from_vec(a.dim().clone(), data)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::string_array::array;
#[test]
fn test_str_len() {
let a = array(&["hello", "", "abc", "hi"]).unwrap();
let r = str_len(&a).unwrap();
assert_eq!(r.as_slice().unwrap(), &[5, 0, 3, 2]);
}
#[test]
fn test_swapcase() {
let a = array(&["Hello World", "ABC", "abc", "123"]).unwrap();
let r = swapcase(&a).unwrap();
assert_eq!(r.as_slice(), &["hELLO wORLD", "abc", "ABC", "123"]);
}
#[test]
fn test_equal() {
let a = array(&["abc", "def", "ghi"]).unwrap();
let b = array(&["abc", "xyz", "ghi"]).unwrap();
let r = equal(&a, &b).unwrap();
assert_eq!(r.as_slice().unwrap(), &[true, false, true]);
}
#[test]
fn test_less() {
let a = array(&["abc", "xyz"]).unwrap();
let b = array(&["abd", "abc"]).unwrap();
let r = less(&a, &b).unwrap();
assert_eq!(r.as_slice().unwrap(), &[true, false]);
}
#[test]
fn test_greater() {
let a = array(&["xyz", "abc"]).unwrap();
let b = array(&["abc", "xyz"]).unwrap();
let r = greater(&a, &b).unwrap();
assert_eq!(r.as_slice().unwrap(), &[true, false]);
}
}