use core::ops::FnMut;
use composition::{canonical_decomposition, compatibility_decomposition};
use hangul;
pub fn decompose_canonical<F>(ch: char, mut callback: F)
where
F: FnMut(char),
{
d(ch, &mut callback, false);
}
pub fn decompose_compatible<F>(ch: char, mut callback: F)
where
F: FnMut(char),
{
d(ch, &mut callback, true);
}
fn d<F>(ch: char, callback: &mut F, k: bool)
where
F: FnMut(char),
{
if ch <= '\x7f' {
(*callback)(ch);
return;
}
if hangul::is_syllable(ch) {
hangul::decompose(ch, callback);
return;
}
if let Some(canon) = canonical_decomposition(ch) {
for x in canon {
d(*x, callback, k);
}
return;
}
if !k {
(*callback)(ch);
return;
}
if let Some(compat) = compatibility_decomposition(ch) {
for x in compat {
d(*x, callback, k);
}
return;
}
(*callback)(ch);
}