package Ġcom . pand ul ape ter . be agle . core . list Ċ Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . pand ul ape ter . be agle . common . contracts . module . Cell Ċ import Ġcom . pand ul ape ter . be agle . common . contracts . module . ViewHolder Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . util . Array Deque Ċ import Ġkotlin . reflect . K Class Ċ Ċ internal Ġclass ĠCell Adapter Ġ: ĠRecyclerView . Adapter < ViewHolder < out ĠCell <* >> >() Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdeleg ates Ġ= Ġmutable Map Of < K Class <* >, ĠViewHolder . Delegate <* >>() ĊĠĠĠ Ġprivate Ġvar Ġitems Ġ= Ġempty List < Cell <* >>() ĊĠĠĠ Ġprivate Ġvar Ġjob : ĠJob ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġpending Updates Ġ= ĠArray Deque < List < Cell <* >> >() ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count () Ġ= Ġitems . size ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcell Ġ= Ġitems [ position ] ĊĠĠĠĠĠĠĠ Ġreturn Ġdeleg ates . keys . indexOf ( cell :: class ). let Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ates [ cell :: class ] Ġ= Ġcell . create ViewHolder Delegate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ates . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġindex ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder < *> Ġ= Ġdeleg ates . values . toList ()[ view Type ]. create ViewHolder ( parent ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder < out ĠCell <* >>, Ġposition : ĠInt ) Ġ= Ġholder . force Bind ( items [ position ]) ĊĊĠĠĠ Ġsuspend Ġfun Ġsubmit List ( new Items : ĠList < Cell <* >>, Ġon List Updated : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Updates . add ( new Items ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pending Updates . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( new Items , Ġon List Updated ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate ( new Items : ĠList < Cell <* >>, Ġon List Updated : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġjob ?. cancel () ĊĠĠĠĠĠĠĠ Ġjob Ġ= ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠDiff Util . calculate Diff ( Diff Callback ( items , Ġnew Items )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= Ġlaunch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Ġ= Ġnew Items ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . dispatch Updates To ( this @ Cell Adapter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Queue ( on List Updated ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Queue ( on List Updated : Ġ(() Ġ-> ĠUnit )? ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpending Updates . remove () ĊĠĠĠĠĠĠĠ Ġif Ġ( pending Updates . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon List Updated ?. invoke () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pending Updates . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast List Ġ= Ġpending Updates . peek Last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Updates . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Updates . add ( last List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Updates . peek ()?. let Ġ{ Ġupdate ( it , Ġon List Updated ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠDiff Callback ( private Ġval Ġold Items : ĠList < Cell <* >>, Ġprivate Ġval Ġnew Items : ĠList < Cell <* >>) Ġ: ĠDiff Util . Callback () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Old List Size () Ġ= Ġold Items . size ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget New List Size () Ġ= Ġnew Items . size ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item Position : ĠInt , Ġnew Item Position : ĠInt ) Ġ= Ġold Items [ old Item Position ]. id Ġ== Ġnew Items [ new Item Position ]. id ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item Position : ĠInt , Ġnew Item Position : ĠInt ) Ġ= Ġold Items [ old Item Position ] Ġ== Ġnew Items [ new Item Position ] ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Change Payload ( old Item Position : ĠInt , Ġnew Item Position : ĠInt ) Ġ= ĠUnit ĊĠĠĠ Ġ} Ċ }