Updated on 2026-08-14
This commit is contained in:
parent
bd699c5bd9
commit
ef5d0fec78
40 changed files with 600 additions and 642 deletions
|
|
@ -1,6 +1,8 @@
|
|||
package com.tangem.data.quotes.di
|
||||
|
||||
import com.tangem.data.quotes.multi.DefaultMultiQuoteStatusProducer
|
||||
import com.tangem.data.quotes.single.DefaultSingleQuoteStatusProducer
|
||||
import com.tangem.domain.quotes.multi.MultiQuoteStatusProducer
|
||||
import com.tangem.domain.quotes.single.SingleQuoteStatusProducer
|
||||
import dagger.Binds
|
||||
import dagger.Module
|
||||
|
|
@ -17,4 +19,10 @@ internal interface QuoteStatusProducerFactoryModule {
|
|||
fun bindSingleQuoteStatusProducerFactory(
|
||||
impl: DefaultSingleQuoteStatusProducer.Factory,
|
||||
): SingleQuoteStatusProducer.Factory
|
||||
|
||||
@Binds
|
||||
@Singleton
|
||||
fun bindMultiQuoteStatusProducerFactory(
|
||||
impl: DefaultMultiQuoteStatusProducer.Factory,
|
||||
): MultiQuoteStatusProducer.Factory
|
||||
}
|
||||
|
|
@ -1,5 +1,7 @@
|
|||
package com.tangem.data.quotes.di
|
||||
|
||||
import com.tangem.domain.quotes.multi.MultiQuoteStatusProducer
|
||||
import com.tangem.domain.quotes.multi.MultiQuoteStatusSupplier
|
||||
import com.tangem.domain.quotes.single.SingleQuoteStatusProducer
|
||||
import com.tangem.domain.quotes.single.SingleQuoteStatusSupplier
|
||||
import dagger.Module
|
||||
|
|
@ -20,4 +22,13 @@ internal object QuoteStatusSupplierModule {
|
|||
keyCreator = { "single_quote_${it.rawCurrencyId.value}" },
|
||||
) {}
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideMultiQuoteStatusSupplier(factory: MultiQuoteStatusProducer.Factory): MultiQuoteStatusSupplier {
|
||||
return object : MultiQuoteStatusSupplier(
|
||||
factory = factory,
|
||||
keyCreator = { "multi_quote_status_supplier" },
|
||||
) {}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
package com.tangem.data.quotes.multi
|
||||
|
||||
import arrow.core.Option
|
||||
import arrow.core.none
|
||||
import com.tangem.data.quotes.store.QuotesStatusesStore
|
||||
import com.tangem.domain.core.flow.FlowProducerTools
|
||||
import com.tangem.domain.models.currency.CryptoCurrency
|
||||
import com.tangem.domain.models.quote.QuoteStatus
|
||||
import com.tangem.domain.quotes.multi.MultiQuoteStatusProducer
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedFactory
|
||||
import dagger.assisted.AssistedInject
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.flowOn
|
||||
import kotlinx.coroutines.flow.map
|
||||
|
||||
internal class DefaultMultiQuoteStatusProducer @AssistedInject constructor(
|
||||
@Assisted val params: Unit,
|
||||
override val flowProducerTools: FlowProducerTools,
|
||||
private val quotesStatusesStore: QuotesStatusesStore,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
) : MultiQuoteStatusProducer {
|
||||
|
||||
override val fallback: Option<Map<CryptoCurrency.RawID, QuoteStatus>> = none()
|
||||
|
||||
override fun produce(): Flow<Map<CryptoCurrency.RawID, QuoteStatus>> {
|
||||
return quotesStatusesStore.get()
|
||||
.map { statuses -> statuses.associateBy(QuoteStatus::rawCurrencyId) }
|
||||
.flowOn(dispatchers.default)
|
||||
}
|
||||
|
||||
@AssistedFactory
|
||||
interface Factory : MultiQuoteStatusProducer.Factory {
|
||||
override fun create(params: Unit): DefaultMultiQuoteStatusProducer
|
||||
}
|
||||
}
|
||||
|
|
@ -3,6 +3,7 @@ package com.tangem.data.quotes.single
|
|||
import arrow.core.Option
|
||||
import arrow.core.some
|
||||
import com.tangem.data.quotes.store.QuotesStatusesStore
|
||||
import com.tangem.domain.core.flow.FlowProducerTools
|
||||
import com.tangem.domain.models.quote.QuoteStatus
|
||||
import com.tangem.domain.quotes.single.SingleQuoteStatusProducer
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
|
|
@ -10,7 +11,6 @@ import dagger.assisted.Assisted
|
|||
import dagger.assisted.AssistedFactory
|
||||
import dagger.assisted.AssistedInject
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.flow.flowOn
|
||||
import kotlinx.coroutines.flow.mapNotNull
|
||||
|
||||
|
|
@ -22,6 +22,7 @@ import kotlinx.coroutines.flow.mapNotNull
|
|||
*/
|
||||
internal class DefaultSingleQuoteStatusProducer @AssistedInject constructor(
|
||||
@Assisted val params: SingleQuoteStatusProducer.Params,
|
||||
override val flowProducerTools: FlowProducerTools,
|
||||
private val quotesStatusesStore: QuotesStatusesStore,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
) : SingleQuoteStatusProducer {
|
||||
|
|
@ -32,7 +33,6 @@ internal class DefaultSingleQuoteStatusProducer @AssistedInject constructor(
|
|||
override fun produce(): Flow<QuoteStatus> {
|
||||
return quotesStatusesStore.get()
|
||||
.mapNotNull { quotes -> quotes.firstOrNull { it.rawCurrencyId == params.rawCurrencyId } ?: default }
|
||||
.distinctUntilChanged()
|
||||
.flowOn(dispatchers.default)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.tangem.data.quotes.single
|
|||
|
||||
import com.google.common.truth.Truth
|
||||
import com.tangem.data.quotes.store.QuotesStatusesStore
|
||||
import com.tangem.domain.core.flow.FlowProducerTools
|
||||
import com.tangem.domain.models.StatusSource
|
||||
import com.tangem.domain.models.currency.CryptoCurrency
|
||||
import com.tangem.domain.models.quote.QuoteStatus
|
||||
|
|
@ -26,10 +27,12 @@ internal class DefaultSingleQuoteStatusProducerTest {
|
|||
)
|
||||
|
||||
private val quotesStore = mockk<QuotesStatusesStore>()
|
||||
private val flowProducerTools: FlowProducerTools = mockk()
|
||||
|
||||
private val producer = DefaultSingleQuoteStatusProducer(
|
||||
params = params,
|
||||
quotesStatusesStore = quotesStore,
|
||||
flowProducerTools = flowProducerTools,
|
||||
dispatchers = TestingCoroutineDispatcherProvider(),
|
||||
)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue