package Ġeu . qi ou . aaf 4 k . report ings . base Ċ Ċ /** Ċ Ġ* Ġ Ġtyped Ġinterface ĠDr ill down able Ċ Ġ* Ċ Ġ* Ġ Ġ@ property ĠP Ġ: Ġ Ġthe Ġcontainer Ġclass , Ġlike Ġcollection Ġaccount , ĠP Ġis Ġthe Ġclass Ġwhich Ġimplements Ġthe Ġinterface Ċ Ġ* Ġ Ġ@ property ĠC : ĠĠĠ Ġthe Ġbase Ġclass Ġproto Ġaccount Ċ Ġ*/ Ċ interface ĠDr ill down able < P , ĠC > Ġ: ĠIterable < C > Ġwhere ĠP Ġ: ĠC , ĠC Ġ: ĠIdent ifiable Ġ{ ĊĊĠĠĠ Ġfun Ġget Children (): ĠCollection < C > ĊĊĠĠĠ Ġfun Ġget Parents (): ĠCollection < P >? ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġget Top Most Parent (): ĠP Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġget Parents () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( p Ġ== Ġnull Ġ|| Ġp . isEmpty ()) Ġthis Ġas ĠP Ġelse Ġ( p . first () Ġas ĠDr ill down able < *, Ġ*> ). get Top Most Parent () Ġas ĠP ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < C > Ġ= Ġsorted List (). iterator () ĊĊĠĠĠ Ġ// get Ġthe Ġsort list Ġof Ġthe Ġtop Ġmost Ġparent ĊĠĠĠ Ġ// Ġin Ġcase Ġof Ġupdate , Ġjust Ġbefore Ġthe Ġbinary search Ġupdate Ġthe Ġsort list Ġof Ġthe Ġparent ĊĊĠĠĠ Ġvar Ġto Update : ĠBoolean ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġadd ( child : ĠC , Ġindex : ĠInt ? Ġ= Ġnull , Ġpercentage : ĠDouble Ġ= Ġ 1 . 0 ): ĠP Ġ{ ĊĠĠĠĠĠĠĠ Ġto Update Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġas ĠP ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġremove ( child : ĠC ): ĠP Ġ{ ĊĠĠĠĠĠĠĠ Ġto Update Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġas ĠP ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcache List : ĠList < C > ĊĠĠĠ Ġvar Ġcache All List : ĠList < C > ĊĊĠĠĠ Ġfun Ġsorted List (): ĠList < C > Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate List () ĊĠĠĠĠĠĠĠ Ġreturn Ġcache List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsorted All List (): ĠList < C > Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate List () ĊĠĠĠĠĠĠĠ Ġreturn Ġcache All List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġupdate List () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( to Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache List Ġ= Ġflatten () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache All List Ġ= Ġflatten All () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Update Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġall Parents ( contains Self : ĠBoolean Ġ= Ġfalse ): ĠSet < P > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Parent ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Parents () !!. fold ( set Of < P >()) Ġ{ Ġacc , Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc Ġ+ Ġ( p Ġas ĠDr ill down able < P , ĠC >). all Parents ( contains Self Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ+ Ġif Ġ( contains Self ) Ġset Of ( this Ġas ĠP ) Ġelse Ġset Of () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġset Of ( this Ġas ĠP ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġsearch ( id : ĠLong ): ĠC ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbinary Search ( id , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġbinary Search ( id : ĠLong , Ġinclude Self : ĠBoolean Ġ= Ġfalse ): ĠC ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġif Ġ( include Self ) Ġsorted All List () Ġelse Ġsorted List () ĊĊĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġ( l . binary Search Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . id Ġ== Ġid Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . id Ġ< Ġid Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( tmp Ġ< Ġ 0 ) Ġnull Ġelse Ġl [ tmp ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġadd All ( children : ĠCollection < C >, Ġindex : ĠInt ? Ġ= Ġnull ): ĠP Ġ{ ĊĠĠĠĠĠĠĠ Ġchildren . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( it , Ġindex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġas ĠP ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Equal ( one : ĠC , Ġother : ĠC ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġone . id Ġ== Ġother . id ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġfind Ġthe Ġdirect Ġparents ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġfind Parents Re cursively ( child : ĠC , Ġres : ĠMutable Set < P > Ġ= Ġmutable Set Of ()): ĠMutable Set < P > Ġ{ ĊĠĠĠĠĠĠĠ Ġget Children (). fold ( res ) Ġ{ Ġb , Ġa Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isEqual ( child , Ġa )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . add ( this Ġas ĠP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a Ġis ĠDr ill down able < *, Ġ* >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( a Ġas ĠDr ill down able < P , ĠC >). find Parents Re cursively ( child , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġremove Re cursively ( child : ĠC ): ĠP Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . find Parents Re cursively ( child ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ĠDr ill down able < P , ĠC >). remove ( child ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġas ĠP ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Parent (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparents Ġ= Ġget Parents () ĊĠĠĠĠĠĠĠ Ġreturn Ġparents Ġ!= Ġnull Ġ&& Ġparents . count () Ġ> Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Children (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġget Children () ĊĠĠĠĠĠĠĠ Ġreturn Ġchildren . count () Ġ> Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġcollection Ġof Ġthe Ġatomic Ġaccounts ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġflatten (): ĠList < C > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres : ĠMutable List < C > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has Children ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Children (). forEach Ġ{ Ġa Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a Ġis ĠDr ill down able < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . addAll (( a Ġas ĠDr ill down able < P , ĠC >). flatten ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . add ( a ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġres . sorted By Ġ{ Ġit . id Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġflatten All (): ĠList < C > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres : ĠMutable List < C > Ġ= Ġmutable ListOf ( this Ġas ĠC ) ĊĊĠĠĠĠĠĠĠ Ġget Children (). forEach Ġ{ Ġa Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres . addAll ( if Ġ( a Ġis ĠDr ill down able < *, Ġ* >) Ġ( a Ġas ĠDr ill down able < P , ĠC >). flatten All () Ġelse ĠlistOf ( a )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġres . sorted By Ġ{ Ġit . id Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcount Re cursively ( include Self : ĠBoolean Ġ= Ġfalse ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinit Ġ= Ġif Ġ( include Self ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( has Children ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . getChildren (). fold ( init ) Ġ{ Ġa , Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ+ Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDr ill down able < *, Ġ*> Ġ-> Ġe . count Re cursively ( include Self ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġinit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġlevels (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlevels ( this Ġas ĠC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġlevels ( ele : ĠC ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( ele ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDr ill down able < *, Ġ*> Ġ-> Ġ( ele Ġas ĠDr ill down able < P , ĠC >). getChildren (). map Ġ{ Ġlevels ( it ) Ġ}. max By Ġ{ Ġit Ġ} Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcount (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Children ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Children (). count () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġcontains ( child : ĠC ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Children ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Parents Re cursively ( child ). count () Ġ> Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus Assign ( child : ĠC ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . add ( child ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( child : ĠC ) Ġ= Ġthis . add ( child ) ĊĠĠĠ Ġoperator Ġfun Ġplus ( child : ĠCollection < C >) Ġ= Ġthis . addAll ( child ) ĊĊĠĠĠ Ġoperator Ġfun Ġminus Assign ( child : ĠC ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . remove ( child ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġminus ( child : ĠC ) Ġ= Ġthis . remove ( child ) Ċ }