package Ġindi . y ume . tools . simple shared pref Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . SharedPreferences Ċ import Ġkotlin . properties . ReadWrite Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ sealed Ġclass ĠBase Type < T >( val Ġbase Field : ĠShared Field < T >) Ċ Ċ object ĠShared String Ġ: ĠBase Type < String ? >( ĊĠĠĠ Ġbase Field Ġ= ĠShared Field ( ĊĠĠĠĠĠĠĠ Ġwriter Ġ= ĠReader Ġ{ Ġ( ed , Ġk , Ġr ) Ġ-> ĠIO Ġ{ Ġed . putString ( k , Ġr ); ĠUnit Ġ} Ġ}, ĊĠĠĠĠĠĠĠ Ġreader Ġ= ĠReader Ġ{ Ġ( sp , Ġk ) Ġ-> ĠIO Ġ{ Ġsp . getString ( k , Ġnull ) Ġ} Ġ} ĊĠĠĠ Ġ) Ċ ) Ċ Ċ object ĠShared String Set Ġ: ĠBase Type < Set < String >? >( ĊĠĠĠ Ġbase Field Ġ= ĠShared Field ( ĊĠĠĠĠĠĠĠ Ġwriter Ġ= ĠReader Ġ{ Ġ( ed , Ġk , Ġr ) Ġ-> ĠIO Ġ{ Ġed . putString Set ( k , Ġr ); ĠUnit Ġ} Ġ}, ĊĠĠĠĠĠĠĠ Ġreader Ġ= ĠReader Ġ{ Ġ( sp , Ġk ) Ġ-> ĠIO Ġ{ Ġsp . getString Set ( k , Ġnull ) Ġ} Ġ} ĊĠĠĠ Ġ) Ċ ) Ċ Ċ object ĠShared Int Ġ: ĠBase Type < Int ? >( ĊĠĠĠ Ġbase Field Ġ= ĠShared Field ( ĊĠĠĠĠĠĠĠ Ġwriter Ġ= ĠReader Ġ{ Ġ( ed , Ġk , Ġr ) Ġ-> ĠIO Ġ{ Ġif Ġ( r Ġ!= Ġnull ) Ġed . put Int ( k , Ġr ) Ġelse Ġed . remove ( k ); ĠUnit Ġ} Ġ}, ĊĠĠĠĠĠĠĠ Ġreader Ġ= ĠReader Ġ{ Ġ( sp , Ġk ) Ġ-> ĠIO Ġ{ Ġif Ġ( sp . contains ( k )) Ġsp . getInt ( k , Ġ 0 ) Ġelse Ġnull Ġ} Ġ} ĊĠĠĠ Ġ) Ċ ) Ċ Ċ object ĠShared Long Ġ: ĠBase Type < Long ? >( ĊĠĠĠ Ġbase Field Ġ= ĠShared Field ( ĊĠĠĠĠĠĠĠ Ġwriter Ġ= ĠReader Ġ{ Ġ( ed , Ġk , Ġr ) Ġ-> ĠIO Ġ{ Ġif Ġ( r Ġ!= Ġnull ) Ġed . put Long ( k , Ġr ) Ġelse Ġed . remove ( k ); ĠUnit Ġ} Ġ}, ĊĠĠĠĠĠĠĠ Ġreader Ġ= ĠReader Ġ{ Ġ( sp , Ġk ) Ġ-> ĠIO Ġ{ Ġif Ġ( sp . contains ( k )) Ġsp . getLong ( k , Ġ 0 ) Ġelse Ġnull Ġ} Ġ} ĊĠĠĠ Ġ) Ċ ) Ċ Ċ object ĠShared Float Ġ: ĠBase Type < Float ? >( ĊĠĠĠ Ġbase Field Ġ= ĠShared Field ( ĊĠĠĠĠĠĠĠ Ġwriter Ġ= ĠReader Ġ{ Ġ( ed , Ġk , Ġr ) Ġ-> ĠIO Ġ{ Ġif Ġ( r Ġ!= Ġnull ) Ġed . put Float ( k , Ġr ) Ġelse Ġed . remove ( k ); ĠUnit Ġ} Ġ}, ĊĠĠĠĠĠĠĠ Ġreader Ġ= ĠReader Ġ{ Ġ( sp , Ġk ) Ġ-> ĠIO Ġ{ Ġif Ġ( sp . contains ( k )) Ġsp . get Float ( k , Ġ 0 f ) Ġelse Ġnull Ġ} Ġ} ĊĠĠĠ Ġ) Ċ ) Ċ Ċ object ĠShared Boolean Ġ: ĠBase Type < Boolean ? >( ĊĠĠĠ Ġbase Field Ġ= ĠShared Field ( ĊĠĠĠĠĠĠĠ Ġwriter Ġ= ĠReader Ġ{ Ġ( ed , Ġk , Ġr ) Ġ-> ĠIO Ġ{ Ġif Ġ( r Ġ!= Ġnull ) Ġed . put Boolean ( k , Ġr ) Ġelse Ġed . remove ( k ); ĠUnit Ġ} Ġ}, ĊĠĠĠĠĠĠĠ Ġreader Ġ= ĠReader Ġ{ Ġ( sp , Ġk ) Ġ-> ĠIO Ġ{ Ġif Ġ( sp . contains ( k )) Ġsp . getBoolean ( k , Ġfalse ) Ġelse Ġnull Ġ} Ġ} ĊĠĠĠ Ġ) Ċ ) ĊĊ Ċ type alias ĠPref Key Ġ= ĠString Ċ Ċ data Ġclass ĠShared Field < T > Ġinternal Ġconstructor ( ĊĠĠĠ Ġinternal Ġval Ġwriter : ĠReader < For IO , ĠTrip le < SharedPreferences . Editor , ĠPref Key , ĠT >, ĠUnit >, ĊĠĠĠ Ġinternal Ġval Ġreader : ĠReader < For IO , ĠPair < SharedPreferences , ĠPref Key >, ĠT > Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġ< T > Ġinvoke ( writer : Ġ( Triple < SharedPreferences . Editor , ĠPref Key , ĠT >) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader : Ġ( Pair < SharedPreferences , ĠPref Key >) Ġ-> ĠT ): ĠShared Field < T > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShared Field ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter Ġ= ĠReader Ġ{ Ġtriple Ġ-> ĠIO Ġ{ Ġwriter ( triple ) Ġ} Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader Ġ= ĠReader Ġ{ Ġpair Ġ-> ĠIO Ġ{ Ġreader ( pair ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< R > Ġmap ( wf : Ġ( R ) Ġ-> ĠT , Ġrf : Ġ( T ) Ġ-> ĠR ): ĠShared Field < R > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShared Field ( Reader Ġ{ Ġ( ed , Ġk , Ġr ) Ġ-> Ġwriter . run ( Triple ( ed , Ġk , Ġwf ( r ))) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . map ( IO . functor (), Ġrf )) ĊĊĠĠĠ Ġfun Ġbind To ( pref Model : ĠPref Model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey : ĠPref Key ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommit Write : ĠBoolean Ġ= ĠPref G lo be Config . default Write Is Commit ): ĠB inder < T > Ġ= ĊĠĠĠĠĠĠĠ ĠB inder ( key , Ġthis @ Shared Field , Ġcommit Write , Ġpref Model ) ĊĊĠĠĠ Ġin fix Ġfun Ġ< R > Ġpipe ( process : ĠPipe < T , ĠR >): ĠShared Field < R > Ġ= ĊĠĠĠĠĠĠĠ Ġmap ( process :: reverse Get , Ġprocess :: get ) Ċ } Ċ Ċ class ĠB inder < T >( ĊĠĠĠ Ġval Ġkey : ĠPref Key ?, ĊĠĠĠ Ġval Ġfield : ĠShared Field < T >, ĊĠĠĠ Ġval Ġcommit Write : ĠBoolean Ġ= ĠPref G lo be Config . default Write Is Commit , ĊĠĠĠ Ġval Ġpref Model : ĠPref Model ): ĠRead Write Property < Any ?, ĠT > Ġ{ ĊĊĠĠĠ Ġoverride Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġfield . reader . run ( Pair ( pref Model . shared Preference , Ġkey Ġ?: Ġproperty . name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fix (). attempt (). unsafe Run Sync () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Left < Throwable > Ġ-> Ġthrow Ġresult . a ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Right < T > Ġ-> Ġresult . b ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Apply Shared Pref ") ĊĠĠĠ Ġoverride Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= Ġpref Model . shared Preference . edit () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġfield . writer . run ( Triple ( editor , Ġkey Ġ?: Ġproperty . name , Ġvalue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fix (). attempt (). unsafe Run Sync () ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Left < Throwable > Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Pref G lo be Config . show Log ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . a . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Right < Unit > Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( commit Write ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . commit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠPipe < A , ĠB > Ġ{ ĊĠĠĠ Ġfun Ġget ( a : ĠA ): ĠB ĊĊĠĠĠ Ġfun Ġreverse Get ( b : ĠB ): ĠA ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġ< A , ĠB > Ġinvoke ( get : Ġ( A ) Ġ-> ĠB , Ġreverse Get : Ġ( B ) Ġ-> ĠA ): ĠPipe < A , ĠB > Ġ= Ġobject Ġ: ĠPipe < A , ĠB > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget ( a : ĠA ): ĠB Ġ= Ġget ( a ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreverse Get ( b : ĠB ): ĠA Ġ= Ġreverse Get ( b ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊĊĊĊĊĊ