package Ġtasks Ċ Ċ import Ġcontributors .* Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġkotlinx . coroutines . launch Ċ Ċ /* Ċ ME MO : Ċ - ĠCor outine ãģ¯ Channel ãĤĴ ä»ĭ ãģĹãģ¦ äºĴ ãģĦ ãģ« éĢļä¿¡ ãĤĴ ãģĻãĤĭãģĵãģ¨ ãģĮ ãģ§ãģįãĤĭ ĊĠĠĠ Ġ- ĠChannel ãģ¯ ãĢģ çķ ° ãģªãĤĭ Coroutine éĸĵ ãģ§ ãĥĩãĥ¼ãĤ¿ ãĤĴ åıĹ ãģĳ æ¸ ¡ ãģĻ ãģĵãģ¨ ãģĮ ãģ§ãģįãĤĭ ãĤĤãģ® Ċ - Ġ ãģĤãĤĭ Coroutine ï¼Ī Producer ï¼ī ãģĮ Channel ãģ« æĥħåł± ãĤĴ éĢģ ä¿¡ ãģĻãĤĭãģ¨ ãĢģ åĪ¥ ãģ® Coroutine ï¼Ī Consumer ï¼ī ãģĮ Channel ãģĭãĤī ãģĿãģ® æĥħåł± ãĤĴ åıĹ ä¿¡ ãģĻãĤĭ ĊĠĠĠ Ġ- Ġ ãģĵãĤĮ ãģ¯ å¤ļ å¯¾ å¤ļ ãģ® ãģª ãĤĬ ãģĨ ãĤĭ ĊĠĠĠĠĠĠĠ Ġ- Ġ ãģŁ ãģł ãģĹ ãĢģ è¤ĩ æķ° ãģ® Coroutine ãģĮ Channel ãģĭãĤī æĥħåł± ãĤĴ åıĹ ä¿¡ ãģĻãĤĭ åł´åĲĪ ãĢģ ãģĿãĤĮ ãĤī ãģ® è¦ģ ç´ł ãģ¯ Consumer ãģ® ãģĦ ãģļ ãĤĮ ãģĭ ãģ«ãĤĪ ãģ£ãģ¦ 1 åº¦ ãģłãģĳ åĩ¦çĲĨ ãģķãĤĮãĤĭ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- Ġ ãģĿãģ® å¾Į ãĢģ è© ² å½ĵ ãģ® è¦ģ ç´ł ãģ¯ èĩªåĭķ çļĦãģ« Channel ãģĭãĤī åīĬéĻ¤ ãģķãĤĮãĤĭ Ċ - ĠChannel ãģ¯ 3 ãģ¤ ãģ® çķ ° ãģªãĤĭ ãĤ¤ãĥ³ ãĤ¿ ãĥ¼ãĥ ķ ãĤ§ ãĥ¼ãĤ¹ ãĤĴ ä»ĭ ãģĹãģ¦ è¡¨ ãģķãĤĮãĤĭ ĊĠĠĠ Ġ- ĠSend Channel ĊĠĠĠĠĠĠĠ Ġ- ĠProducer ãģĮ å®Ł è£ħ ãģĻãĤĭ ĊĠĠĠ Ġ- ĠReceive Channel ĊĠĠĠĠĠĠĠ Ġ- ĠConsumer ãģĮ å®Ł è£ħ ãģĻãĤĭ ĊĠĠĠ Ġ- ĠChannel Ċ ``` Ċ interface ĠSend Channel < in ĠE > Ġ{ ĊĠĠĠ Ġsuspend Ġfun Ġsend ( element : ĠE ) ĊĠĠĠ Ġfun Ġclose (): ĠBoolean Ċ } Ċ Ċ interface ĠReceive Channel < out ĠE > Ġ{ ĊĠĠĠ Ġsuspend Ġfun Ġreceive (): ĠE Ċ } Ċ Ċ interface ĠChannel < E > Ġ: ĠSend Channel < E >, ĠReceive Channel < E > Ċ ``` Ċ - ĠChannel ãģ«ãģ¯ ãģĦ ãģı ãģ¤ ãģĭ ãģ® ç¨® é¡ŀ ãģĮ åŃĺåľ¨ ãģĻãĤĭ ĊĠĠĠ Ġ- Ġ åĨħéĥ¨ çļĦãģ« ä¿ĿåŃĺ ãģ§ãģįãĤĭ è¦ģ ç´ł ãģ® æķ° ãģ¨ ãĢģ send åĳ¼ ãģ³ åĩº ãģĹ ãĤĴ ä¸Ń æĸŃ ãģ§ãģįãĤĭ ãģĭ ãģ© ãģĨ ãģĭ ãģĮ çķ ° ãģªãĤĭ ĊĠĠĠ Ġ- Ġreceive ãģ«ãģ¤ãģĦãģ¦ãģ¯ ãģĦ ãģļ ãĤĮ ãĤĤ åĲĮ æ§ ĺ ãģ« åĭķ ä½ľ ãģĹ ãĢģ Channel ãģĮ ç©º ãģ§ ãģªãģĦ åł´åĲĪãģ¯ è¦ģ ç´ł ãĤĴ åıĹ ãģĳ åıĸ ãĤĬ ãĢģ ãģĿãĤĮ ä»¥ å¤ĸ ãģ® åł´åĲĪãģ¯ ä¸Ń æĸŃ ãģĻãĤĭ Ċ - ĠChannel ãģ® ç¨® é¡ŀ ĊĠĠĠ Ġ- ĠUn limited ĠChannel ĊĠĠĠĠĠĠĠ Ġ- ĠQueue ãģ« è¿ĳ ãģĦ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- Ġ ç©º ãģ«ãģª ãģ£ãģŁ æĻĤ ãģ« ãĢģ æĸ° ãģĹãģ ı è¦ģ ç´ł ãģĮ è¿½åĬł ãģķãĤĮãĤĭ ãģ¾ãģ§ ä¸Ń æĸŃ ãģķãĤĮãĤĭ çĤ¹ ãģĮ çķ ° ãģªãĤĭ ĊĠĠĠĠĠĠĠ Ġ- Ġãĥ¡ ãĥ¢ ãĥª ãģĮ æŀ ¯ æ¸ ĩ ãģĻãĤĭ ãģ¾ãģ§ çĦ¡ éĻĲ ãģ« send ãģĻãĤĭãģĵãģ¨ ãģĮ ãģ§ãģį ãĢģ æŀ ¯ æ¸ ĩ ãģĹãģŁ ãĤ¿ãĤ¤ ãĥŁ ãĥ³ãĤ° ãģ§ OutOf Memory Exception ãģĮ æĬķ ãģ Ĵ ãĤī ãĤĮãĤĭ ĊĠĠĠ Ġ- ĠBuffered ĠChannel ĊĠĠĠĠĠĠĠ Ġ- ĠãĤµ ãĤ¤ãĤº ãĤĴæĮĩå®ļ ãģĹãģ¦ åĪ©çĶ¨ ãģĻãĤĭ ĊĠĠĠĠĠĠĠ Ġ- ĠãĤµ ãĤ¤ãĤº ãģĮ ä¸Ģ æĿ ¯ ãģ« ãģªãĤĭ ãģ¨ ãĢģ æ¬¡ãģ® send åĳ¼ ãģ³ åĩº ãģĹãģ ¯ ç©º ãģį å®¹ éĩı ãģĮ ãģ§ãģįãĤĭ ãģ¾ãģ§ ä¸Ń æĸŃ ãģķãĤĮãĤĭ ĊĠĠĠ Ġ- ĠR ende z vous ĠChannel ĊĠĠĠĠĠĠĠ Ġ- Ġãĥĩ ãĥķãĤ© ãĥ« ãĥĪ ãģ§ çĶŁæĪĲ ãģķãĤĮãĤĭ Channel ĊĠĠĠĠĠĠĠ Ġ- Ġãĥ Ĳ ãĥĥ ãĥķãĤ ¡ ãģ® ãģªãģĦ ï¼Ī ãĤµ ãĤ¤ãĤº 0 ãģ® ï¼ī Channel ĊĠĠĠĠĠĠĠ Ġ- Ġä¸Ģ æĸ¹ ãģ® éĸ¢æķ° ãģ¯ ãĤĤ ãģĨ ä¸Ģ æĸ¹ ãģĮ åĳ¼ ãģ³ åĩº ãģķãĤĮãĤĭ ãģ¾ãģ§ å¸¸ ãģ« ä¸Ń æĸŃ ãģķãĤĮãĤĭ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- Ġ ä¾ĭ ãģĪ ãģ° ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- Ġsend ãģĹãģ¦ ãĤĤ receive ãģķãĤĮ ãģªãģĦ åł´åĲĪ ãĢģ send ãģ¯ ä¸Ń æĸŃ ãģķãĤĮãĤĭ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- Ġ è¦ģ ç´ł 0 ãģ® çĬ¶æħĭ ãģ§ receive ãĤĴ åĳ¼ ãģ³ åĩº ãģĻ ãģ¨ ãĢģ send ãģĮ åĳ¼ ãģ³ åĩº ãģķãĤĮãĤĭ ãģ¾ãģ§ ä¸Ń æĸŃ ãģķãĤĮ ç¶ļ ãģĳãĤĭ ĊĠĠĠ Ġ- ĠCon fl ated ĠChannel ĊĠĠĠĠĠĠĠ Ġ- Ġãĥ Ĳ ãĥĥ ãĥķãĤ ¡ ãģ® ãģªãģĦ ï¼Ī ãĤµ ãĤ¤ãĤº 0 ãģ® ï¼ī Channel ĊĠĠĠĠĠĠĠ Ġ- ĠChannel ãģ« éĢģ ä¿¡ ãģķãĤĮãģŁ è¦ģ ç´ł ãģ¯ å¸¸ ãģ« æľĢæĸ° ãģ® åĢ¤ ãģ§ ä¸Ĭ æĽ¸ ãģį ãģķãĤĮãĤĭ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- Ġ ãģĿãģ® ãģŁãĤģ ãĢģ send ãģĮ ä¸Ń æĸŃ ãģķãĤĮãĤĭ ãģĵãģ¨ ãģ¯ ãģªãģĦ Ċ ``` Ċ val Ġren dez vous Channel Ġ= ĠChannel < String >() Ċ val Ġbuffered Channel Ġ= ĠChannel < String >( 1 0 ) Ċ val Ġcon fl ated Channel Ġ= ĠChannel < String >( CON FL ATED ) Ċ val Ġun limited Channel Ġ= ĠChannel < String >( UN LIMIT ED ) Ċ ``` Ċ Ġ*/ Ċ suspend Ġfun Ġload Contribut ors Channels ( ĊĠĠĠ Ġservice : ĠGitHub Service , ĊĠĠĠ Ġreq : ĠRequest Data , ĊĠĠĠ Ġupdate Results : Ġsuspend Ġ( List < User >, Ġcompleted : ĠBoolean ) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrepos Ġ= Ġservice ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Org Repos ( req . org ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġlog Repos ( req , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body List () ĊĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠChannel < List < User >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ( repo Ġin Ġrepos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusers Ġ= Ġservice . get Repo Contribut ors ( req . org , Ġrepo . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġlog Users ( repo , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . send ( users ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġall Users Ġ= Ġempty List < User >() ĊĠĠĠĠĠĠĠ Ġrepeat ( repos . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusers Ġ= Ġchannel . receive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Users Ġ= Ġ( all Users Ġ+ Ġusers ). aggregate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Results ( all Users , Ġit Ġ== Ġrepos . last Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ