/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠR ussell ĠW olf Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠ Ġhttp :// 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 . rus sh w olf . settings Ċ Ċ import Ġcom . rus sh w olf . settings . Apple Settings . Factory Ċ import Ġkotlinx . c interop . convert Ċ import Ġplatform . Foundation . NS Notification Ċ import Ġplatform . Foundation . NS Notification Center Ċ import Ġplatform . Foundation . NS User Defaults Ċ import Ġplatform . Foundation . NS User Defaults DidChange Notification Ċ import Ġplatform . darwin . NSObject Protocol Ċ Ċ /** Ċ Ġ* ĠA Ġcollection Ġof Ġstorage - back ed Ġkey - value Ġdata Ċ Ġ* Ċ Ġ* ĠThis Ġclass Ġallows Ġstorage Ġof Ġvalues Ġwith Ġthe Ġ[ Int ], Ġ[ Long ], Ġ[ String ], Ġ[ Float ], Ġ[ Double ], Ġor Ġ[ Boolean ] Ġtypes , Ġusing Ġa Ċ Ġ* Ġ[ String ] Ġreference Ġas Ġa Ġkey . ĠValues Ġwill Ġbe Ġpersisted Ġacross Ġapp Ġla unches . Ċ Ġ* Ċ Ġ* ĠThe Ġspecific Ġpersistence Ġmechanism Ġis Ġdefined Ġusing Ġa Ġplatform - specific Ġimplementation , Ġso Ġcertain Ġbehavior Ġmay Ġvary Ċ Ġ* Ġacross Ġplatforms . ĠIn Ġgeneral , Ġupdates Ġwill Ġbe Ġreflected Ġimmediately Ġin - memory , Ġbut Ġwill Ġbe Ġpersisted Ġto Ġdisk Ċ Ġ* Ġasynchronously . Ċ Ġ* Ċ Ġ* ĠOperator Ġextensions Ġare Ġdefined Ġin Ġorder Ġto Ġsimplify Ġusage . ĠIn Ġaddition , Ġproperty Ġdeleg ates Ġare Ġprovided Ġfor Ġcleaner Ċ Ġ* Ġsyntax Ġand Ġbetter Ġtype - safety Ġwhen Ġinteracting Ġwith Ġvalues Ġstored Ġin Ġa Ġ` Settings ` Ġinstance . Ċ Ġ* Ċ Ġ* ĠOn Ġthe ĠiOS Ġand ĠmacOS Ġplatforms , Ġthis Ġclass Ġcan Ġbe Ġcreated Ġby Ġpassing Ġa Ġ[ NS User Defaults ] Ġinstance Ġwhich Ġwill Ġbe Ġused Ġas Ġa Ċ Ġ* Ġdelegate , Ġor Ġvia Ġa Ġ[ Factory ]. Ċ Ġ*/ Ċ @ Use Experimental ( Experimental Listener :: class ) Ċ public Ġclass ĠApple Settings Ġpublic Ġconstructor ( private Ġval Ġdelegate : ĠNS User Defaults ) Ġ: ĠObservable Settings Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġfactory Ġthat Ġcan Ġproduce Ġ[ Settings ] Ġinstances . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġclass Ġcan Ġonly Ġbe Ġinstantiated Ġvia Ġa Ġplatform - specific Ġconstructor . ĠIt 's Ġpurpose Ġis Ġso Ġthat Ġ` Settings ` ĊĠĠĠĠ Ġ* Ġobjects Ġcan Ġbe Ġcreated Ġin Ġcommon Ġcode , Ġso Ġthat Ġthe Ġonly Ġplatform - specific Ġbehavior Ġnecessary Ġin Ġorder Ġto Ġuse ĊĠĠĠĠ Ġ* Ġmultiple Ġ` Settings ` Ġobjects Ġis Ġthe Ġone - time Ġcreation Ġof Ġa Ġsingle Ġ` Factory `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠOn Ġthe ĠiOS Ġand ĠmacOS Ġplatforms , Ġthis Ġclass Ġcreates Ġ` Settings ` Ġobjects Ġbacked Ġby Ġ[ NS User Defaults ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġclass ĠFactory Ġ: ĠSettings . Factory Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġa Ġ[ Settings ] Ġobject Ġassociated Ġwith Ġthe Ġprovided Ġ[ name ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠMultiple Ġ` Settings ` Ġinstances Ġcreated Ġwith Ġthe Ġsame Ġ` name ` Ġparameter Ġwill Ġbe Ġbacked Ġby Ġthe Ġsame Ġpersistent ĊĠĠĠĠĠĠĠĠ Ġ* Ġdata , Ġwhile Ġdistinct Ġ` name ` s Ġwill Ġuse Ġdifferent Ġdata . ĠIf Ġ` name ` Ġis Ġ` null ` Ġthen Ġa Ġplatform - specific Ġdefault ĊĠĠĠĠĠĠĠĠ Ġ* Ġwill Ġbe Ġused . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠOn Ġthe ĠiOS Ġand ĠmacOS Ġplatforms , Ġthis Ġis Ġimplemented Ġby Ġcalling Ġ[ NS User Defaults . init ] Ġand Ġpassing Ġ[ name ]. ĠIf Ġ` name ` Ġis ĊĠĠĠĠĠĠĠĠ Ġ* Ġ` null ` Ġthen Ġ[ NS User Defaults . standard User Defaults ] Ġwill Ġbe Ġused Ġinstead . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcreate ( name : ĠString ?): ĠSettings Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelegate Ġ= Ġif Ġ( name Ġ== Ġnull ) ĠNS User Defaults . standard User Defaults Ġelse ĠNS User Defaults ( suite Name Ġ= Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠApple Settings ( delegate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġdelegate . dictionary Representation (). keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( key Ġas ĠString ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġremove ( key : ĠString ): ĠUnit Ġ= Ġdelegate . remove Object ForKey ( key ) ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġhas Key ( key : ĠString ): ĠBoolean Ġ= Ġdelegate . object ForKey ( key ) Ġ!= Ġnull ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġput Int ( key : ĠString , Ġvalue : ĠInt ): ĠUnit Ġ= Ġdelegate . set Integer ( value . convert (), Ġkey ) ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġget Int ( key : ĠString , ĠdefaultValue : ĠInt ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( has Key ( key )) Ġdelegate . integer ForKey ( key ). convert () Ġelse ĠdefaultValue ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġget Int OrNull ( key : ĠString ): ĠInt ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( has Key ( key )) Ġdelegate . integer ForKey ( key ). convert () Ġelse Ġnull ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġput Long ( key : ĠString , Ġvalue : ĠLong ): ĠUnit Ġ= Ġdelegate . set Integer ( value . convert (), Ġkey ) ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġget Long ( key : ĠString , ĠdefaultValue : ĠLong ): ĠLong Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( has Key ( key )) Ġdelegate . integer ForKey ( key ). convert () Ġelse ĠdefaultValue ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġget Long OrNull ( key : ĠString ): ĠLong ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( has Key ( key )) Ġdelegate . integer ForKey ( key ). convert () Ġelse Ġnull ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġput String ( key : ĠString , Ġvalue : ĠString ): ĠUnit Ġ= Ġdelegate . set Object ( value , Ġkey ) ĊĊĠĠĠ Ġpublic Ġoverride Ġfun ĠgetString ( key : ĠString , ĠdefaultValue : ĠString ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġdelegate . string ForKey ( key ) Ġ?: ĠdefaultValue ĊĊĠĠĠ Ġpublic Ġoverride Ġfun ĠgetString OrNull ( key : ĠString ): ĠString ? Ġ= Ġdelegate . string ForKey ( key ) ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġput Float ( key : ĠString , Ġvalue : ĠFloat ): ĠUnit Ġ= Ġdelegate . set Float ( value , Ġkey ) ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġget Float ( key : ĠString , ĠdefaultValue : ĠFloat ): ĠFloat Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( has Key ( key )) Ġdelegate . float ForKey ( key ) Ġelse ĠdefaultValue ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġget Float OrNull ( key : ĠString ): ĠFloat ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( has Key ( key )) Ġdelegate . float ForKey ( key ) Ġelse Ġnull ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġput Double ( key : ĠString , Ġvalue : ĠDouble ): ĠUnit Ġ= Ġdelegate . set Double ( value , Ġkey ) ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġget Double ( key : ĠString , ĠdefaultValue : ĠDouble ): ĠDouble Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( has Key ( key )) Ġdelegate . double ForKey ( key ) Ġelse ĠdefaultValue ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġget Double OrNull ( key : ĠString ): ĠDouble ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( has Key ( key )) Ġdelegate . double ForKey ( key ) Ġelse Ġnull ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġput Boolean ( key : ĠString , Ġvalue : ĠBoolean ): ĠUnit Ġ= Ġdelegate . set Bool ( value , Ġkey ) ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġget Boolean ( key : ĠString , ĠdefaultValue : ĠBoolean ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( has Key ( key )) Ġdelegate . bool ForKey ( key ) Ġelse ĠdefaultValue ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġget Boolean OrNull ( key : ĠString ): ĠBoolean ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( has Key ( key )) Ġdelegate . bool ForKey ( key ) Ġelse Ġnull ĊĊĠĠĠ Ġ@ Experimental Listener ĊĠĠĠ Ġpublic Ġoverride Ġfun Ġadd Listener ( key : ĠString , Ġcallback : Ġ() Ġ-> ĠUnit ): ĠSettings Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠListener . Cache ( delegate . object ForKey ( key )) ĊĊĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġ{ Ġ_: ĠNS Notification ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠ ĠWe 'll Ġget Ġcalled Ġhere Ġon Ġany Ġupdate Ġto Ġthe Ġunderlying ĠNS User Defaults Ġdelegate . ĠWe Ġuse Ġa Ġcache Ġto Ġdetermine ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhether Ġthe Ġvalue Ġat Ġthis Ġlistener 's Ġkey Ġchanged Ġbefore Ġcalling Ġthe Ġuser - supp lied Ġcallback . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Ġ= Ġcache . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġdelegate . object ForKey ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Ġ!= Ġcurrent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . value Ġ= Ġcurrent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= ĠNS Notification Center . default Center . add Observer For Name ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠNS User Defaults DidChange Notification , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` object ` Ġ= Ġdelegate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusing Block Ġ= Ġblock ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠListener ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Listener ĊĠĠĠ Ġpublic Ġoverride Ġfun Ġremove Listener ( listener : ĠSettings Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplatform Listener Ġ= Ġlistener Ġas ? ĠListener Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġlistener Delegate Ġ= Ġplatform Listener . delegate ĊĠĠĠĠĠĠĠ ĠNS Notification Center . default Center . remove Observer ( listener Delegate ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġhandle Ġto Ġa Ġlistener Ġinstance Ġcreated Ġin Ġ[ addListener ] Ġso Ġit Ġcan Ġbe Ġpassed Ġto Ġ[ remove Listener ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠOn Ġthe ĠiOS Ġand ĠmacOS Ġplatforms , Ġthis Ġis Ġa Ġwrapper Ġaround Ġthe Ġobject Ġreturned Ġby Ġ[ NS Notification Center . add Observer For Name ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Listener ĊĠĠĠ Ġpublic Ġclass ĠListener Ġinternal Ġconstructor ( internal Ġval Ġdelegate : ĠNSObject Protocol ) Ġ: ĠSettings Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġclass ĠCache ( var Ġvalue : ĠAny ?) ĊĠĠĠ Ġ} Ċ } Ċ