Refactor unit objects

This commit is contained in:
Sad Ellie 2023-09-15 09:51:17 +03:00
parent ef08a31dff
commit 66f1c965d7
9 changed files with 248 additions and 126 deletions

View File

@ -32,6 +32,17 @@ interface AbstractUnit {
val isFavorite: Boolean val isFavorite: Boolean
val pairId: String? val pairId: String?
val counter: Int val counter: Int
fun clone(
id: String = this.id,
basicUnit: BigDecimal = this.basicUnit,
group: UnitGroup = this.group,
displayName: Int = this.displayName,
shortName: Int = this.shortName,
isFavorite: Boolean = this.isFavorite,
pairId: String? = this.pairId,
counter: Int = this.counter,
): AbstractUnit
} }
fun Sequence<AbstractUnit>.filterByLev(stringA: String, context: Context): Sequence<AbstractUnit> { fun Sequence<AbstractUnit>.filterByLev(stringA: String, context: Context): Sequence<AbstractUnit> {

View File

@ -53,4 +53,24 @@ data class FuelBackward(
else -> BigDecimal.ZERO else -> BigDecimal.ZERO
} }
} }
override fun clone(
id: String,
basicUnit: BigDecimal,
group: UnitGroup,
displayName: Int,
shortName: Int,
isFavorite: Boolean,
pairId: String?,
counter: Int,
): FuelBackward = copy(
id = id,
basicUnit = basicUnit,
group = group,
displayName = displayName,
shortName = shortName,
isFavorite = isFavorite,
pairId = pairId,
counter = counter,
)
} }

View File

@ -52,4 +52,24 @@ data class FuelForward(
else -> BigDecimal.ZERO else -> BigDecimal.ZERO
} }
} }
override fun clone(
id: String,
basicUnit: BigDecimal,
group: UnitGroup,
displayName: Int,
shortName: Int,
isFavorite: Boolean,
pairId: String?,
counter: Int,
): FuelForward = copy(
id = id,
basicUnit = basicUnit,
group = group,
displayName = displayName,
shortName = shortName,
isFavorite = isFavorite,
pairId = pairId,
counter = counter,
)
} }

View File

@ -43,4 +43,24 @@ data class NormalUnit(
.multiply(value) .multiply(value)
.div(unitTo.basicUnit) .div(unitTo.basicUnit)
} }
override fun clone(
id: String,
basicUnit: BigDecimal,
group: UnitGroup,
displayName: Int,
shortName: Int,
isFavorite: Boolean,
pairId: String?,
counter: Int,
): NormalUnit = copy(
id = id,
basicUnit = basicUnit,
group = group,
displayName = displayName,
shortName = shortName,
isFavorite = isFavorite,
pairId = pairId,
counter = counter,
)
} }

View File

@ -34,4 +34,24 @@ data class NumberBaseUnit(
fun convert(toBase: NumberBaseUnit, input: String): String { fun convert(toBase: NumberBaseUnit, input: String): String {
return input.toBigInteger(basicUnit.intValueExact()).toString(toBase.basicUnit.intValueExact()) return input.toBigInteger(basicUnit.intValueExact()).toString(toBase.basicUnit.intValueExact())
} }
override fun clone(
id: String,
basicUnit: BigDecimal,
group: UnitGroup,
displayName: Int,
shortName: Int,
isFavorite: Boolean,
pairId: String?,
counter: Int,
): NumberBaseUnit = copy(
id = id,
basicUnit = basicUnit,
group = group,
displayName = displayName,
shortName = shortName,
isFavorite = isFavorite,
pairId = pairId,
counter = counter,
)
} }

View File

@ -41,4 +41,24 @@ data class ReverseUnit(
.div(this.basicUnit) .div(this.basicUnit)
.multiply(value) .multiply(value)
} }
override fun clone(
id: String,
basicUnit: BigDecimal,
group: UnitGroup,
displayName: Int,
shortName: Int,
isFavorite: Boolean,
pairId: String?,
counter: Int,
): ReverseUnit = copy(
id = id,
basicUnit = basicUnit,
group = group,
displayName = displayName,
shortName = shortName,
isFavorite = isFavorite,
pairId = pairId,
counter = counter,
)
} }

View File

@ -0,0 +1,56 @@
/*
* Unitto is a unit converter for Android
* Copyright (c) 2023 Elshan Agaev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.sadellie.unitto.data.model.unit
import com.sadellie.unitto.data.model.UnitGroup
import java.math.BigDecimal
data class TemperatureUnit(
override val id: String,
override val basicUnit: BigDecimal,
override val group: UnitGroup,
override val displayName: Int,
override val shortName: Int,
override val isFavorite: Boolean = false,
override val pairId: String? = null,
override val counter: Int = 0,
val customConvert: (unitTo: DefaultUnit, value: BigDecimal) -> BigDecimal
): DefaultUnit {
override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal = customConvert(unitTo, value)
override fun clone(
id: String,
basicUnit: BigDecimal,
group: UnitGroup,
displayName: Int,
shortName: Int,
isFavorite: Boolean,
pairId: String?,
counter: Int,
): TemperatureUnit = copy(
id = id,
basicUnit = basicUnit,
group = group,
displayName = displayName,
shortName = shortName,
isFavorite = isFavorite,
pairId = pairId,
counter = counter,
)
}

View File

@ -27,10 +27,6 @@ import com.sadellie.unitto.data.database.UnitsEntity
import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.UnitGroup
import com.sadellie.unitto.data.model.UnitsListSorting import com.sadellie.unitto.data.model.UnitsListSorting
import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.AbstractUnit
import com.sadellie.unitto.data.model.unit.FuelBackward
import com.sadellie.unitto.data.model.unit.FuelForward
import com.sadellie.unitto.data.model.unit.NormalUnit
import com.sadellie.unitto.data.model.unit.NumberBaseUnit
import com.sadellie.unitto.data.model.unit.ReverseUnit import com.sadellie.unitto.data.model.unit.ReverseUnit
import com.sadellie.unitto.data.model.unit.filterByLev import com.sadellie.unitto.data.model.unit.filterByLev
import com.sadellie.unitto.data.units.collections.accelerationCollection import com.sadellie.unitto.data.units.collections.accelerationCollection
@ -113,40 +109,13 @@ class UnitsRepository @Inject constructor(
.mapLatest { basedList -> .mapLatest { basedList ->
basedList.forEach { based -> basedList.forEach { based ->
// Have to use a copy so that composable can detect changes // Have to use a copy so that composable can detect changes
val updatedUnit = when (val foundUnit = getById(based.unitId)) { val updatedUnit = getById(based.unitId)
is NormalUnit -> foundUnit.copy( .clone(
isFavorite = based.isFavorite, isFavorite = based.isFavorite,
counter = based.frequency, counter = based.frequency,
pairId = based.pairedUnitId pairId = based.pairedUnitId
) )
is NumberBaseUnit -> foundUnit.copy(
isFavorite = based.isFavorite,
counter = based.frequency,
pairId = based.pairedUnitId
)
is ReverseUnit -> foundUnit.copy(
isFavorite = based.isFavorite,
counter = based.frequency,
pairId = based.pairedUnitId
)
is FuelForward -> foundUnit.copy(
isFavorite = based.isFavorite,
counter = based.frequency,
pairId = based.pairedUnitId
)
is FuelBackward -> foundUnit.copy(
isFavorite = based.isFavorite,
counter = based.frequency,
pairId = based.pairedUnitId
)
else -> return@forEach
}
myUnits.update { units -> myUnits.update { units ->
units.replace(updatedUnit) { it.id == updatedUnit.id } units.replace(updatedUnit) { it.id == updatedUnit.id }
} }

View File

@ -22,27 +22,21 @@ import com.sadellie.unitto.core.base.MAX_PRECISION
import com.sadellie.unitto.core.base.R import com.sadellie.unitto.core.base.R
import com.sadellie.unitto.data.model.UnitGroup import com.sadellie.unitto.data.model.UnitGroup
import com.sadellie.unitto.data.model.unit.AbstractUnit import com.sadellie.unitto.data.model.unit.AbstractUnit
import com.sadellie.unitto.data.model.unit.DefaultUnit import com.sadellie.unitto.data.model.unit.TemperatureUnit
import com.sadellie.unitto.data.units.MyUnitIDS import com.sadellie.unitto.data.units.MyUnitIDS
import java.math.BigDecimal import java.math.BigDecimal
import java.math.RoundingMode import java.math.RoundingMode
internal val temperatureCollection: List<AbstractUnit> by lazy { internal val temperatureCollection: List<AbstractUnit> by lazy {
listOf(Celsius, Fahrenheit, Kelvin) listOf(
} TemperatureUnit(
id = MyUnitIDS.celsius,
private data object Celsius : DefaultUnit { basicUnit = BigDecimal.ONE,
override val id: String = MyUnitIDS.celsius group = UnitGroup.TEMPERATURE,
override val basicUnit: BigDecimal = BigDecimal.ONE displayName = R.string.celsius,
override val group: UnitGroup = UnitGroup.TEMPERATURE shortName = R.string.celsius_short,
override val displayName: Int = R.string.celsius customConvert = { unitTo, value ->
override val shortName: Int = R.string.celsius_short when (unitTo.id) {
override val isFavorite: Boolean = false
override val pairId: String? = null
override val counter: Int = 0
override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal {
return when (unitTo.id) {
MyUnitIDS.fahrenheit -> { MyUnitIDS.fahrenheit -> {
value value
.setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN)
@ -59,20 +53,15 @@ private data object Celsius : DefaultUnit {
else -> value else -> value
} }
} }
} ),
TemperatureUnit(
private data object Fahrenheit : DefaultUnit { id = MyUnitIDS.fahrenheit,
override val id: String = MyUnitIDS.fahrenheit basicUnit = BigDecimal.ONE,
override val basicUnit: BigDecimal = BigDecimal.ONE group = UnitGroup.TEMPERATURE,
override val group: UnitGroup = UnitGroup.TEMPERATURE displayName = R.string.fahrenheit,
override val displayName: Int = R.string.fahrenheit shortName = R.string.fahrenheit_short,
override val shortName: Int = R.string.fahrenheit_short customConvert = { unitTo, value ->
override val isFavorite: Boolean = false when (unitTo.id) {
override val pairId: String? = null
override val counter: Int = 0
override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal {
return when (unitTo.id) {
MyUnitIDS.celsius -> { MyUnitIDS.celsius -> {
value value
.setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN)
@ -91,20 +80,15 @@ private data object Fahrenheit : DefaultUnit {
else -> value else -> value
} }
} }
} ),
TemperatureUnit(
private data object Kelvin : DefaultUnit { id = MyUnitIDS.kelvin,
override val id: String = MyUnitIDS.kelvin basicUnit = BigDecimal.ONE,
override val basicUnit: BigDecimal = BigDecimal.ONE group = UnitGroup.TEMPERATURE,
override val group: UnitGroup = UnitGroup.TEMPERATURE displayName = R.string.kelvin,
override val displayName: Int = R.string.kelvin shortName = R.string.kelvin_short,
override val shortName: Int = R.string.kelvin_short customConvert = { unitTo, value ->
override val isFavorite: Boolean = false when (unitTo.id) {
override val pairId: String? = null
override val counter: Int = 0
override fun convert(unitTo: DefaultUnit, value: BigDecimal): BigDecimal {
return when (unitTo.id) {
MyUnitIDS.celsius -> { MyUnitIDS.celsius -> {
value value
.setScale(MAX_PRECISION, RoundingMode.HALF_EVEN) .setScale(MAX_PRECISION, RoundingMode.HALF_EVEN)
@ -120,4 +104,6 @@ private data object Kelvin : DefaultUnit {
else -> value else -> value
} }
} }
),
)
} }