@@ -83,6 +83,8 @@ pub trait SliceExt {
8383 fn first < ' a > ( & ' a self ) -> Option < & ' a Self :: Item > ;
8484 fn tail < ' a > ( & ' a self ) -> & ' a [ Self :: Item ] ;
8585 fn init < ' a > ( & ' a self ) -> & ' a [ Self :: Item ] ;
86+ fn split_first < ' a > ( & ' a self ) -> Option < ( & ' a Self :: Item , & ' a [ Self :: Item ] ) > ;
87+ fn split_last < ' a > ( & ' a self ) -> Option < ( & ' a Self :: Item , & ' a [ Self :: Item ] ) > ;
8688 fn last < ' a > ( & ' a self ) -> Option < & ' a Self :: Item > ;
8789 unsafe fn get_unchecked < ' a > ( & ' a self , index : usize ) -> & ' a Self :: Item ;
8890 fn as_ptr ( & self ) -> * const Self :: Item ;
@@ -95,6 +97,8 @@ pub trait SliceExt {
9597 fn first_mut < ' a > ( & ' a mut self ) -> Option < & ' a mut Self :: Item > ;
9698 fn tail_mut < ' a > ( & ' a mut self ) -> & ' a mut [ Self :: Item ] ;
9799 fn init_mut < ' a > ( & ' a mut self ) -> & ' a mut [ Self :: Item ] ;
100+ fn split_first_mut < ' a > ( & ' a mut self ) -> Option < ( & ' a mut Self :: Item , & ' a mut [ Self :: Item ] ) > ;
101+ fn split_last_mut < ' a > ( & ' a mut self ) -> Option < ( & ' a mut Self :: Item , & ' a mut [ Self :: Item ] ) > ;
98102 fn last_mut < ' a > ( & ' a mut self ) -> Option < & ' a mut Self :: Item > ;
99103 fn split_mut < ' a , P > ( & ' a mut self , pred : P ) -> SplitMut < ' a , Self :: Item , P >
100104 where P : FnMut ( & Self :: Item ) -> bool ;
@@ -238,8 +242,17 @@ impl<T> SliceExt for [T] {
238242 fn tail ( & self ) -> & [ T ] { & self [ 1 ..] }
239243
240244 #[ inline]
241- fn init ( & self ) -> & [ T ] {
242- & self [ ..self . len ( ) - 1 ]
245+ fn split_first ( & self ) -> Option < ( & T , & [ T ] ) > {
246+ if self . is_empty ( ) { None } else { Some ( ( & self [ 0 ] , & self [ 1 ..] ) ) }
247+ }
248+
249+ #[ inline]
250+ fn init ( & self ) -> & [ T ] { & self [ ..self . len ( ) - 1 ] }
251+
252+ #[ inline]
253+ fn split_last ( & self ) -> Option < ( & T , & [ T ] ) > {
254+ let len = self . len ( ) ;
255+ if len == 0 { None } else { Some ( ( & self [ len - 1 ] , & self [ ..( len - 1 ) ] ) ) }
243256 }
244257
245258 #[ inline]
@@ -328,8 +341,14 @@ impl<T> SliceExt for [T] {
328341 }
329342
330343 #[ inline]
331- fn tail_mut ( & mut self ) -> & mut [ T ] {
332- & mut self [ 1 ..]
344+ fn tail_mut ( & mut self ) -> & mut [ T ] { & mut self [ 1 ..] }
345+
346+ #[ inline]
347+ fn split_first_mut ( & mut self ) -> Option < ( & mut T , & mut [ T ] ) > {
348+ if self . is_empty ( ) { None } else {
349+ let split = self . split_at_mut ( 1 ) ;
350+ Some ( ( & mut split. 0 [ 0 ] , split. 1 ) )
351+ }
333352 }
334353
335354 #[ inline]
@@ -338,6 +357,15 @@ impl<T> SliceExt for [T] {
338357 & mut self [ .. ( len - 1 ) ]
339358 }
340359
360+ #[ inline]
361+ fn split_last_mut ( & mut self ) -> Option < ( & mut T , & mut [ T ] ) > {
362+ let len = self . len ( ) ;
363+ if len == 0 { None } else {
364+ let split = self . split_at_mut ( len - 1 ) ;
365+ Some ( ( & mut split. 1 [ 0 ] , split. 0 ) )
366+ }
367+ }
368+
341369 #[ inline]
342370 fn split_mut < ' a , P > ( & ' a mut self , pred : P ) -> SplitMut < ' a , T , P > where P : FnMut ( & T ) -> bool {
343371 SplitMut { v : self , pred : pred, finished : false }
0 commit comments