/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠSquare ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . squareup . workflow . ui . compose . internal Ċ Ċ import Ġandroidx . compose . Mutable State Ċ import Ġandroidx . compose . mutable State Of Ċ import Ġandroidx . compose . struct ural Equality Policy Ċ import Ġcom . squareup . workflow . Render Context Ċ import Ġcom . squareup . workflow . Sink Ċ import Ġcom . squareup . workflow . Snapshot Ċ import Ġcom . squareup . workflow . State ful Workflow Ċ import Ġcom . squareup . workflow . action Ċ import Ġcom . squareup . workflow . ui . compose . internal . Compose Workflow Impl . State Ċ import Ġcom . squareup . workflow . con tra Map Ċ import Ġcom . squareup . workflow . ui . compose . Compose Rendering Ċ import Ġcom . squareup . workflow . ui . compose . Compose Workflow Ċ Ċ internal Ġclass ĠCompose Workflow Impl < Props T , ĠOutput T Ġ: ĠAny >( ĊĠ Ġprivate Ġval Ġworkflow : ĠCompose Workflow < Props T , ĠOutput T > Ċ ) Ġ: ĠStateful Workflow < Props T , ĠState < Props T , ĠOutput T >, ĠOutput T , ĠCompose Rendering >() Ġ{ ĊĊĠ Ġ// ĠThis Ġdoesn 't Ġneed Ġto Ġbe Ġa Ġ@ Model , Ġit Ġonly Ġgets Ġset Ġonce , Ġbefore Ġthe Ġcomp osable Ġever Ġruns . ĊĠ Ġclass ĠS ink Holder < Output T >( var Ġsink : ĠS ink < Output T >? Ġ= Ġnull ) ĊĊĠ Ġdata Ġclass ĠState < Props T , ĠOutput T >( ĊĠĠĠ Ġval Ġprops Holder : ĠMutable State < Props T >, ĊĠĠĠ Ġval Ġsink Holder : ĠS ink Holder < Output T >, ĊĠĠĠ Ġval Ġrendering : ĠCompose Rendering ĊĠ Ġ) ĊĊĠ Ġoverride Ġfun ĠinitialState ( ĊĠĠĠ Ġprops : ĠProps T , ĊĠĠĠ Ġsnapshot : ĠSnapshot ? ĊĠ Ġ): ĠState < Props T , ĠOutput T > Ġ{ ĊĠĠĠ Ġval Ġprops Holder Ġ= Ġmutable State Of ( props , Ġpolicy Ġ= Ġstructural Equality Policy ()) ĊĠĠĠ Ġval Ġsink Holder Ġ= ĠS ink Holder < Output T >() ĊĠĠĠ Ġreturn ĠState ( props Holder , Ġsink Holder , ĠCompose Rendering Ġ{ Ġenvironment Ġ-> ĊĠĠĠĠĠ Ġ// ĠThe Ġsink Ġwill Ġget Ġset Ġon Ġthe Ġfirst Ġrender Ġpass , Ġso Ġit Ġshould Ġnever Ġbe Ġnull . ĊĠĠĠĠĠ Ġval Ġsink Ġ= Ġsink Holder . sink !! ĊĠĠĠĠĠ Ġ// ĠImport ant : ĠUse Ġthe Ġprops Ġfrom Ġthe ĠMutable State , Ġ_ not _ Ġthe Ġone Ġpassed Ġinto Ġrender . ĊĠĠĠĠĠ Ġworkflow . render ( props Holder . value , Ġsink , Ġenvironment ) ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Props Changed ( ĊĠĠĠ Ġold : ĠProps T , ĊĠĠĠ Ġnew : ĠProps T , ĊĠĠĠ Ġstate : ĠState < Props T , ĠOutput T > ĊĠ Ġ): ĠState < Props T , ĠOutput T > Ġ{ ĊĠĠĠ Ġstate . props Holder . value Ġ= Ġnew ĊĠĠĠ Ġreturn Ġstate ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġrender ( ĊĠĠĠ Ġprops : ĠProps T , ĊĠĠĠ Ġstate : ĠState < Props T , ĠOutput T >, ĊĠĠĠ Ġcontext : ĠRender Context < State < Props T , ĠOutput T >, ĠOutput T > ĊĠ Ġ): ĠCompose Rendering Ġ{ ĊĠĠĠ Ġ// ĠThe Ġfirst Ġrender Ġpass Ġneeds Ġto Ġcache Ġthe Ġsink . ĠThe Ġsink Ġis Ġre usable , Ġso Ġwe Ġcan Ġjust Ġpass Ġthe ĊĠĠĠ Ġ// Ġsame Ġone Ġevery Ġtime . ĊĠĠĠ Ġif Ġ( state . sink Holder . sink Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġstate . sink Holder . sink Ġ= Ġcontext . action Sink . con tra Map (:: forward Output ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġon Props Changed Ġwill Ġensure Ġthe Ġrendering Ġis Ġre - composed Ġwhen Ġthe Ġprops Ġchanges . ĊĠĠĠ Ġreturn Ġstate . rendering ĊĠ Ġ} ĊĊĠ Ġ// ĠCompiler Ġbug Ġdoesn 't Ġlet Ġus Ġcall ĠSnapshot . EMPTY . ĊĠ Ġoverride Ġfun Ġsnapshot State ( state : ĠState < Props T , ĠOutput T >): ĠSnapshot Ġ= ĠSnapshot . of ("") ĊĊĠ Ġprivate Ġfun Ġforward Output ( output : ĠOutput T ) Ġ= Ġaction Ġ{ Ġset Output ( output ) Ġ} Ċ } Ċ