@@ -983,7 +983,7 @@ impl str {
983983    #[ cfg_attr( not( test) ,  rustc_diagnostic_item = "str_split_whitespace" ) ]  
984984    #[ inline]  
985985    pub  fn  split_whitespace ( & self )  -> SplitWhitespace < ' _ >  { 
986-         SplitWhitespace  {  inner :  self . split ( IsWhitespace ) . filter ( IsNotEmpty )  } 
986+         SplitWhitespace  {  inner :  self . split ( char :: is_whitespace ) . filter ( |s| !s . is_empty ( ) )  } 
987987    } 
988988
989989    /// Splits a string slice by ASCII whitespace. 
@@ -1032,8 +1032,13 @@ impl str {
10321032    #[ stable( feature = "split_ascii_whitespace" ,  since = "1.34.0" ) ]  
10331033    #[ inline]  
10341034    pub  fn  split_ascii_whitespace ( & self )  -> SplitAsciiWhitespace < ' _ >  { 
1035-         let  inner =
1036-             self . as_bytes ( ) . split ( IsAsciiWhitespace ) . filter ( BytesIsNotEmpty ) . map ( UnsafeBytesToStr ) ; 
1035+         let  inner = self 
1036+             . as_bytes ( ) 
1037+             . split ( u8:: is_ascii_whitespace) 
1038+             . filter ( |s| !s. is_empty ( ) ) 
1039+             // SAFETY: the byte slice came from a string and was only split 
1040+             // along character boundaries, so the resulting slices are strings. 
1041+             . map ( |bytes| unsafe  {  from_utf8_unchecked ( bytes)  } ) ; 
10371042        SplitAsciiWhitespace  {  inner } 
10381043    } 
10391044
@@ -1085,7 +1090,11 @@ impl str {
10851090     #[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
10861091    #[ inline]  
10871092    pub  fn  lines ( & self )  -> Lines < ' _ >  { 
1088-         Lines ( self . split_inclusive ( '\n' ) . map ( LinesMap ) ) 
1093+         Lines ( self . split_inclusive ( '\n' ) . map ( |line| { 
1094+             let  Some ( line)  = line. strip_suffix ( '\n' )  else  {  return  line } ; 
1095+             let  Some ( line)  = line. strip_suffix ( '\r' )  else  {  return  line } ; 
1096+             line
1097+         } ) ) 
10891098    } 
10901099
10911100    /// An iterator over the lines of a string. 
@@ -2636,14 +2645,19 @@ impl str {
26362645    #[ stable( feature = "str_escape" ,  since = "1.34.0" ) ]  
26372646    pub  fn  escape_debug ( & self )  -> EscapeDebug < ' _ >  { 
26382647        let  mut  chars = self . chars ( ) ; 
2639-         EscapeDebug  { 
2640-             inner :  chars
2641-                 . next ( ) 
2642-                 . map ( |first| first. escape_debug_ext ( EscapeDebugExtArgs :: ESCAPE_ALL ) ) 
2643-                 . into_iter ( ) 
2644-                 . flatten ( ) 
2645-                 . chain ( chars. flat_map ( CharEscapeDebugContinue ) ) , 
2646-         } 
2648+         let  first = chars
2649+             . next ( ) 
2650+             . map ( |first| first. escape_debug_ext ( EscapeDebugExtArgs :: ESCAPE_ALL ) ) 
2651+             . into_iter ( ) 
2652+             . flatten ( ) ; 
2653+         let  inner = first. chain ( chars. flat_map ( |c| { 
2654+             c. escape_debug_ext ( EscapeDebugExtArgs  { 
2655+                 escape_grapheme_extended :  false , 
2656+                 escape_single_quote :  true , 
2657+                 escape_double_quote :  true , 
2658+             } ) 
2659+         } ) ) ; 
2660+         EscapeDebug  {  inner } 
26472661    } 
26482662
26492663    /// Return an iterator that escapes each char in `self` with [`char::escape_default`]. 
@@ -2681,7 +2695,7 @@ impl str {
26812695                   without modifying the original"] 
26822696    #[ stable( feature = "str_escape" ,  since = "1.34.0" ) ]  
26832697    pub  fn  escape_default ( & self )  -> EscapeDefault < ' _ >  { 
2684-         EscapeDefault  {  inner :  self . chars ( ) . flat_map ( CharEscapeDefault )  } 
2698+         EscapeDefault  {  inner :  self . chars ( ) . flat_map ( char :: escape_default )  } 
26852699    } 
26862700
26872701    /// Return an iterator that escapes each char in `self` with [`char::escape_unicode`]. 
@@ -2719,7 +2733,7 @@ impl str {
27192733                   without modifying the original"] 
27202734    #[ stable( feature = "str_escape" ,  since = "1.34.0" ) ]  
27212735    pub  fn  escape_unicode ( & self )  -> EscapeUnicode < ' _ >  { 
2722-         EscapeUnicode  {  inner :  self . chars ( ) . flat_map ( CharEscapeUnicode )  } 
2736+         EscapeUnicode  {  inner :  self . chars ( ) . flat_map ( char :: escape_unicode )  } 
27232737    } 
27242738} 
27252739
@@ -2750,59 +2764,15 @@ impl Default for &mut str {
27502764    } 
27512765} 
27522766
2753- impl_fn_for_zst !  { 
2754-     /// A nameable, cloneable fn type 
2755-      #[ derive( Clone ) ] 
2756-     struct  LinesMap  impl <' a> Fn  = |line:  & ' a str | -> & ' a str  { 
2757-         let  Some ( line)  = line. strip_suffix( '\n' )  else {  return  line } ; 
2758-         let  Some ( line)  = line. strip_suffix( '\r' )  else {  return  line } ; 
2759-         line
2760-     } ; 
2761- 
2762-     #[ derive( Clone ) ] 
2763-     struct  CharEscapeDebugContinue  impl  Fn  = |c:  char | -> char :: EscapeDebug  { 
2764-         c. escape_debug_ext( EscapeDebugExtArgs  { 
2765-             escape_grapheme_extended:  false , 
2766-             escape_single_quote:  true , 
2767-             escape_double_quote:  true 
2768-         } ) 
2769-     } ; 
2770- 
2771-     #[ derive( Clone ) ] 
2772-     struct  CharEscapeUnicode  impl  Fn  = |c:  char | -> char :: EscapeUnicode  { 
2773-         c. escape_unicode( ) 
2774-     } ; 
2775-     #[ derive( Clone ) ] 
2776-     struct  CharEscapeDefault  impl  Fn  = |c:  char | -> char :: EscapeDefault  { 
2777-         c. escape_default( ) 
2778-     } ; 
2779- 
2780-     #[ derive( Clone ) ] 
2781-     struct  IsWhitespace  impl  Fn  = |c:  char | -> bool  { 
2782-         c. is_whitespace( ) 
2783-     } ; 
2784- 
2785-     #[ derive( Clone ) ] 
2786-     struct  IsAsciiWhitespace  impl  Fn  = |byte:  & u8 | -> bool  { 
2787-         byte. is_ascii_whitespace( ) 
2788-     } ; 
2789- 
2790-     #[ derive( Clone ) ] 
2791-     struct  IsNotEmpty  impl <' a,  ' b> Fn  = |s:  & ' a & ' b str | -> bool  { 
2792-         !s. is_empty( ) 
2793-     } ; 
2794- 
2795-     #[ derive( Clone ) ] 
2796-     struct  BytesIsNotEmpty  impl <' a,  ' b> Fn  = |s:  & ' a & ' b [ u8 ] | -> bool  { 
2797-         !s. is_empty( ) 
2798-     } ; 
2799- 
2800-     #[ derive( Clone ) ] 
2801-     struct  UnsafeBytesToStr  impl <' a> Fn  = |bytes:  & ' a [ u8 ] | -> & ' a str  { 
2802-         // SAFETY: not safe 
2803-         unsafe  {  from_utf8_unchecked( bytes)  } 
2804-     } ; 
2805- } 
2767+ type  LinesMap  = impl  ( Fn ( & str )  -> & str )  + Copy ; 
2768+ type  CharEscapeDebugContinue  = impl  ( FnMut ( char )  -> char:: EscapeDebug )  + Copy ; 
2769+ type  CharEscapeUnicode  = impl  ( Fn ( char )  -> char:: EscapeUnicode )  + Copy ; 
2770+ type  CharEscapeDefault  = impl  ( Fn ( char )  -> char:: EscapeDefault )  + Copy ; 
2771+ type  IsWhitespace  = impl  ( Fn ( char )  -> bool )  + Copy ; 
2772+ type  IsAsciiWhitespace  = impl  ( Fn ( & u8 )  -> bool )  + Copy ; 
2773+ type  IsNotEmpty  = impl  ( Fn ( & & str )  -> bool )  + Copy ; 
2774+ type  BytesIsNotEmpty < ' a >  = impl  ( FnMut ( & & ' a  [ u8 ] )  -> bool )  + Copy ; 
2775+ type  UnsafeBytesToStr < ' a >  = impl  ( FnMut ( & ' a  [ u8 ] )  -> & ' a  str )  + Copy ; 
28062776
28072777// This is required to make `impl From<&str> for Box<dyn Error>` and `impl<E> From<E> for Box<dyn Error>` not overlap. 
28082778#[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
0 commit comments