1
1
package com.lukaslechner.coroutineusecasesonandroid.usecases.coroutines.usecase12
2
2
3
- import com.lukaslechner.coroutineusecasesonandroid.utils.addCoroutineDebugInfo
4
- import kotlinx.coroutines.*
5
- import timber.log.Timber
3
+ import kotlinx.coroutines.CoroutineDispatcher
4
+ import kotlinx.coroutines.Dispatchers
6
5
import java.math.BigInteger
7
6
8
7
class FactorialCalculator (
9
8
private val defaultDispatcher : CoroutineDispatcher = Dispatchers .Default
10
9
) {
11
10
12
- suspend fun calculateFactorial (
11
+ fun calculateFactorial (
13
12
factorialOf : Int ,
14
13
numberOfCoroutines : Int
15
14
): BigInteger {
16
- return withContext(defaultDispatcher) {
17
- val subRanges = createSubRangeList(factorialOf, numberOfCoroutines)
18
- subRanges.map { subRange ->
19
- async {
20
- calculateFactorialOfSubRange(subRange)
21
- }
22
- }.awaitAll()
23
- .fold(BigInteger .ONE , { acc, element ->
24
- ensureActive()
25
- acc.multiply(element)
26
- })
27
- }
15
+
16
+ // TODO: create sub range list *on background thread*
17
+ val subRanges = createSubRangeList(factorialOf, numberOfCoroutines)
18
+
19
+
20
+ // TODO: calculate factorial of each subrange in separate coroutine
21
+ // use calculateFactorialOfSubRange(subRange) therefore
22
+
23
+
24
+ // TODO: create factorial result by multiplying all sub-results and return this
25
+ // result
26
+
27
+ return BigInteger .ZERO
28
28
}
29
29
30
- suspend fun calculateFactorialOfSubRange (
30
+ // TODO: execute on background thread
31
+ fun calculateFactorialOfSubRange (
31
32
subRange : SubRange
32
33
): BigInteger {
33
- return withContext(defaultDispatcher) {
34
- Timber .d(addCoroutineDebugInfo(" Calculate factorial of $subRange " ))
35
- var factorial = BigInteger .ONE
36
- for (i in subRange.start.. subRange.end) {
37
- ensureActive()
38
- factorial = factorial.multiply(BigInteger .valueOf(i.toLong()))
39
- }
40
- factorial
34
+ var factorial = BigInteger .ONE
35
+ for (i in subRange.start.. subRange.end) {
36
+ factorial = factorial.multiply(BigInteger .valueOf(i.toLong()))
41
37
}
38
+ return factorial
42
39
}
43
40
44
41
fun createSubRangeList (
@@ -63,4 +60,5 @@ class FactorialCalculator(
63
60
}
64
61
}
65
62
63
+
66
64
data class SubRange (val start : Int , val end : Int )
0 commit comments