/* Ċ Ġ* Ġ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 . fun ctors Ċ Ċ import Ġorg . jetbrains . kotlin . contracts . model .* Ċ import Ġorg . jetbrains . kotlin . contracts . model . structure .* Ċ import Ġorg . jetbrains . kotlin . contracts . model . visitor s . Reducer Ċ import Ġorg . jetbrains . kotlin . contracts . model . visitor s . Subst it utor Ċ import Ġorg . jetbrains . kotlin . descriptors . Function Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Value Descriptor Ċ import Ġorg . jetbrains . kotlin . utils . add If NotNull Ċ Ċ class ĠSubst it uting Functor ( ĊĠĠĠ Ġprivate Ġval Ġbasic Effects : ĠList < E SE ffect >, ĊĠĠĠ Ġprivate Ġval Ġowner Function : ĠFunction Descriptor Ċ ) Ġ: ĠAbstract Functor () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġdo Invocation ( arguments : ĠList < Computation >, Ġreducer : ĠRed ucer ): ĠList < E SE ffect > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( basic Effects . isEmpty ()) Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġreceiver Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf NotNull ( owner Function . dispatch Receiver Parameter ?. to ES Variable (), Ġowner Function . extension Receiver Parameter ?. to ES Variable ()) ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġreceiver Ġ+ Ġowner Function . value Parameters . map Ġ{ Ġit . to ES Variable () Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert ( parameters . size Ġ== Ġarguments . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Arguments Ġand Ġparameters Ġsize Ġmismatch : Ġarguments . size Ġ= Ġ${ arguments . size }, Ġparameters . size Ġ= Ġ${ parameters . size }" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsubstitution s Ġ= Ġparameters . zip ( arguments ). toMap () ĊĠĠĠĠĠĠĠ Ġval Ġsubstit utor Ġ= ĠSubst it utor ( subst itution s , Ġreducer ) ĊĠĠĠĠĠĠĠ Ġval Ġsubstit uted Clause s Ġ= Ġmutable ListOf < E SE ffect >() ĊĊĠĠĠĠĠĠĠ Ġeffects Loop @ Ġfor Ġ( effect Ġin Ġbasic Effects ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( effect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠConditional Effect Ġ-> Ġeffect . condition . accept ( subst it utor )?. effects ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubstit uted Clause s . add If NotNull ( combine ( effect . simple Effect , Ġit )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠES Calls Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubstitution For Callable Ġ= Ġsubstitution s [ effect . callable ] Ġas ? ĠES Value Ġ?: Ġcontinue @ effects Loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubstit uted Clause s Ġ+= ĠES Calls ( subst itution For Callable , Ġeffect . kind ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsubstit uted Clause s Ġ+= Ġeffect ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsubstit uted Clause s ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcombine ( effect : ĠSimple Effect , Ġsubstit uted Condition : ĠE SE ffect ): ĠE SE ffect ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( subst it uted Condition Ġ! is ĠConditional Effect ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġeffect From Condition Ġ= Ġsubstit uted Condition . simple Effect ĊĠĠĠĠĠĠĠ Ġif Ġ( effect From Condition Ġ! is ĠES Returns Ġ|| Ġeffect From Condition . value . is Wildcard ) Ġreturn Ġsubstit uted Condition ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! effect From Condition . value . isTrue ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn ĠConditional Effect ( subst it uted Condition . condition , Ġeffect ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠValue Descriptor . to ES Variable (): ĠES Variable Ġ= ĠES Variable ( this ) Ċ } Ċ