/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ Ċ @ file : Opt In ( Experimental Type Inference :: class ) Ċ @ file : Jvm Name (" Snapshot State Kt ") Ċ @ file : Jvm Mult if ile Class Ċ package Ġandroidx . compose . runtime Ċ Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . suspend C ancellable Coroutine Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . experimental . Experimental Type Inference Ċ // ĠExplicit Ġimports Ġfor Ġthese Ġneeded Ġin Ġcommon Ġsource Ġsets . Ċ import Ġkotlin . jvm . Jvm Name Ċ import Ġkotlin . jvm . Jvm Mult if ile Class Ċ Ċ /** Ċ Ġ* ĠReceiver Ġscope Ġfor Ġuse Ġwith Ġ[ produce State ]. Ċ Ġ*/ Ċ interface ĠPro duce State Scope < T > Ġ: ĠMutable State < T >, ĠCor outine Scope Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAwait Ġthe Ġdis posal Ġof Ġthis Ġproducer Ġwhether Ġit Ġleft Ġthe Ġcomposition , ĊĠĠĠĠ Ġ* Ġthe Ġsource Ġchanged , Ġor Ġan Ġerror Ġoccurred . ĠAlways Ġruns Ġ[ on Dispose ] Ġbefore Ġres uming . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġuseful Ġwhen Ġconfiguring Ġcallback - based Ġstate Ġpro ducers Ġthat Ġdo Ġnot Ġsuspend , ĊĠĠĠĠ Ġ* Ġfor Ġexample : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ sample Ġandroidx . compose . runtime . samples . Produce State Await Dispose ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġawait Dispose ( on Dispose : Ġ() Ġ-> ĠUnit ): ĠNothing Ċ } Ċ Ċ private Ġclass ĠPro duce State Scope Impl < T >( ĊĠĠĠ Ġstate : ĠMutable State < T >, ĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context Ċ ) Ġ: ĠPro duce State Scope < T >, ĠMutable State < T > Ġby Ġstate Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġawait Dispose ( on Dispose : Ġ() Ġ-> ĠUnit ): ĠNothing Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend C ancellable Coroutine < Nothing > Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Dispose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturn Ġan Ġobservable Ġ[ snapshot ][ android x . compose . runtime . snapshots . Snapshot ] Ġ[ State ] Ġthat Ċ Ġ* Ġproduces Ġvalues Ġover Ġtime Ġwithout Ġa Ġdefined Ġdata Ġsource . Ċ Ġ* Ċ Ġ* Ġ[ producer ] Ġis Ġlaunched Ġwhen Ġ[ produce State ] Ġent ers Ġthe Ġcomposition Ġand Ġis Ġcancelled Ġwhen Ċ Ġ* Ġ[ produce State ] Ġleaves Ġthe Ġcomposition . Ġ[ producer ] Ġshould Ġuse Ġ[ Produce State Scope . value ] Ċ Ġ* Ġto Ġset Ġnew Ġvalues Ġon Ġthe Ġreturned Ġ[ State ]. Ċ Ġ* Ċ Ġ* ĠThe Ġreturned Ġ[ State ] Ġcon fl ates Ġvalues ; Ġno Ġchange Ġwill Ġbe Ġobservable Ġif Ċ Ġ* Ġ[ Produce State Scope . value ] Ġis Ġused Ġto Ġset Ġa Ġvalue Ġthat Ġis Ġ[ equal ][ Any . equals ] Ġto Ġits Ġold Ġvalue , Ċ Ġ* Ġand Ġob servers Ġmay Ġonly Ġsee Ġthe Ġlatest Ġvalue Ġif Ġseveral Ġvalues Ġare Ġset Ġin Ġrapid Ġsuccess ion . Ċ Ġ* Ċ Ġ* Ġ[ produce State ] Ġmay Ġbe Ġused Ġto Ġobserve Ġeither Ġsus pending Ġor Ġnon - sus pending Ġsources Ġof Ġexternal Ċ Ġ* Ġdata , Ġfor Ġexample : Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . runtime . samples . Produce State Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . runtime . samples . Produce State Await Dispose Ċ Ġ*/ Ċ @ Composable Ċ fun Ġ< T > Ġproduce State ( ĊĠĠĠ Ġinitial Value : ĠT , ĊĠĠĠ Ġ@ Builder Inference Ġproducer : Ġsuspend ĠPro duce State Scope < T >. () Ġ-> ĠUnit Ċ ): ĠState < T > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġremember Ġ{ Ġmutable State Of ( initial Value ) Ġ} ĊĠĠĠ ĠLa unched Effect ( Unit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPro duce State Scope Impl ( result , Ġcoroutine Context ). producer () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ /** Ċ Ġ* ĠReturn Ġan Ġobservable Ġ[ snapshot ][ android x . compose . runtime . snapshots . Snapshot ] Ġ[ State ] Ġthat Ċ Ġ* Ġproduces Ġvalues Ġover Ġtime Ġfrom Ġ[ key 1 ]. Ċ Ġ* Ċ Ġ* Ġ[ producer ] Ġis Ġlaunched Ġwhen Ġ[ produce State ] Ġent ers Ġthe Ġcomposition Ġand Ġis Ġcancelled Ġwhen Ċ Ġ* Ġ[ produce State ] Ġleaves Ġthe Ġcomposition . ĠIf Ġ[ key 1 ] Ġchanges , Ġa Ġrunning Ġ[ producer ] Ġwill Ġbe Ċ Ġ* Ġcancelled Ġand Ġre - la unched Ġfor Ġthe Ġnew Ġsource . Ġ[ producer ] Ġshould Ġuse Ġ[ Produce State Scope . value ] Ċ Ġ* Ġto Ġset Ġnew Ġvalues Ġon Ġthe Ġreturned Ġ[ State ]. Ċ Ġ* Ċ Ġ* ĠThe Ġreturned Ġ[ State ] Ġcon fl ates Ġvalues ; Ġno Ġchange Ġwill Ġbe Ġobservable Ġif Ċ Ġ* Ġ[ Produce State Scope . value ] Ġis Ġused Ġto Ġset Ġa Ġvalue Ġthat Ġis Ġ[ equal ][ Any . equals ] Ġto Ġits Ġold Ġvalue , Ċ Ġ* Ġand Ġob servers Ġmay Ġonly Ġsee Ġthe Ġlatest Ġvalue Ġif Ġseveral Ġvalues Ġare Ġset Ġin Ġrapid Ġsuccess ion . Ċ Ġ* Ċ Ġ* Ġ[ produce State ] Ġmay Ġbe Ġused Ġto Ġobserve Ġeither Ġsus pending Ġor Ġnon - sus pending Ġsources Ġof Ġexternal Ċ Ġ* Ġdata , Ġfor Ġexample : Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . runtime . samples . Produce State Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . runtime . samples . Produce State Await Dispose Ċ Ġ*/ Ċ @ Composable Ċ fun Ġ< T > Ġproduce State ( ĊĠĠĠ Ġinitial Value : ĠT , ĊĠĠĠ Ġkey 1 : ĠAny ?, ĊĠĠĠ Ġ@ Builder Inference Ġproducer : Ġsuspend ĠPro duce State Scope < T >. () Ġ-> ĠUnit Ċ ): ĠState < T > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġremember Ġ{ Ġmutable State Of ( initial Value ) Ġ} ĊĠĠĠ ĠLa unched Effect ( key 1 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPro duce State Scope Impl ( result , Ġcoroutine Context ). producer () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ /** Ċ Ġ* ĠReturn Ġan Ġobservable Ġ[ snapshot ][ android x . compose . runtime . snapshots . Snapshot ] Ġ[ State ] Ġthat Ċ Ġ* Ġproduces Ġvalues Ġover Ġtime Ġfrom Ġ[ key 1 ] Ġand Ġ[ key 2 ]. Ċ Ġ* Ċ Ġ* Ġ[ producer ] Ġis Ġlaunched Ġwhen Ġ[ produce State ] Ġent ers Ġthe Ġcomposition Ġand Ġis Ġcancelled Ġwhen Ċ Ġ* Ġ[ produce State ] Ġleaves Ġthe Ġcomposition . ĠIf Ġ[ key 1 ] Ġor Ġ[ key 2 ] Ġchange , Ġa Ġrunning Ġ[ producer ] Ċ Ġ* Ġwill Ġbe Ġcancelled Ġand Ġre - la unched Ġfor Ġthe Ġnew Ġsource . Ġ[ producer ] Ġshould Ġuse Ċ Ġ* Ġ[ Produce State Scope . value ] Ġto Ġset Ġnew Ġvalues Ġon Ġthe Ġreturned Ġ[ State ]. Ċ Ġ* Ċ Ġ* ĠThe Ġreturned Ġ[ State ] Ġcon fl ates Ġvalues ; Ġno Ġchange Ġwill Ġbe Ġobservable Ġif Ċ Ġ* Ġ[ Produce State Scope . value ] Ġis Ġused Ġto Ġset Ġa Ġvalue Ġthat Ġis Ġ[ equal ][ Any . equals ] Ġto Ġits Ġold Ġvalue , Ċ Ġ* Ġand Ġob servers Ġmay Ġonly Ġsee Ġthe Ġlatest Ġvalue Ġif Ġseveral Ġvalues Ġare Ġset Ġin Ġrapid Ġsuccess ion . Ċ Ġ* Ċ Ġ* Ġ[ produce State ] Ġmay Ġbe Ġused Ġto Ġobserve Ġeither Ġsus pending Ġor Ġnon - sus pending Ġsources Ġof Ġexternal Ċ Ġ* Ġdata , Ġfor Ġexample : Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . runtime . samples . Produce State Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . runtime . samples . Produce State Await Dispose Ċ Ġ*/ Ċ @ Composable Ċ fun Ġ< T > Ġproduce State ( ĊĠĠĠ Ġinitial Value : ĠT , ĊĠĠĠ Ġkey 1 : ĠAny ?, ĊĠĠĠ Ġkey 2 : ĠAny ?, ĊĠĠĠ Ġ@ Builder Inference Ġproducer : Ġsuspend ĠPro duce State Scope < T >. () Ġ-> ĠUnit Ċ ): ĠState < T > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġremember Ġ{ Ġmutable State Of ( initial Value ) Ġ} ĊĠĠĠ ĠLa unched Effect ( key 1 , Ġkey 2 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPro duce State Scope Impl ( result , Ġcoroutine Context ). producer () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ /** Ċ Ġ* ĠReturn Ġan Ġobservable Ġ[ snapshot ][ android x . compose . runtime . snapshots . Snapshot ] Ġ[ State ] Ġthat Ċ Ġ* Ġproduces Ġvalues Ġover Ġtime Ġfrom Ġ[ key 1 ], Ġ[ key 2 ] Ġand Ġ[ key 3 ]. Ċ Ġ* Ċ Ġ* Ġ[ producer ] Ġis Ġlaunched Ġwhen Ġ[ produce State ] Ġent ers Ġthe Ġcomposition Ġand Ġis Ġcancelled Ġwhen Ċ Ġ* Ġ[ produce State ] Ġleaves Ġthe Ġcomposition . ĠIf Ġ[ key 1 ], Ġ[ key 2 ] Ġor Ġ[ key 3 ] Ġchange , Ġa Ġrunning Ċ Ġ* Ġ[ producer ] Ġwill Ġbe Ġcancelled Ġand Ġre - la unched Ġfor Ġthe Ġnew Ġsource . Ġ[ producer Ġshould Ġuse Ċ Ġ* Ġ[ Produce State Scope . value ] Ġto Ġset Ġnew Ġvalues Ġon Ġthe Ġreturned Ġ[ State ]. Ċ Ġ* Ċ Ġ* ĠThe Ġreturned Ġ[ State ] Ġcon fl ates Ġvalues ; Ġno Ġchange Ġwill Ġbe Ġobservable Ġif Ċ Ġ* Ġ[ Produce State Scope . value ] Ġis Ġused Ġto Ġset Ġa Ġvalue Ġthat Ġis Ġ[ equal ][ Any . equals ] Ġto Ġits Ġold Ġvalue , Ċ Ġ* Ġand Ġob servers Ġmay Ġonly Ġsee Ġthe Ġlatest Ġvalue Ġif Ġseveral Ġvalues Ġare Ġset Ġin Ġrapid Ġsuccess ion . Ċ Ġ* Ċ Ġ* Ġ[ produce State ] Ġmay Ġbe Ġused Ġto Ġobserve Ġeither Ġsus pending Ġor Ġnon - sus pending Ġsources Ġof Ġexternal Ċ Ġ* Ġdata , Ġfor Ġexample : Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . runtime . samples . Produce State Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . runtime . samples . Produce State Await Dispose Ċ Ġ*/ Ċ @ Composable Ċ fun Ġ< T > Ġproduce State ( ĊĠĠĠ Ġinitial Value : ĠT , ĊĠĠĠ Ġkey 1 : ĠAny ?, ĊĠĠĠ Ġkey 2 : ĠAny ?, ĊĠĠĠ Ġkey 3 : ĠAny ?, ĊĠĠĠ Ġ@ Builder Inference Ġproducer : Ġsuspend ĠPro duce State Scope < T >. () Ġ-> ĠUnit Ċ ): ĠState < T > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġremember Ġ{ Ġmutable State Of ( initial Value ) Ġ} ĊĠĠĠ ĠLa unched Effect ( key 1 , Ġkey 2 , Ġkey 3 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPro duce State Scope Impl ( result , Ġcoroutine Context ). producer () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ /** Ċ Ġ* ĠReturn Ġan Ġobservable Ġ[ snapshot ][ android x . compose . runtime . snapshots . Snapshot ] Ġ[ State ] Ġthat Ċ Ġ* Ġproduces Ġvalues Ġover Ġtime Ġfrom Ġ[ keys ]. Ċ Ġ* Ċ Ġ* Ġ[ producer ] Ġis Ġlaunched Ġwhen Ġ[ produce State ] Ġent ers Ġthe Ġcomposition Ġand Ġis Ġcancelled Ġwhen Ċ Ġ* Ġ[ produce State ] Ġleaves Ġthe Ġcomposition . ĠIf Ġ[ keys ] Ġchange , Ġa Ġrunning Ġ[ producer ] Ġwill Ġbe Ċ Ġ* Ġcancelled Ġand Ġre - la unched Ġfor Ġthe Ġnew Ġsource . Ġ[ producer ] Ġshould Ġuse Ġ[ Produce State Scope . value ] Ċ Ġ* Ġto Ġset Ġnew Ġvalues Ġon Ġthe Ġreturned Ġ[ State ]. Ċ Ġ* Ċ Ġ* ĠThe Ġreturned Ġ[ State ] Ġcon fl ates Ġvalues ; Ġno Ġchange Ġwill Ġbe Ġobservable Ġif Ċ Ġ* Ġ[ Produce State Scope . value ] Ġis Ġused Ġto Ġset Ġa Ġvalue Ġthat Ġis Ġ[ equal ][ Any . equals ] Ġto Ġits Ġold Ġvalue , Ċ Ġ* Ġand Ġob servers Ġmay Ġonly Ġsee Ġthe Ġlatest Ġvalue Ġif Ġseveral Ġvalues Ġare Ġset Ġin Ġrapid Ġsuccess ion . Ċ Ġ* Ċ Ġ* Ġ[ produce State ] Ġmay Ġbe Ġused Ġto Ġobserve Ġeither Ġsus pending Ġor Ġnon - sus pending Ġsources Ġof Ġexternal Ċ Ġ* Ġdata , Ġfor Ġexample : Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . runtime . samples . Produce State Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . runtime . samples . Produce State Await Dispose Ċ Ġ*/ Ċ @ Composable Ċ fun Ġ< T > Ġproduce State ( ĊĠĠĠ Ġinitial Value : ĠT , ĊĠĠĠ Ġvar arg Ġkeys : ĠAny ?, ĊĠĠĠ Ġ@ Builder Inference Ġproducer : Ġsuspend ĠPro duce State Scope < T >. () Ġ-> ĠUnit Ċ ): ĠState < T > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġremember Ġ{ Ġmutable State Of ( initial Value ) Ġ} ĊĠĠĠ Ġ@ Suppress (" CHANG ING _ ARGUMENT S _ EXEC UTION _ ORDER _ FOR _ NAMED _ VAR ARGS ") ĊĠĠĠ ĠLa unched Effect ( keys Ġ= Ġkeys ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPro duce State Scope Impl ( result , Ġcoroutine Context ). producer () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ