unicode_normalization/
replace.rs1use core::{
11 fmt::{self, Write},
12 iter::FusedIterator,
13};
14use tinyvec::ArrayVec;
15
16#[derive(Clone)]
18pub struct Replacements<I> {
19 iter: I,
20 buffer: Option<char>,
23}
24
25#[inline]
26pub fn new_cjk_compat_variants<I: Iterator<Item = char>>(iter: I) -> Replacements<I> {
27 Replacements { iter, buffer: None }
28}
29
30impl<I: Iterator<Item = char>> Iterator for Replacements<I> {
31 type Item = char;
32
33 #[inline]
34 fn next(&mut self) -> Option<char> {
35 if let Some(c) = self.buffer.take() {
36 return Some(c);
37 }
38
39 match self.iter.next() {
40 Some(ch) => {
41 let mut buffer = ArrayVec::<[char; 2]>::new();
43 super::char::decompose_cjk_compat_variants(ch, |d| buffer.push(d));
44 self.buffer = buffer.get(1).copied();
45 Some(buffer[0])
46 }
47 None => None,
48 }
49 }
50
51 fn size_hint(&self) -> (usize, Option<usize>) {
52 let (lower, _) = self.iter.size_hint();
53 (lower, None)
54 }
55}
56
57impl<I: Iterator<Item = char> + FusedIterator> FusedIterator for Replacements<I> {}
58
59impl<I: Iterator<Item = char> + Clone> fmt::Display for Replacements<I> {
60 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
61 for c in self.clone() {
62 f.write_char(c)?;
63 }
64 Ok(())
65 }
66}