/*** čĊ Ġ* ĠUtilities Ġfunctions Ġfor Ġsorting , Ġgrouping čĊ Ġ*/ č Ċ object ĠUtils Ġ{ čĊčĊĠĠĠ Ġ/** * čĊĠĠĠĠ Ġ* Ġreturn Ġunix Ġstyle Ġpath Ġfor Ġ[ struct ] Ġinput čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġpath ( struct : ĠStruct ): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġcurrent : ĠStruct ? Ġ= Ġstruct čĊĠĠĠĠĠĠĠ Ġval Ġpath Builder : ĠStringBuilder Ġ= ĠStringBuilder ("/ " Ġ+ Ġcurrent ?. name ) čĊĠĠĠĠĠĠĠ Ġwhile Ġ( current ?. parent Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . parent čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Builder . insert ( 0 , Ġ"/" Ġ+ Ġcurrent ?. name ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġpath Builder . toString () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠFunction Ġto Ġsort Ġfolder Ġstructure Ġin Ġplace čĊĠĠĠĠ Ġ* Ġ@ param Ġstruct Ġ- Ġroot Ġfolder Ġto Ġstart Ġsorting čĊĠĠĠĠ Ġ* Ġ@ param Ġselector Ġ- Ġspecify Ġthe Ġproperty Ġto Ġsort Ġ@ see Ġ[ Mutable List . sortBy ] čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġ< R Ġ: ĠComparable < R >> Ġsort Recursive ( struct : ĠP Folder , Ġselector : Ġ( Struct ) Ġ-> ĠR ?) Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġsort ( struct , Ġselector ) čĊčĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġstruct . sub Struct s ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġis ĠP Folder ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsort Recursive ( i , Ġselector ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġsort Ġsingle Ġfolder Ġin Ġplace čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġinline Ġfun Ġ< R Ġ: ĠComparable < R >> Ġsort ( struct : ĠP Folder , Ġcross inline Ġselector : Ġ( Struct ) Ġ-> ĠR ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġstruct . sub Struct s . sortBy Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġselector ( it ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġlinear ize Ġand Ġgroup Ġevery Ġfiles Ġunder Ġcurrent Ġstruct . čĊĠĠĠĠ Ġ* Ġ@ return Ġgrouped Ġfolder čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġgroup ( struct : ĠP Folder ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġfiles : ĠArrayList < P File > Ġ= Ġlinear ize ( struct ) čĊĠĠĠĠĠĠĠ Ġfiles . sortBy Ġ{ Ġit . type Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġgrouped Ġ= ĠP Folder (" Groups ") čĊčĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġfiles . map Ġ{ Ġit . type Ġ}. toSet () čĊčĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġtype ) Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Content Ġ= Ġfiles . filter Ġ{ Ġit . type Ġ== Ġi Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Folder Ġ= ĠP Folder ( i ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Folder . add (* group Content . to Typed Array ()) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrouped . add ( group Folder ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġstruct . removeAll () čĊĠĠĠĠĠĠĠ Ġstruct . add ( grouped ) čĊčĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* Ġlinear ize Ġremove Ġall Ġsub Ġfolders Ġand Ġreturn Ġevery Ġfiles Ġas Ġarray čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġlinear ize ( struct : ĠStruct ): ĠArrayList < P File > Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġstructs Ġ= Ġarray ListOf < P File >() čĊĠĠĠĠĠĠĠ ĠgetAll Files ( struct , Ġstructs ) čĊĠĠĠĠĠĠĠ Ġreturn Ġstructs čĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġprivate Ġfun ĠgetAll Files ( struct : ĠStruct , Ġout : ĠArrayList < in ĠP File >) Ġ{ čĊĠĠĠĠĠĠĠ Ġwhen Ġ( struct ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠP Folder Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġstruct . sub Struct s ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetAll Files ( i , Ġout ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠP File Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . add ( struct ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ }