package Ġcom . example . s ud ok us olver Ċ Ċ import Ġandroidx . compose . runtime . snapshots . Snapshot State List Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . datastore . core . DataStore Ċ import Ġandroidx . datastore . preferences . core . Preferences Ċ import Ġandroidx . datastore . preferences . core . edit Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ Ċ // ĠStores Ġthe Ġgiven Ġboard Ġand Ġmakes Ġit Ġfor Ġother Ġcode Ġto Ġinteract Ġwith Ġthe Ġboard Ġin Ġsafe Ġmanner Ċ class ĠS udoku Board ( ĊĠĠĠ Ġprivate Ġval Ġs udoku Board Items : ĠSnapshot State List < S udoku Board Item >, ĊĠĠĠ Ġval Ġcurrent Game History : ĠSnapshot State List < Current Game History Item >, ĊĠĠĠ Ġprivate Ġval Ġdata Store : ĠData Store < Preferences > Ċ ) Ġ{ ĊĊĠĠĠ Ġ// ĠIs Ġan Ġimmutable Ġlist Ġwhich Ġwe Ġcan Ġshare Ġwith Ġothers . ĊĠĠĠ Ġ// ĠThis Ġis Ġdone Ġto Ġprevent Ġdirect Ġmutation Ġof Ġthe Ġboard . ĊĠĠĠ Ġ// ĠAll Ġmutation Ġmust Ġgo Ġthrough Ġthe Ġmutate Ġfunction ĊĠĠĠ Ġvar Ġitems : ĠList < S udoku Board Item > Ġ= Ġs udoku Board Items ĊĊĠĠĠ Ġfun Ġmutate ( ĊĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠ ĠbackgroundColor : ĠColor ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġnumber : ĠInt ? Ġ= Ġnull , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Box Within Board ( index , Ġs udoku Board Items . size )) Ġreturn ĊĠĠĠĠĠĠĠ Ġnumber ?. let Ġ{ Ġif Ġ(! isValid S udoku Num ( number )) Ġreturn Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate Current Game History ( index , Ġnumber ) ĊĠĠĠĠĠĠĠ Ġmutate Board ( index , ĠbackgroundColor , Ġnumber ) ĊĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . Main ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpersist Board () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmutate ( index : ĠInt , ĠbackgroundColor : ĠColor ) Ġ= Ġmutate ( index , ĠbackgroundColor , Ġnull ) ĊĠĠĠ Ġfun Ġmutate ( index : ĠInt , Ġnumber : ĠInt ) Ġ= Ġmutate ( index , Ġnull , Ġnumber ) ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Current Game History ( ĊĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠ Ġnumber : ĠInt ?, ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnumber ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNew Number ( s udoku Board Items [ index ]. number , Ġnumber )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Game History . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCurrent Game History Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ= Ġnumber , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoldValue Ġ= Ġs udoku Board Items [ index ]. number , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs udoku Item Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠMut ates Ġthe Ġboard Ġby Ġcreating Ġa Ġnew ĠS udoku Board Item . ĊĠĠĠ Ġ// ĠThis Ġis Ġdone Ġto Ġtrigger Ġa ĠUI Ġupdate . ĠUpdating Ġa Ġclass Ġmember Ġwill Ġnot Ġtrigger Ġa ĠUI Ġupdate ĊĠĠĠ Ġprivate Ġfun Ġmutate Board ( ĊĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠ ĠbackgroundColor : ĠColor ?, ĊĠĠĠĠĠĠĠ Ġnumber : ĠInt ?, ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġs udoku Board Items [ index ] Ġ= Ġs udoku Board Items [ index ]. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠbackgroundColor Ġ= ĠbackgroundColor Ġ?: Ġs udoku Board Items [ index ]. backgroundColor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber Ġ= Ġnumber Ġ?: Ġs udoku Board Items [ index ]. number ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġitems Ġ= Ġs udoku Board Items . toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis New Number ( old : ĠInt , Ġnew : ĠInt ) Ġ= Ġold Ġ!= Ġnew ĊĠĠĠ Ġprivate Ġfun Ġis Box Within Board ( n : ĠInt , Ġboard Size : ĠInt ) Ġ= Ġn Ġin Ġ 0 Ġuntil Ġboard Size ĊĠĠĠ Ġprivate Ġfun ĠisValid S udoku Num ( n : ĠInt ) Ġ= Ġn Ġin Ġ 0 .. 9 ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġpersist Board () Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Store . edit Ġ{ Ġpref Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpref [ SU DO KU _ BOARD ] Ġ= Ġs udoku Board Items . map Ġ{ Ġit . number Ġ}. join ToString ( separator Ġ= Ġ", ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ