/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 7 Ġ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 . contracts . model Ċ Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ Ċ /** Ċ Ġ* ĠCollection Ġof Ġinformation Ġabout Ġcontext . Ċ Ġ* Ċ Ġ* ĠThis Ġclass Ġis Ġpretty Ġclose Ġsemantic ally Ġto ĠData Flow Info , Ġbut Ċ Ġ* Ġsupports Ġbro ader Ġvariety Ġof Ġinformation Ġ( like , Ġnot Ġjust Ġinformation Ċ Ġ* Ġabout Ġsub types Ġof Ġa Ġvariable , Ġbut Ġalso Ġabout Ġtypes Ġthat Ġare Ġdefinitely Ċ Ġ* Ġnot Ġsub types Ġof Ġa Ġvariable ). Ċ Ġ* Ċ Ġ* ĠAlso , Ġit 's Ġabstract ed Ġaway Ġfrom ĠP SI Ċ Ġ*/ Ċ class ĠMutable Context Info Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġfired Effects : ĠMutable List < E SE ffect >, ĊĠĠĠĠĠĠĠ Ġval Ġsub types : ĠMutable Map < ES Value , ĠMutable Set < Kotlin Type >>, ĊĠĠĠĠĠĠĠ Ġval Ġnot Sub types : ĠMutable Map < ES Value , ĠMutable Set < Kotlin Type >>, ĊĠĠĠĠĠĠĠ Ġval Ġequal Values : ĠMutable Map < ES Value , ĠMutable Set < ES Value >>, ĊĠĠĠĠĠĠĠ Ġval Ġnot Equal Values : ĠMutable Map < ES Value , ĠMutable Set < ES Value >> Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠEMPTY : ĠMutable Context Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠMutable Context Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfired Effects Ġ= Ġmutable ListOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub types Ġ= Ġmutable Map Of (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Sub types Ġ= Ġmutable Map Of (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequal Values Ġ= Ġmutable Map Of (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Equal Values Ġ= Ġmutable Map Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsubtype ( value : ĠES Value , Ġtype : ĠKotlin Type ) Ġ= Ġapply Ġ{ Ġsub types . init And Add ( value , Ġtype ) Ġ} ĊĊĠĠĠ Ġfun Ġnot Subtype ( value : ĠES Value , Ġtype : ĠKotlin Type ) Ġ= Ġapply Ġ{ Ġnot Sub types . init And Add ( value , Ġtype ) Ġ} ĊĊĠĠĠ Ġfun Ġequal ( left : ĠES Value , Ġright : ĠES Value ) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġequal Values . init And Add ( left , Ġright ) ĊĠĠĠĠĠĠĠ Ġequal Values . init And Add ( right , Ġleft ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnot Equal ( left : ĠES Value , Ġright : ĠES Value ) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġnot Equal Values . init And Add ( left , Ġright ) ĊĠĠĠĠĠĠĠ Ġnot Equal Values . init And Add ( right , Ġleft ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfire ( effect : ĠE SE ffect ) Ġ= Ġapply Ġ{ Ġfired Effects Ġ+= Ġeffect Ġ} ĊĊĠĠĠ Ġfun Ġor ( other : ĠMutable Context Info ): ĠMutable Context Info Ġ= ĠMutable Context Info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfired Effects Ġ= Ġfired Effects . intersect ( other . f ired Effects ). to Mutable List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub types Ġ= Ġsub types . intersect ( other . sub types ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot Sub types Ġ= Ġnot Sub types . intersect ( other . not Sub types ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġequal Values Ġ= Ġequal Values . intersect ( other . equal Values ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot Equal Values Ġ= Ġnot Equal Values . intersect ( other . not Equal Values ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġand ( other : ĠMutable Context Info ): ĠMutable Context Info Ġ= ĠMutable Context Info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfired Effects Ġ= Ġfired Effects . union ( other . f ired Effects ). to Mutable List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub types Ġ= Ġsub types . union ( other . sub types ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot Sub types Ġ= Ġnot Sub types . union ( other . not Sub types ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġequal Values Ġ= Ġequal Values . union ( other . equal Values ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot Equal Values Ġ= Ġnot Equal Values . union ( other . not Equal Values ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġ< D > ĠMutable Map < ES Value , ĠMutable Set < D >> . intersect ( that : ĠMutable Map < ES Value , ĠMutable Set < D >> ): ĠMutable Map < ES Value , ĠMutable Set < D >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < ES Value , ĠMutable Set < D >>() ĊĊĠĠĠĠĠĠĠ Ġval Ġall Keys Ġ= Ġthis . keys . intersect ( that . keys ) ĊĠĠĠĠĠĠĠ Ġall Keys . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Values Ġ= Ġthis [ it ] !!. intersect ( that [ it ] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Values . isNotEmpty ()) Ġresult [ it ] Ġ= Ġnew Values . to Mutable Set () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< D > ĠMap < ES Value , ĠMutable Set < D >> . union ( that : ĠMap < ES Value , ĠMutable Set < D >> ): ĠMutable Map < ES Value , ĠMutable Set < D >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < ES Value , ĠMutable Set < D >>() ĊĠĠĠĠĠĠĠ Ġresult . put All ( this ) ĊĠĠĠĠĠĠĠ Ġthat . entries . forEach Ġ{ Ġ( that Key , Ġthat Value ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoldValue Ġ= Ġresult [ that Key ] Ġ?: Ġmutable Set Of () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠoldValue . addAll ( that Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ that Key ] Ġ= ĠoldValue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< D > ĠMutable Map < ES Value , ĠMutable Set < D >> . init And Add ( key : ĠES Value , Ġvalue : ĠD ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . compute ( key ) Ġ{ Ġ_, Ġmaybe Values Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset Of Values Ġ= Ġmaybe Values Ġ?: Ġmutable Set Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of Values . add ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of Values ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprint (): ĠString Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġthis @ Mutable Context Info ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< D > ĠMap < ES Value , ĠSet < D >> . print Map Entries With Separator ( separator : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . entries . filter Ġ{ Ġit . value . isNotEmpty () Ġ}. forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( key . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġ$ separator Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln ( value . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġappend (" F ired Ġeffects : Ġ") ĊĠĠĠĠĠĠĠ Ġappend ( info . f ired Effects . join ToString ( separator Ġ= Ġ", Ġ" Ġ)) ĊĠĠĠĠĠĠĠ Ġappend ln ("") ĊĊĠĠĠĠĠĠĠ Ġsub types . print Map Entries With Separator (" is ") ĊĊĠĠĠĠĠĠĠ Ġnot Sub types . print Map Entries With Separator (" ! is ") ĊĊĠĠĠĠĠĠĠ Ġequal Values . print Map Entries With Separator (" ==" ) ĊĊĠĠĠĠĠĠĠ Ġnot Equal Values . print Map Entries With Separator (" ! =") ĊĊĠĠĠĠĠĠĠ Ġthis . toString () ĊĠĠĠ Ġ} Ċ Ċ }