Documentation
use std::str::FromStr;

///字符串按指定分隔符,返回指定的vec
pub fn str_2_vec<T: FromStr + Default>(str: &str, spl: &str) -> Vec<T> {
    let mut vec = vec![];
    if !str.is_empty() {
        let collect: Vec<&str> = str.split(spl).collect();
        for ele in collect {
            vec.push(ele.parse().unwrap_or_default());
        }
    }
    vec
}

/// 根据指定字符切分
pub fn cut<'a>(s: &'a str, spl: &'a str) -> (&'a str, &'a str, bool) {
    match s.find(spl) {
        Some(idx) => (&s[..idx], &s[idx + spl.len()..], true),
        None => (s, "", false),
    }
}

pub fn trim_all(s: &str) -> String {
    let mut in_sp = false;
    let mut ret = String::new();
    for c in s.chars() {
        if c == ' ' {
            if in_sp {
                continue;
            }
            in_sp = true;
        } else {
            in_sp = false;
        }
        ret.push(c);
    }
    let trim = ret.trim();
    trim.to_string()
}

/**

根据指定字符切分

# Examples

```
use caisin::strs::cut_end;

let s = "wx1_100_01";
let ret = cut_end(s, &'_');

assert_eq!(ret, ("wx1_100","01",true));
```
*/
pub fn cut_end<'a>(s: &'a str, spl: &'a char) -> (&'a str, &'a str, bool) {
    let mut idx = 0usize;
    let len = s.len();
    let rev = s.chars().rev();
    let mut find = false;
    for ele in rev {
        if ele.eq(spl) {
            find = true;
            break;
        }
        idx += 1;
    }
    (&s[0..(len - idx - 1)], &s[len - idx..len], find)
}

#[test]
fn test() {
    let s = "  a    b     c   ";
    let trim_all = trim_all(s);
    println!("{trim_all}")
}