/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 Ġcom . tun jid . demo . common . ui . numbers . advanced Ċ Ċ import Ġandroidx . compose . foundation . gest ures . Scroll able State Ċ import Ġcom . tun jid . demo . common . ui . numbers . Item Ċ import Ġcom . tun jid . demo . common . ui . numbers . List Style Ċ import Ġcom . tun jid . demo . common . ui . numbers . Number Tile Ċ import Ġcom . tun jid . mut ator . Mutation Ċ import Ġcom . tun jid . mut ator . Mut ator Ċ import Ġcom . tun jid . mut ator . coroutines . state Flow Mut ator Ċ import Ġcom . tun jid . mut ator . coroutines . to Mutation Stream Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Sharing Started Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġkotlinx . coroutines . flow . distinct Until Changed Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . merge Ċ import Ġkotlinx . coroutines . flow . share In Ċ Ċ const Ġval ĠGrid Size Ġ= Ġ 5 Ċ Ċ sealed Ġclass ĠAction ( val Ġkey : ĠString ) Ġ{ ĊĠĠĠ Ġsealed Ġclass ĠLoad Ġ: ĠAction ( key Ġ= Ġ" Load ") Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠLoad Around ( val Ġpage : ĠInt ) Ġ: ĠLoad () ĊĠĠĠĠĠĠĠ Ġobject ĠToggle Order Ġ: ĠLoad () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠFirst Visible Index Changed ( val Ġindex : ĠInt ) Ġ: ĠAction ( key Ġ= Ġ" First Visible Index Changed ") Ċ } Ċ Ċ data Ġclass ĠState ( ĊĠĠĠ Ġval Ġlist Style : ĠList Style < Scroll able State >, ĊĠĠĠ Ġval Ġis Ascending : ĠBoolean Ġ= ĠStart Ascending , ĊĠĠĠ Ġval ĠcurrentPage : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġval Ġfirst Visible Index : ĠInt Ġ= Ġ- 1 , ĊĠĠĠ Ġval Ġload Summary : ĠString Ġ= Ġ"", ĊĠĠĠ Ġval Ġitems : ĠList < Item > Ġ= ĠlistOf () Ċ ) Ċ Ċ val ĠState . sticky Header : ĠItem . Header ? ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ( val Ġitem Ġ= Ġitems . get OrNull ( first Visible Index )) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠItem . Tile Ġ-> ĠItem . Header ( page Ġ= Ġitem . page , Ġcolor Ġ= Ġitem . number Tile . color ) ĊĠĠĠĠĠĠĠ Ġis ĠItem . Header Ġ-> Ġitem ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġnull ĊĠĠĠ Ġ} Ċ Ċ fun Ġnumber Tiles Mut ator ( ĊĠĠĠ Ġscope : ĠCor outine Scope , ĊĠĠĠ Ġitems PerPage : ĠInt , ĊĠĠĠ Ġis Dark : ĠBoolean , ĊĠĠĠ Ġlist Style : ĠList Style < Scroll able State > Ċ ): ĠMut ator < Action , ĠState Flow < State >> Ġ= Ġstate Flow Mut ator ( ĊĠĠĠ Ġscope Ġ= Ġscope , ĊĠĠĠ ĠinitialState Ġ= ĠState ( list Style Ġ= Ġlist Style ), ĊĠĠĠ Ġaction Transform Ġ= Ġ{ Ġaction Flow Ġ-> ĊĠĠĠĠĠĠĠ Ġaction Flow . to Mutation Stream ( key Selector Ġ= ĠAction :: key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġaction : ĠAction Ġ= Ġtype ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAction . Load Ġ-> Ġaction . flow . load Mut ations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= Ġscope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Dark Ġ= Ġis Dark , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems PerPage Ġ= Ġitems PerPage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAction . First Visible Index Changed Ġ-> Ġaction . flow . sticky Header Mut ations () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ ) Ċ Ċ private Ġfun ĠFlow < Action . First Visible Index Changed >. sticky Header Mut ations (): ĠFlow < Mutation < State >> Ġ= ĊĠĠĠ Ġdistinct Until Changed () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( first Visible Index ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMutation Ġ{ Ġcopy ( first Visible Index Ġ= Ġfirst Visible Index ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ private Ġfun ĠFlow < Action . Load >. load Mut ations ( ĊĠĠĠ Ġscope : ĠCor outine Scope , ĊĠĠĠ Ġitems PerPage : ĠInt , ĊĠĠĠ Ġis Dark : ĠBoolean , Ċ ): ĠFlow < Mutation < State >> Ġ= Ġload Metadata () ĊĠĠĠ Ġ. share In ( ĊĠĠĠĠĠĠĠ Ġscope Ġ= Ġscope , ĊĠĠĠĠĠĠĠ Ġstarted Ġ= ĠSh aring Started . While Sub scribed ( 2 0 0 ), ĊĠĠĠĠĠĠĠ Ġreplay Ġ= Ġ 1 ĊĠĠĠ Ġ). let Ġ{ Ġload Metadata Ġ-> ĊĠĠĠĠĠĠĠ Ġmerge ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Metadata . to Number ed Tiles ( items PerPage Ġ= Ġitems PerPage , Ġis Dark Ġ= Ġis Dark ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġpages To Tiles : ĠMap < Page Query , ĠList < Number Tile >> Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMutation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy ( items Ġ= Ġpages To Tiles . flatMap Ġ{ Ġ( page Query , Ġnumber Tiles ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġnumber Tiles . first (). color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Ġ= ĠItem . Header ( page Ġ= Ġpage Query . page , Ġcolor Ġ= Ġcolor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( header ) Ġ+ Ġnumber Tiles . map ( Item :: Tile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. distinct By Ġ{ Ġit . key Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Metadata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMutation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Ascending Ġ= Ġit . is Ascending , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 3 Ġpages Ġare Ġfetched Ġat Ġonce , Ġthe Ġmiddle Ġis Ġthe Ġcurrent Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentPage Ġ= Ġit . pivot Page , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Summary Ġ= Ġit . load Summary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ