1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-08-02 05:57:46 +00:00

Merge branch 'hbina-tr-reimplement-expansion' of github.com:hbina/coreutils into hbina-tr-reimplement-expansion

This commit is contained in:
Hanif Bin Ariffin 2021-10-24 11:41:19 +08:00
commit 002584d0dd
3 changed files with 14 additions and 9 deletions

View file

@ -15,7 +15,7 @@ fn parse_octal(input: &str) -> IResult<&str, char> {
preceded(tag("\\"), recognize(many_m_n(1, 3, one_of("01234567")))), preceded(tag("\\"), recognize(many_m_n(1, 3, one_of("01234567")))),
|out: &str| { |out: &str| {
u32::from_str_radix(out, 8) u32::from_str_radix(out, 8)
.map(char::from_u32) .map(std::char::from_u32)
.ok() .ok()
.flatten() .flatten()
}, },

View file

@ -76,7 +76,7 @@ impl Sequence {
pub fn flatten(&self) -> Box<dyn Iterator<Item = char>> { pub fn flatten(&self) -> Box<dyn Iterator<Item = char>> {
match self { match self {
Sequence::Char(c) => Box::new(std::iter::once(*c)), Sequence::Char(c) => Box::new(std::iter::once(*c)),
Sequence::CharRange(l, r) => Box::new((*l..=*r).flat_map(char::from_u32)), Sequence::CharRange(l, r) => Box::new((*l..=*r).flat_map(std::char::from_u32)),
Sequence::CharStar(c) => Box::new(std::iter::repeat(*c)), Sequence::CharStar(c) => Box::new(std::iter::repeat(*c)),
Sequence::CharRepeat(c, n) => Box::new(std::iter::repeat(*c).take(*n)), Sequence::CharRepeat(c, n) => Box::new(std::iter::repeat(*c).take(*n)),
Sequence::Alnum => Box::new(('0'..='9').chain('A'..='Z').chain('a'..='z')), Sequence::Alnum => Box::new(('0'..='9').chain('A'..='Z').chain('a'..='z')),
@ -85,7 +85,7 @@ impl Sequence {
Sequence::Control => Box::new( Sequence::Control => Box::new(
(0..=31) (0..=31)
.chain(std::iter::once(127)) .chain(std::iter::once(127))
.flat_map(char::from_u32), .flat_map(std::char::from_u32),
), ),
Sequence::Digit => Box::new('0'..='9'), Sequence::Digit => Box::new('0'..='9'),
Sequence::Graph => Box::new( Sequence::Graph => Box::new(
@ -98,7 +98,7 @@ impl Sequence {
.chain(91..=96) .chain(91..=96)
.chain(123..=126) .chain(123..=126)
.chain(std::iter::once(32)) // space .chain(std::iter::once(32)) // space
.flat_map(char::from_u32), .flat_map(std::char::from_u32),
), ),
Sequence::Lower => Box::new('a'..='z'), Sequence::Lower => Box::new('a'..='z'),
Sequence::Print => Box::new( Sequence::Print => Box::new(
@ -110,14 +110,14 @@ impl Sequence {
.chain(58..=64) .chain(58..=64)
.chain(91..=96) .chain(91..=96)
.chain(123..=126) .chain(123..=126)
.flat_map(char::from_u32), .flat_map(std::char::from_u32),
), ),
Sequence::Punct => Box::new( Sequence::Punct => Box::new(
(33..=47) (33..=47)
.chain(58..=64) .chain(58..=64)
.chain(91..=96) .chain(91..=96)
.chain(123..=126) .chain(123..=126)
.flat_map(char::from_u32), .flat_map(std::char::from_u32),
), ),
Sequence::Space => Box::new(unicode_table::SPACES.iter().cloned()), Sequence::Space => Box::new(unicode_table::SPACES.iter().cloned()),
Sequence::Upper => Box::new('A'..='Z'), Sequence::Upper => Box::new('A'..='Z'),
@ -410,7 +410,11 @@ impl DeleteOperation {
impl SymbolTranslator for DeleteOperation { impl SymbolTranslator for DeleteOperation {
fn translate(&mut self, current: char) -> Option<char> { fn translate(&mut self, current: char) -> Option<char> {
let found = self.set.iter().any(|sequence| sequence.eq(&current)); let found = self.set.iter().any(|sequence| sequence.eq(&current));
(self.complement_flag == found).then(|| current) if self.complement_flag == found {
Some(current)
} else {
None
}
} }
} }
@ -466,7 +470,7 @@ pub enum TranslateOperation {
impl TranslateOperation { impl TranslateOperation {
fn next_complement_char(iter: u32, ignore_list: &[char]) -> (u32, char) { fn next_complement_char(iter: u32, ignore_list: &[char]) -> (u32, char) {
(iter..) (iter..)
.filter_map(char::from_u32) .filter_map(std::char::from_u32)
.filter(|c| !ignore_list.iter().any(|s| s.eq(c))) .filter(|c| !ignore_list.iter().any(|s| s.eq(c)))
.map(|c| (u32::from(c) + 1, c)) .map(|c| (u32::from(c) + 1, c))
.next() .next()
@ -498,7 +502,7 @@ impl SymbolTranslator for TranslateOperation {
TranslateOperation::Standard(TranslateOperationStandard { translation_map }) => Some( TranslateOperation::Standard(TranslateOperationStandard { translation_map }) => Some(
translation_map translation_map
.iter() .iter()
.find_map(|(l, r)| l.eq(&current).then(|| *r)) .find_map(|(l, r)| if l.eq(&current) { Some(*r) } else { None })
.unwrap_or(current), .unwrap_or(current),
), ),
TranslateOperation::Complement(TranslateOperationComplement { TranslateOperation::Complement(TranslateOperationComplement {

View file

@ -1,3 +1,4 @@
// spell-checker:ignore aabbaa aabbcc aabc abbb abcc abcdefabcdef abcdefghijk abcdefghijklmn abcdefghijklmnop ABCDEFGHIJKLMNOPQRS abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFZZ abcxyz ABCXYZ abcxyzabcxyz ABCXYZABCXYZ acbdef alnum amzamz AMZXAMZ bbbd cclass cefgm cntrl compl dabcdef dncase Gzabcdefg PQRST upcase wxyzz xdigit xycde xyyye xyyz xyzzzzxyzzzz ZABCDEF Zamz
use crate::common::util::*; use crate::common::util::*;
#[test] #[test]