/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 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 Ġkotlinx . coroutines . experimental . channels Ċ Ċ import Ġkotlinx . coroutines . experimental .* Ċ import Ġkotlin . coroutines . experimental .* Ċ Ċ /** Ċ Ġ* ĠScope Ġfor Ġ[ produce ] Ġcoroutine Ġbuilder . Ċ Ġ*/ Ċ public Ġinterface ĠProducer Scope < in ĠE > Ġ: ĠCor outine Scope , ĠSend Channel < E > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġreference Ġto Ġthe Ġchannel Ġthat Ġthis Ġcoroutine Ġ[ s ends ][ send ] Ġelements Ġto . ĊĠĠĠĠ Ġ* ĠIt Ġis Ġprovided Ġfor Ġconvenience , Ġso Ġthat Ġthe Ġcode Ġin Ġthe Ġcoroutine Ġcan Ġrefer ĊĠĠĠĠ Ġ* Ġto Ġthe Ġchannel Ġas Ġ` channel ` Ġas Ġapp osed Ġto Ġ` this `. ĊĠĠĠĠ Ġ* ĠAll Ġthe Ġ[ Send Channel ] Ġfunctions Ġon Ġthis Ġinterface Ġdelegate Ġto ĊĠĠĠĠ Ġ* Ġthe Ġchannel Ġinstance Ġreturned Ġby Ġthis Ġfunction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġchannel : ĠSend Channel < E > Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ suppress Ġ** Deprecated **: ĠUse Ġ` Receive Channel `. Ċ Ġ*/ Ċ @ Deprecated ( message Ġ= Ġ" Use Ġ` Receive Channel `", Ġreplace With Ġ= ĠReplace With (" Receive Channel ")) Ċ @ Suppress (" MULTIPLE _ DEFAULT S _ IN HER IT ED _ FROM _ SUPER TYPES _ WHEN _ NO _ EX PL IC IT _ OVERRIDE ") Ċ interface ĠProducer Job < out ĠE > Ġ: ĠReceive Channel < E >, ĠJob Ġ{ ĊĠĠĠ Ġ@ Deprecated ( message Ġ= Ġ" Use ĠReceive Channel Ġitself ") ĊĠĠĠ Ġval Ġchannel : ĠReceive Channel < E > Ċ } Ċ Ċ /** Ċ Ġ* ĠLa unches Ġnew Ġcoroutine Ġto Ġproduce Ġa Ġstream Ġof Ġvalues Ġby Ġsending Ġthem Ġto Ġa Ġchannel Ċ Ġ* Ġand Ġreturns Ġa Ġreference Ġto Ġthe Ġcoroutine Ġas Ġa Ġ[ Receive Channel ]. ĠThis Ġresulting Ċ Ġ* Ġobject Ġcan Ġbe Ġused Ġto Ġ[ receive ][ Receive Channel . receive ] Ġelements Ġproduced Ġby Ġthis Ġcoroutine . Ċ Ġ* Ċ Ġ* ĠThe Ġscope Ġof Ġthe Ġcoroutine Ġcontains Ġ[ Producer Scope ] Ġinterface , Ġwhich Ġimplements Ċ Ġ* Ġboth Ġ[ Coroutine Scope ] Ġand Ġ[ Send Channel ], Ġso Ġthat Ġcoroutine Ġcan Ġinvoke Ċ Ġ* Ġ[ send ][ Send Channel . send ] Ġdirectly . ĠThe Ġchannel Ġis Ġ[ closed ][ Send Channel . close ] Ċ Ġ* Ġwhen Ġthe Ġcoroutine Ġcompletes . Ċ Ġ* ĠThe Ġrunning Ġcoroutine Ġis Ġcancelled Ġwhen Ġits Ġreceive Ġchannel Ġis Ġ[ cancelled ][ Receive Channel . cancel ]. Ċ Ġ* Ċ Ġ* ĠThe Ġ[ context ] Ġfor Ġthe Ġnew Ġcoroutine Ġcan Ġbe Ġexplicitly Ġspecified . Ċ Ġ* ĠSee Ġ[ Coroutine Dispatcher ] Ġfor Ġthe Ġstandard Ġcontext Ġimplementations Ġthat Ġare Ġprovided Ġby Ġ` kotlin x . coroutines `. Ċ Ġ* ĠThe Ġ[ context ][ Coroutine Scope . context ] Ġof Ġthe Ġparent Ġcoroutine Ġfrom Ġits Ġ[ scope ][ Coroutine Scope ] Ġmay Ġbe Ġused , Ċ Ġ* Ġin Ġwhich Ġcase Ġthe Ġ[ Job ] Ġof Ġthe Ġresulting Ġcoroutine Ġis Ġa Ġchild Ġof Ġthe Ġjob Ġof Ġthe Ġparent Ġcoroutine . Ċ Ġ* ĠThe Ġparent Ġjob Ġmay Ġbe Ġalso Ġexplicitly Ġspecified Ġusing Ġ[ parent ] Ġparameter . Ċ Ġ* Ċ Ġ* ĠIf Ġthe Ġcontext Ġdoes Ġnot Ġhave Ġany Ġdispatcher Ġnor Ġany Ġother Ġ[ Continuation Interceptor ], Ġthen Ġ[ Default Dispatcher ] Ġis Ġused . Ċ Ġ* Ċ Ġ* ĠUn caught Ġexceptions Ġin Ġthis Ġcoroutine Ġclose Ġthe Ġchannel Ġwith Ġthis Ġexception Ġas Ġa Ġcause Ġand Ċ Ġ* Ġthe Ġresulting Ġchannel Ġbecomes Ġ_ failed _, Ġso Ġthat Ġany Ġattempt Ġto Ġreceive Ġfrom Ġsuch Ġa Ġchannel Ġthrows Ġexception . Ċ Ġ* Ċ Ġ* ĠSee Ġ[ new Coroutine Context ] Ġfor Ġa Ġdescription Ġof Ġdebugging Ġfacilities Ġthat Ġare Ġavailable Ġfor Ġnewly Ġcreated Ġcoroutine . Ċ Ġ* Ċ Ġ* Ġ@ param Ġcontext Ġcontext Ġof Ġthe Ġcoroutine . ĠThe Ġdefault Ġvalue Ġis Ġ[ Default Dispatcher ]. Ċ Ġ* Ġ@ param Ġcapacity Ġcapacity Ġof Ġthe Ġchannel 's Ġbuffer Ġ( no Ġbuffer Ġby Ġdefault ). Ċ Ġ* Ġ@ param Ġparent Ġexplicitly Ġspecifies Ġthe Ġparent Ġjob , Ġoverrides Ġjob Ġfrom Ġthe Ġ[ context ] Ġ( if Ġany ). * Ċ Ġ* Ġ@ param Ġblock Ġthe Ġcoroutine Ġcode . Ċ Ġ*/ Ċ public Ġfun Ġ< E > Ġproduce ( ĊĠĠĠ Ġcontext : ĠCor outine Context Ġ= ĠDefault Dispatcher , ĊĠĠĠ Ġcapacity : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġparent : ĠJob ? Ġ= Ġnull , ĊĠĠĠ Ġblock : Ġsuspend ĠProducer Scope < E >. () Ġ-> ĠUnit Ċ ): ĠReceive Channel < E > Ġ{ ĊĠĠĠ Ġval Ġchannel Ġ= ĠChannel < E >( capacity ) ĊĠĠĠ Ġval Ġnew Context Ġ= Ġnew Coroutine Context ( context , Ġparent ) ĊĠĠĠ Ġval Ġcoroutine Ġ= ĠProducer Coroutine ( new Context , Ġchannel ) ĊĠĠĠ Ġcoroutine . start ( Coroutine Start . DEFAULT , Ġcoroutine , Ġblock ) ĊĠĠĠ Ġreturn Ġcoroutine Ċ } Ċ Ċ /** Ġ@ suppress Ġ** Deprecated **: ĠBinary Ġcompatibility Ġ*/ Ċ @ Deprecated ( message Ġ= Ġ" Binary Ġcompatibility ", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) Ċ public Ġfun Ġ< E > Ġproduce ( ĊĠĠĠ Ġcontext : ĠCor outine Context Ġ= ĠDefault Dispatcher , ĊĠĠĠ Ġcapacity : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġblock : Ġsuspend ĠProducer Scope < E >. () Ġ-> ĠUnit Ċ ): ĠProducer Job < E > Ġ= ĊĠĠĠ Ġproduce ( context , Ġcapacity , Ġblock Ġ= Ġblock ) Ġas ĠProducer Job < E > Ċ Ċ /** Ċ Ġ* Ġ@ suppress Ġ** Deprecated **: ĠRename d Ġto Ġ` produce `. Ċ Ġ*/ Ċ @ Deprecated ( message Ġ= Ġ" Rename d Ġto Ġ` produce `", Ġreplace With Ġ= ĠReplace With (" produce ( context , Ġcapacity , Ġblock ) ")) Ċ public Ġfun Ġ< E > Ġbuild Channel ( ĊĠĠĠ Ġcontext : ĠCor outine Context , ĊĠĠĠ Ġcapacity : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġblock : Ġsuspend ĠProducer Scope < E >. () Ġ-> ĠUnit Ċ ): ĠProducer Job < E > Ġ= ĊĠĠĠ Ġproduce ( context , Ġcapacity , Ġblock Ġ= Ġblock ) Ġas ĠProducer Job < E > Ċ Ċ private Ġclass ĠProducer Coroutine < E >( ĊĠĠĠ Ġparent Context : ĠCor outine Context , Ġchannel : ĠChannel < E > Ċ ) Ġ: ĠChannel Coroutine < E >( parent Context , Ġchannel , Ġactive Ġ= Ġtrue ), ĠProducer Scope < E >, ĠProducer Job < E > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Cancellation Internal ( exception ally : ĠCompleted Exception ally ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcause Ġ= Ġexception ally ?. cause ĊĠĠĠĠĠĠĠ Ġval Ġprocessed Ġ= Ġwhen Ġ( exception ally ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCancel led Ġ-> Ġ_ channel . cancel ( cause ) Ġ// Ġproducer Ġcoroutine Ġwas Ġcancelled Ġ-- Ġcancel Ġchannel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ_ channel . close ( cause ) Ġ// Ġproducer Ġcoroutine Ġhas Ġcompleted Ġ-- Ġclose Ġchannel ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! processed Ġ&& Ġcause Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Coroutine Exception ( context , Ġcause ) ĊĠĠĠ Ġ} Ċ } Ċ