@@ -67,6 +67,7 @@ use crate::{
67
67
68
68
use crate :: job:: { self , Jobs } ;
69
69
use std:: {
70
+ char:: { ToLowercase , ToUppercase } ,
70
71
cmp:: Ordering ,
71
72
collections:: { HashMap , HashSet } ,
72
73
error:: Error ,
@@ -1727,17 +1728,48 @@ where
1727
1728
exit_select_mode ( cx) ;
1728
1729
}
1729
1730
1731
+ enum CaseSwitcher {
1732
+ Upper ( ToUppercase ) ,
1733
+ Lower ( ToLowercase ) ,
1734
+ Keep ( Option < char > ) ,
1735
+ }
1736
+
1737
+ impl Iterator for CaseSwitcher {
1738
+ type Item = char ;
1739
+
1740
+ fn next ( & mut self ) -> Option < Self :: Item > {
1741
+ match self {
1742
+ CaseSwitcher :: Upper ( upper) => upper. next ( ) ,
1743
+ CaseSwitcher :: Lower ( lower) => lower. next ( ) ,
1744
+ CaseSwitcher :: Keep ( ch) => ch. take ( ) ,
1745
+ }
1746
+ }
1747
+
1748
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1749
+ match self {
1750
+ CaseSwitcher :: Upper ( upper) => upper. size_hint ( ) ,
1751
+ CaseSwitcher :: Lower ( lower) => lower. size_hint ( ) ,
1752
+ CaseSwitcher :: Keep ( ch) => {
1753
+ let n = if ch. is_some ( ) { 1 } else { 0 } ;
1754
+ ( n, Some ( n) )
1755
+ }
1756
+ }
1757
+ }
1758
+ }
1759
+
1760
+ impl ExactSizeIterator for CaseSwitcher { }
1761
+
1730
1762
fn switch_case ( cx : & mut Context ) {
1731
1763
switch_case_impl ( cx, |string| {
1732
1764
string
1733
1765
. chars ( )
1734
1766
. flat_map ( |ch| {
1735
1767
if ch. is_lowercase ( ) {
1736
- ch. to_uppercase ( ) . collect ( )
1768
+ CaseSwitcher :: Upper ( ch. to_uppercase ( ) )
1737
1769
} else if ch. is_uppercase ( ) {
1738
- ch. to_lowercase ( ) . collect ( )
1770
+ CaseSwitcher :: Lower ( ch. to_lowercase ( ) )
1739
1771
} else {
1740
- vec ! [ ch ]
1772
+ CaseSwitcher :: Keep ( Some ( ch ) )
1741
1773
}
1742
1774
} )
1743
1775
. collect ( )
0 commit comments