package Ġcom . lifecycle . coroutines . view model . list Ċ Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . List Update Callback Ċ import Ġcom . lifecycle . binding . adapter . Adapter Type Ċ import Ġcom . lifecycle . binding . adapter . recycler . Diff Util Callback Ċ import Ġcom . lifecycle . binding . inter . inflate . Diff Ċ import Ġcom . lifecycle . binding . util . is State Start Ċ import Ġcom . lifecycle . binding . util . state Original Ċ import Ġcom . lifecycle . coroutines . util . launch UI Ċ import Ġkotlinx . coroutines . Dispatch ers . IO Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow .* Ċ Ċ open Ġclass ĠList Diff ViewModel < E Ġ: ĠDiff > Ġ: ĠList ViewModel < E >() Ġ{ ĊĊĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġoverride Ġfun ĠgetData ( state : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Adapter Type . refresh Ġ== Ġstate Original ( state )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Subscribe ( launch UI Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Data ( getStart Offset ( state ), Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flow On ( IO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġdiff ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ ĠonError ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Completion Ġ{ ĠonComplete () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġit . dispatch Updates To ( adapter Ġas ĠList Update Callback ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġsuper . getData ( state ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdiff ( it : ĠList < E >) Ġ= ĠDiff Util . calculate Diff ( Diff Util Callback ( adapter List , Ġit )) ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġadapter List . clear () Ġ} ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġadapter List . addAll ( it ) Ġ} Ċ }