Skip to content

Commit 28299cf

Browse files
committed
refactor: move distribution related stuff to the separate package
1 parent 549548f commit 28299cf

File tree

10 files changed

+48
-47
lines changed

10 files changed

+48
-47
lines changed

demo/src/main/java/io/monstarlab/mosaic/features/SliderDemo.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ import androidx.compose.ui.graphics.Color
3737
import androidx.compose.ui.text.style.TextAlign
3838
import androidx.compose.ui.tooling.preview.Preview
3939
import androidx.compose.ui.unit.dp
40-
import io.monstarlab.mosaic.slider.FragmentedLinearDistribution
40+
import io.monstarlab.mosaic.slider.distribution.FragmentedLinearDistribution
4141
import io.monstarlab.mosaic.slider.Slider
4242
import io.monstarlab.mosaic.slider.SliderColors
43-
import io.monstarlab.mosaic.slider.SliderValueDistribution
43+
import io.monstarlab.mosaic.slider.distribution.SliderValueDistribution
4444
import kotlin.math.roundToInt
4545
import androidx.compose.material3.Slider as MaterialSlider
4646

slider/src/main/java/io/monstarlab/mosaic/slider/Slider.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import androidx.compose.ui.graphics.Color
1515
import androidx.compose.ui.platform.LocalLayoutDirection
1616
import androidx.compose.ui.tooling.preview.Preview
1717
import androidx.compose.ui.unit.LayoutDirection
18+
import io.monstarlab.mosaic.slider.distribution.SliderValueDistribution
1819

1920
/**
2021
* A composable function that creates a slider UI component.

slider/src/main/java/io/monstarlab/mosaic/slider/SliderState.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import androidx.compose.runtime.mutableStateOf
1111
import androidx.compose.runtime.remember
1212
import androidx.compose.runtime.setValue
1313
import androidx.compose.ui.geometry.Offset
14+
import io.monstarlab.mosaic.slider.distribution.SliderValueDistribution
1415
import kotlinx.coroutines.coroutineScope
1516

1617
/**

slider/src/main/java/io/monstarlab/mosaic/slider/ValueCheckPointDistribution.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package io.monstarlab.mosaic.slider
22

3+
import io.monstarlab.mosaic.slider.distribution.LinearEquation
4+
import io.monstarlab.mosaic.slider.distribution.RangedLinearEquation
5+
import io.monstarlab.mosaic.slider.distribution.SliderValueDistribution
6+
37
public class ValueCheckPointDistribution(valuesMap: List<Pair<Float, Float>>) :
48
SliderValueDistribution {
59

slider/src/main/java/io/monstarlab/mosaic/slider/FragmentedLinearDistribution.kt renamed to slider/src/main/java/io/monstarlab/mosaic/slider/distribution/FragmentedLinearDistribution.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
package io.monstarlab.mosaic.slider
1+
package io.monstarlab.mosaic.slider.distribution
2+
3+
import io.monstarlab.mosaic.slider.fractionToValue
4+
import io.monstarlab.mosaic.slider.valueToFraction
25

36
//TODO refactor code to not use builder
47
public class FragmentedLinearDistribution private constructor(

slider/src/main/java/io/monstarlab/mosaic/slider/LinearEquation.kt renamed to slider/src/main/java/io/monstarlab/mosaic/slider/distribution/LinearEquation.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.monstarlab.mosaic.slider
1+
package io.monstarlab.mosaic.slider.distribution
22

33
public data class LinearEquation(
44
private val m: Float,
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package io.monstarlab.mosaic.slider.distribution
2+
3+
import kotlin.math.sqrt
4+
5+
/**
6+
* Represents a parabolic distribution strategy for slider values.
7+
*
8+
* This strategy calculates interpolated and inversely interpolated values based on a parabolic equation:
9+
* f(x) = a * x^2 + b * x + c
10+
*
11+
* @property a coefficient of the x^2 term in the parabolic equation
12+
* @property b coefficient of the x term in the parabolic equation
13+
* @property c constant term in the parabolic equation
14+
* @constructor Creates a ParabolicValueDistribution with the given coefficients.
15+
*/
16+
public class ParabolicValueDistribution(
17+
private val a: Float,
18+
private val b: Float,
19+
private val c: Float,
20+
) : SliderValueDistribution {
21+
22+
override fun inverse(value: Float): Float {
23+
if (value == 0f) return 0f
24+
25+
val d = (b * b) - 4 * a * (c - value)
26+
return (-b + sqrt(d)) / (2 * a)
27+
}
28+
29+
override fun interpolate(value: Float): Float {
30+
return a * (value * value) + b * value + c
31+
}
32+
}

slider/src/main/java/io/monstarlab/mosaic/slider/RangedLinearEquation.kt renamed to slider/src/main/java/io/monstarlab/mosaic/slider/distribution/RangedLinearEquation.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.monstarlab.mosaic.slider
1+
package io.monstarlab.mosaic.slider.distribution
22

33
public data class RangedLinearEquation(
44
val equation: LinearEquation,

slider/src/main/java/io/monstarlab/mosaic/slider/SliderValueDistribution.kt renamed to slider/src/main/java/io/monstarlab/mosaic/slider/distribution/SliderValueDistribution.kt

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.monstarlab.mosaic.slider
1+
package io.monstarlab.mosaic.slider.distribution
22

33
import androidx.annotation.FloatRange
44
import kotlin.math.sqrt
@@ -59,44 +59,3 @@ public interface SliderValueDistribution {
5959
}
6060
}
6161
}
62-
63-
internal fun SliderValueDistribution.interpolate(
64-
range: ClosedFloatingPointRange<Float>,
65-
): ClosedFloatingPointRange<Float> {
66-
return interpolate(range.start)..interpolate(range.endInclusive)
67-
}
68-
69-
internal fun SliderValueDistribution.inverse(
70-
range: ClosedFloatingPointRange<Float>,
71-
): ClosedFloatingPointRange<Float> {
72-
return inverse(range.start)..inverse(range.endInclusive)
73-
}
74-
75-
/**
76-
* Represents a parabolic distribution strategy for slider values.
77-
*
78-
* This strategy calculates interpolated and inversely interpolated values based on a parabolic equation:
79-
* f(x) = a * x^2 + b * x + c
80-
*
81-
* @property a coefficient of the x^2 term in the parabolic equation
82-
* @property b coefficient of the x term in the parabolic equation
83-
* @property c constant term in the parabolic equation
84-
* @constructor Creates a ParabolicValueDistribution with the given coefficients.
85-
*/
86-
public class ParabolicValueDistribution(
87-
private val a: Float,
88-
private val b: Float,
89-
private val c: Float,
90-
) : SliderValueDistribution {
91-
92-
override fun inverse(value: Float): Float {
93-
if (value == 0f) return 0f
94-
95-
val d = (b * b) - 4 * a * (c - value)
96-
return (-b + sqrt(d)) / (2 * a)
97-
}
98-
99-
override fun interpolate(value: Float): Float {
100-
return a * (value * value) + b * value + c
101-
}
102-
}

slider/src/test/java/io/monstarlab/mosaic/slider/FragmentedLinearDistributionTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.monstarlab.mosaic.slider
22

3+
import io.monstarlab.mosaic.slider.distribution.FragmentedLinearDistribution
34
import org.junit.After
45
import org.junit.Assert.assertEquals
56
import org.junit.Assert.assertNotEquals

0 commit comments

Comments
 (0)