package Ġcom . code bor ne . se len ide . impl Ċ Ċ import Ġok io . Experimental FileSystem Ċ import Ġok io . FileSystem Ċ import Ġok io . IOException Ċ import Ġok io . Path Ċ import Ġok io . Path . Companion . to Path Ċ import Ġok io . Source Ċ import Ġorg . l ighthouse games . logging . logging Ċ import Ġsupport . Platform Ċ import Ġkotlin . jvm . Jvm Static Ċ Ċ object ĠFile Helper Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= Ġlogging ( File Helper :: class . simple Name ) ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġfun Ġpath Of ( var arg Ġitem : ĠString ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġitem . first OrNull ()?. to Path () Ġ?: Ġthrow ĠIOException (" Can 't Ġconvert Ġempty Ġpath ") ĊĠĠĠĠĠĠĠ Ġreturn Ġitem . drop ( 1 ). fold ( first ) Ġ{ Ġacc , Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġacc Ġ/ Ġs ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġprivate Ġval Ġfile System : ĠFileSystem Ġ= ĠPlatform . provide FileSystem () ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġfun Ġwrite ToFile ( source : ĠByteArray , Ġtarget File : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Parent Folder Exists ( target File ) Ġ// ĠTODO : Ġwasn 't Ġpresent Ġin ĠJava Ġversion ĊĠĠĠĠĠĠĠ Ġfile System . write ( target File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( source ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġfun Ġcopy File ( source File : ĠPath , Ġtarget File : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile System . copy ( source File , Ġtarget File ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġfun Ġcopy File (` in `: ĠSource , Ġtarget File : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Parent Folder Exists ( target File ) ĊĠĠĠĠĠĠĠ Ġfile System . write ( target File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite All (` in `) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġfun Ġensure Parent Folder Exists ( target File : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtarget File . parent ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Folder Exists ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġensure Folder Exists ( folder : ĠPath ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! exists ( folder )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Creating Ġfolder : Ġ$ folder " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile System . create Directories ( folder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Failed Ġto Ġcreate Ġfolder Ġ'$ folder '", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfolder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġfun Ġmove File ( src File : ĠPath , Ġdest File : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile System . copy ( src File , Ġdest File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile System . delete ( src File ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġmove Ġfile Ġ$ src File Ġto Ġ$ dest File ", Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġdelete Folder If Empty ( folder : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file System . metadata OrNull ( folder )?. isDirectory Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġfile System . list ( folder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( files . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile System . delete ( folder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġfun Ġexists ( path : ĠPath ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile System . exists ( path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġfun Ġis File ( path : ĠPath ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile System . metadata OrNull ( path )?. is Regular File Ġ== Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġfun Ġlast Modified ( file : ĠPath ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile System . metadata OrNull ( file )?. lastModified At Millis Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġfun Ġlist Files ( folder : ĠPath ): ĠList < Path > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile System . list ( folder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġcanonical Path ( path : ĠPath ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile System . canonical ize ( path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġfun Ġrel ativ ize ( relative To : ĠPath , Ġother : ĠPath ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfixed Segments Ġ= Ġcanonical Path ( relative To ). segments () ĊĠĠĠĠĠĠĠ Ġval Ġother Segments Ġ= Ġcanonical Path ( other ). segments () ĊĊĠĠĠĠĠĠĠ Ġval Ġcommon Prefix Length Ġ= Ġfixed Segments . zip ( other Segments ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take While Ġ{ Ġ( a , Ġb ) Ġ-> Ġa Ġ== Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. count () ĊĊĠĠĠĠĠĠĠ Ġval Ġcommon Prefix Ġ= Ġfixed Segments . take ( common Prefix Length ) ĊĠĠĠĠĠĠĠ Ġval Ġgo Parent Steps Ġ= ĠList ( fixed Segments . size Ġ- Ġcommon Prefix Length ) Ġ{ Ġ".. " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Segments Ġ= Ġother Segments . drop ( common Prefix Length ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Segments Ġ= Ġcommon Prefix Ġ+ Ġgo Parent Steps Ġ+ Ġnew Segments ĊĠĠĠĠĠĠĠ Ġreturn Ġpath Of (* result Segments . to Typed Array ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Experimental FileSystem Ċ private Ġfun ĠPath . segments (): ĠList < String > Ġ{ ĊĠĠĠ Ġval Ġsegments Ġ= Ġmutable ListOf ( this . name ) ĊĊĠĠĠ Ġvar Ġparent Ġ= Ġthis . parent ĊĠĠĠ Ġwhile Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsegments Ġ+= Ġparent . name ĊĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent . parent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġsegments . reversed () Ċ } Ċ