tp 0.1.26

text processing utilities
Documentation
pub fn trim_start(s: impl AsRef<str>, trimer: impl Fn(char) -> bool) -> usize {
  let s = s.as_ref();
  for (p, i) in s.char_indices() {
    if !trimer(i) {
      return p;
    }
  }
  s.len()
}

pub fn trim_end(s: impl AsRef<str>, trimer: impl Fn(char) -> bool) -> usize {
  let s = s.as_ref();
  let mut p = s.len();
  for (pos, i) in s.char_indices().rev() {
    if !trimer(i) {
      break;
    }
    p = pos;
  }
  p
}

pub fn chars(s: &str) -> impl Iterator<Item = (usize, char)> + '_ {
  let mut iter = s.char_indices();

  let mut pre = iter.next();
  std::iter::from_fn(move || {
    if let Some(p) = pre {
      let t = iter.next();
      let r;
      if let Some((pos, _)) = t {
        r = (pos, p.1);
        pre = t;
      } else {
        r = (s.len(), p.1);
        pre = None;
      }
      Some(r)
    } else {
      None
    }
  })
}