/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . util . collection Utils Ċ Ċ import Ġorg . jetbrains . kotlin . descriptors . Classifier Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Classifier Descriptor WithType Parameters Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . Member Scope Ċ import Ġorg . jetbrains . kotlin . utils . Smart List Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠConcat en ates Ġthe Ġcontents Ġof Ġthis Ġcollection Ġwith Ġthe Ġgiven Ġcollection , Ġavoid ing Ġallocations Ġif Ġpossible . Ċ Ġ* ĠCan Ġmodify Ġ` this ` Ġif Ġit Ġis Ġa Ġmutable Ġcollection . Ċ Ġ*/ Ċ fun Ġ< T > ĠCollection < T > ?. concat ( collection : ĠCollection < T >): ĠCollection < T >? Ġ{ ĊĠĠĠ Ġif Ġ( collection . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcollection ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( this Ġis ĠLinked HashSet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd All ( collection ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġresult Ġ= ĠLinked HashSet ( this ) ĊĠĠĠ Ġresult . addAll ( collection ) ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ inline Ġfun Ġ< Scope , ĠT > Ġget From All Scopes ( scopes : ĠArray < Scope >, Ġcallback : Ġ( Scope ) Ġ-> ĠCollection < T >): ĠCollection < T > Ġ= ĊĠĠĠ Ġwhen Ġ( scopes . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 0 Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠĠ 1 Ġ-> Ġcallback ( scopes [ 0 ]) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult : ĠCollection < T >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( scope Ġin Ġscopes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult . concat ( callback ( scope )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ?: Ġempty Set () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ inline Ġfun Ġ< Scope , ĠT > Ġget From All Scopes ( first Scope : ĠScope , Ġrest Scopes : ĠArray < Scope >, Ġcallback : Ġ( Scope ) Ġ-> ĠCollection < T >): ĠCollection < T > Ġ{ ĊĠĠĠ Ġvar Ġresult : ĠCollection < T >? Ġ= Ġcallback ( first Scope ) ĊĠĠĠ Ġfor Ġ( scope Ġin Ġrest Scopes ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult . concat ( callback ( scope )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ġ?: Ġempty Set () Ċ } Ċ Ċ inline Ġfun Ġ< Scope , ĠR > Ġflat Map Scopes ( scope 1 : ĠScope ?, Ġscope 2 : ĠScope ?, Ġtransform : Ġ( Scope ) Ġ-> ĠCollection < R >): ĠCollection < R > Ġ{ ĊĠĠĠ Ġval Ġresults 1 Ġ= Ġif Ġ( scope 1 Ġ!= Ġnull ) Ġtransform ( scope 1 ) Ġelse Ġempty List () ĊĠĠĠ Ġif Ġ( scope 2 Ġ== Ġnull ) Ġreturn Ġresults 1 ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresults 2 Ġ= Ġtransform ( scope 2 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( results 1 . isEmpty ()) Ġreturn Ġresults 2 ĊĠĠĠĠĠĠĠ Ġelse Ġreturn Ġresults 1 . to Mutable List (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . addAll ( results 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< Scope > ĠforEach Scope ( scope 1 : ĠScope ?, Ġscope 2 : ĠScope ?, Ġaction : Ġ( Scope ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġif Ġ( scope 1 Ġ!= Ġnull ) Ġaction ( scope 1 ) ĊĠĠĠ Ġif Ġ( scope 2 Ġ!= Ġnull ) Ġaction ( scope 2 ) Ċ } Ċ Ċ fun ĠlistOf Non Empty Scopes ( var arg Ġscopes : ĠMember Scope ?): ĠSmart List < Member Scope > Ġ= ĊĠĠĠ Ġscopes . filter To ( Smart List < Member Scope >()) Ġ{ Ġit Ġ!= Ġnull Ġ&& Ġit Ġ!== ĠMember Scope . Empty Ġ} Ċ Ċ fun ĠlistOf Non Empty Scopes ( scopes : ĠIterable < Member Scope ?> ): ĠSmart List < Member Scope > Ġ= ĊĠĠĠ Ġscopes . filter To ( Smart List < Member Scope >()) Ġ{ Ġit Ġ!= Ġnull Ġ&& Ġit Ġ!== ĠMember Scope . Empty Ġ} Ċ Ċ inline Ġfun Ġ< Scope , ĠT Ġ: ĠClass ifier Descriptor > Ġget First Classifier Dis crimin ate Headers ( scopes : ĠArray < Scope >, Ġcallback : Ġ( Scope ) Ġ-> ĠT ?): ĠT ? Ġ{ ĊĠĠĠ Ġ// ĠNOTE : ĠThis Ġis Ġperformance - sensitive ; Ġplease Ġdon 't Ġreplace Ġwith Ġmap (). first OrNull () ĊĠĠĠ Ġvar Ġresult : ĠT ? Ġ= Ġnull ĊĠĠĠ Ġfor Ġ( scope Ġin Ġscopes ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Result Ġ= Ġcallback ( scope ) ĊĠĠĠĠĠĠĠ Ġif Ġ( new Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Result Ġis ĠClass ifier Descriptor WithType Parameters Ġ&& Ġnew Result . is Expect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġnull ) Ġresult Ġ= Ġnew Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġclass Ġis ĠImp l Ġor Ġusual Ġclass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠR > ĠIterable <* >. filter Is Instance And ( predicate : Ġ( R ) Ġ-> ĠBoolean ): ĠCollection < R > Ġ= ĊĠĠĠ Ġfilter Is Instance And To ( Smart List (), Ġpredicate ) Ċ Ċ inline Ġfun Ġ< re ified ĠR , ĠC Ġ: ĠMutable Collection < in ĠR >> ĠIterable <* >. filter Is Instance And To ( destination : ĠC , Ġpredicate : Ġ( R ) Ġ-> ĠBoolean ): ĠC Ġ{ ĊĠĠĠ Ġfor Ġ( element Ġin Ġthis ) Ġif Ġ( element Ġis ĠR Ġ&& Ġpredicate ( element )) Ġdestination . add ( element ) ĊĠĠĠ Ġreturn Ġdestination Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT , Ġre ified ĠR , ĠC Ġ: ĠMutable Collection < in ĠR >> ĠIterable <* >. filter Is Instance Map To ( destination : ĠC , Ġtransform : Ġ( T ) Ġ-> ĠR ): ĠC Ġ{ ĊĠĠĠ Ġfor Ġ( element Ġin Ġthis ) Ġif Ġ( element Ġis ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdestination . add ( transform ( element )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġdestination Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT , Ġre ified ĠR > ĠIterable <* >. filter Is Instance Map NotNull ( transform : Ġ( T ) Ġ-> ĠR ?): ĠCollection < R > Ġ= ĊĠĠĠ Ġfilter Is Instance Map NotNull To ( Smart List (), Ġtransform ) Ċ Ċ inline Ġfun Ġ< re ified ĠT , Ġre ified ĠR , ĠC Ġ: ĠMutable Collection < in ĠR >> ĠIterable <* >. filter Is Instance Map NotNull To ( destination : ĠC , Ġtransform : Ġ( T ) Ġ-> ĠR ?): ĠC Ġ{ ĊĠĠĠ Ġfor Ġ( element Ġin Ġthis ) Ġif Ġ( element Ġis ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtransform ( element ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination . add ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġdestination Ċ } ĊĊ