Coverage Summary for Class: PreferenceProperty (com.georgeci.moneysurfer.data.datastore.core)

Class Method, % Branch, % Line, % Instruction, %
PreferenceProperty 50% (3/6) 100% (2/2) 75% (9/12) 51.1% (46/90)
PreferenceProperty$get$$inlined$map$1 0% (0/2)
PreferenceProperty$get$$inlined$map$1$1
PreferenceProperty$get$$inlined$map$1$2 0% (0/1)
PreferenceProperty$get$$inlined$map$1$2$1
PreferenceProperty$remove$1
PreferenceProperty$remove$2 0% (0/1) 0% (0/1) 0% (0/6)
PreferenceProperty$set$1
PreferenceProperty$set$2 100% (1/1) 100% (1/1) 100% (7/7)
PreferenceProperty$special$$inlined$map$1 0% (0/2)
PreferenceProperty$special$$inlined$map$1$1
PreferenceProperty$special$$inlined$map$1$2 0% (0/1)
PreferenceProperty$special$$inlined$map$1$2$1
PreferenceProperty$update$1
PreferenceProperty$update$2 0% (0/1) 0% (0/2) 0% (0/2) 0% (0/21)
Total 26.7% (4/15) 50% (2/4) 62.5% (10/16) 42.7% (53/124)


 package com.georgeci.moneysurfer.data.datastore.core
 
 import androidx.datastore.core.DataStore
 import androidx.datastore.preferences.core.MutablePreferences
 import androidx.datastore.preferences.core.Preferences
 import androidx.datastore.preferences.core.booleanPreferencesKey
 import androidx.datastore.preferences.core.doublePreferencesKey
 import androidx.datastore.preferences.core.edit
 import androidx.datastore.preferences.core.floatPreferencesKey
 import androidx.datastore.preferences.core.intPreferencesKey
 import androidx.datastore.preferences.core.longPreferencesKey
 import androidx.datastore.preferences.core.stringPreferencesKey
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.map
 
 class PreferenceStore(
     private val dataStore: DataStore<Preferences>,
 ) {
 
     fun boolean(name: String, default: Boolean = false): PreferenceProperty<Boolean> =
         PreferenceProperty(dataStore, booleanPreferencesKey(name), default)
 
     fun int(name: String, default: Int = 0): PreferenceProperty<Int> =
         PreferenceProperty(dataStore, intPreferencesKey(name), default)
 
     fun long(name: String, default: Long = 0L): PreferenceProperty<Long> =
         PreferenceProperty(dataStore, longPreferencesKey(name), default)
 
     fun float(name: String, default: Float = 0f): PreferenceProperty<Float> =
         PreferenceProperty(dataStore, floatPreferencesKey(name), default)
 
     fun double(name: String, default: Double = 0.0): PreferenceProperty<Double> =
         PreferenceProperty(dataStore, doublePreferencesKey(name), default)
 
     fun string(name: String, default: String = ""): PreferenceProperty<String> =
         PreferenceProperty(dataStore, stringPreferencesKey(name), default)
 
     fun <T> custom(
         key: Preferences.Key<T>,
         default: T,
     ): PreferenceProperty<T> =
         PreferenceProperty(dataStore, key, default)
 
     /**
      * Writes several keys in one DataStore edit. A group whose members must move together — the
      * session pointers on logout — cannot be written as N separate `set` calls, or a crash in
      * between leaves the group half-updated.
      */
     suspend fun edit(transform: (MutablePreferences) -> Unit) {
         dataStore.edit(transform)
     }
 }
 
 class PreferenceProperty<T>(
     private val dataStore: DataStore<Preferences>,
     /** Exposed so a caller can include this property in a multi-key [PreferenceStore.edit]. */
     val key: Preferences.Key<T>,
     private val default: T,
 ) {
     val flow: Flow<T> =
         dataStore.data
             .map { preferences -> preferences[key] ?: default }
             .distinctUntilChanged()
 
     suspend fun get(): T =
         dataStore.data.map { it[key] ?: default }.first()
 
     suspend fun set(value: T) {
         dataStore.edit { preferences ->
             preferences[key] = value
         }
     }
 
     suspend fun update(transform: (T) -> T) {
         dataStore.edit { preferences ->
             val oldValue = preferences[key] ?: default
             preferences[key] = transform(oldValue)
         }
     }
 
     suspend fun remove() {
         dataStore.edit { preferences ->
             preferences.remove(key)
         }
     }
 }