@@ -15,6 +15,7 @@ use pretty_assertions::assert_eq;
1515use rand:: { distr:: Alphanumeric , rng, Rng } ;
1616use rayon:: prelude:: * ;
1717use std:: {
18+ cmp:: Ordering ,
1819 env:: temp_dir,
1920 fs:: { create_dir, metadata, remove_dir_all, symlink_metadata} ,
2021 io:: Error ,
@@ -261,10 +262,10 @@ where
261262 let DataTreeReflection {
262263 name,
263264 size,
264- mut children,
265+ children,
265266 } = tree_reflection;
266- children. sort_by ( |left, right| left. name . cmp ( & right. name ) ) ;
267267 let children = children
268+ . into_sorted_by ( |left, right| left. name . cmp ( & right. name ) )
268269 . into_par_iter ( )
269270 . map ( sanitize_tree_reflection)
270271 . collect ( ) ;
@@ -489,3 +490,37 @@ pub fn read_apparent_size(path: &Path) -> u64 {
489490 . unwrap_or_else ( |error| panic ! ( "Can't read metadata at {path:?}: {error}" ) )
490491 . len ( )
491492}
493+
494+ /// Utility methods to sort various types of arrays.
495+ pub trait IntoSorted < Item > : Sized {
496+ /// Sort an array by [`Ord`] and return it.
497+ fn into_sorted ( self ) -> Self
498+ where
499+ Item : Ord ;
500+
501+ /// Sort an array by a function and return it.
502+ fn into_sorted_by < Order > ( self , order : Order ) -> Self
503+ where
504+ Order : FnMut ( & Item , & Item ) -> Ordering ;
505+ }
506+
507+ impl < Item , Array > IntoSorted < Item > for Array
508+ where
509+ Array : AsMut < [ Item ] > + Sized ,
510+ {
511+ fn into_sorted ( mut self ) -> Self
512+ where
513+ Item : Ord ,
514+ {
515+ self . as_mut ( ) . sort ( ) ;
516+ self
517+ }
518+
519+ fn into_sorted_by < Order > ( mut self , order : Order ) -> Self
520+ where
521+ Order : FnMut ( & Item , & Item ) -> Ordering ,
522+ {
523+ self . as_mut ( ) . sort_by ( order) ;
524+ self
525+ }
526+ }
0 commit comments