Automatic CoroutineDispatcher injection and extensions for kotlinx.coroutines

Related tags

Kotlin Dispatch
Overview

CI License

Dispatch

Utilities for kotlinx.coroutines which make them type-safe, easier to test, and more expressive. Use the predefined types and factories or define your own, and never inject a Dispatchers object again.

val presenter = MyPresenter(MainCoroutineScope())

class MyPresenter @Inject constructor(
  /**
  * Defaults to the Main dispatcher
  */
  val coroutineScope: MainCoroutineScope
) {

  fun loopSomething() = coroutineScope.launchDefault {  }

  suspend fun updateSomething() = withMainImmediate {  }
}
class MyTest {

  @Test
  fun `no setting the main dispatcher`() = runBlockingProvidedTest {

    // automatically use TestCoroutineDispatcher for every dispatcher type
    val presenter = MyPresenter(coroutineScope = this)

    // this call would normally crash due to the main looper
    presenter.updateSomething()
  }

}

Contents

Injecting dispatchers

Everywhere you use coroutines, you use a CoroutineContext. If we embed the CoroutineDispatchers settings we want into the context, then we don't need to pass them around manually.

The core of this library is DispatcherProvider - an interface with properties corresponding to the 5 different CoroutineDispatchers we can get from the Dispatchers singleton. It lives inside the CoroutineContext, and gets passed from parent to child coroutines transparently without any additional code.

interface DispatcherProvider : CoroutineContext.Element {

  override val key: CoroutineContext.Key<*> get() = Key

  val default: CoroutineDispatcher
  val io: CoroutineDispatcher
  val main: CoroutineDispatcher
  val mainImmediate: CoroutineDispatcher
  val unconfined: CoroutineDispatcher

  companion object Key : CoroutineContext.Key<DispatcherProvider>
}

val someCoroutineScope = CoroutineScope(
  Job() + Dispatchers.Main + DispatcherProvider()
)

The default implementation of this interface simply delegates to that Dispatchers singleton, as that is what we typically want for production usage.

Types and Factories

A CoroutineScope may have any type of CoroutineDispatcher. What if we have a View class which will always use the Main thread, or one which will always do I/O?

There are marker interfaces and factories to ensure that the correct type of CoroutineScope is always used.

Type Dispatcher
DefaultCoroutineScope Dispatchers.Default
IOCoroutineScope Dispatchers.IO
MainCoroutineScope Dispatchers.Main
MainImmediateCoroutineScope Dispatchers.Main.immediate
UnconfinedCoroutineScope Dispatchers.Unconfined
val mainScope = MainCoroutineScope()

val someUIClass = SomeUIClass(mainScope)

class SomeUIClass(val coroutineScope: MainCoroutineScope) {

  fun foo() = coroutineScope.launch {
    // because of the dependency type,
    // we're guaranteed to be on the main dispatcher even though we didn't specify it
  }

}

Referencing dispatchers

These dispatcher settings can then be accessed via extension functions upon CoroutineScope, or the coroutineContext, or directly from extension functions:

Builder Extensions

| | Default | IO | Main | Main.immediate | ** Unconfined** | | ------------ | --------------- | ---------- | ------------ | --------------------- | ------------------ | | Job | launchDefault | launchIO | launchMain | launchMainImmediate | launchUnconfined | Deferred | asyncDefault | asyncIO | asyncMain | asyncMainImmediate | asyncUnconfined | suspend T | withDefault | withIO | withMain | withMainImmediate | withUnconfined | Flow<T> | flowOnDefault | flowOnIO | flowOnMain | flowOnMainImmediate | flowOnUnconfined

class MyClass(val coroutineScope: IOCoroutineScope) {

  fun accessMainThread() = coroutineScope.launchMain {
    // we're now on the "main" thread as defined by the interface
  }

}

Android Lifecycle

The AndroidX.lifecycle library offers a lifecycleScope extension function to provide a lifecycle-aware CoroutineScope, but there are two shortcomings:

  1. It delegates to a hard-coded Dispatchers.Main CoroutineDispatcher, which complicates unit and Espresso testing by requiring the use of Dispatchers.setMain.
  2. It pauses the dispatcher when the lifecycle state passes below its threshold, which leaks backpressure to the producing coroutine and can create deadlocks.

Dispatch-android-lifecycle and dispatch-android-lifecycle-extensions completely replace the AndroidX version.

import dispatch.android.lifecycle.*
import dispatch.core.*
import kotlinx.coroutines.flow.*

class MyActivity : Activity() {

  init {
    dispatchLifecycleScope.launchOnCreate {
          viewModel.someFlow.collect {
            channel.send("$it")
          }
        }
  }
}

The DispatchLifecycleScope may be configured with any dispatcher, since MainImmediateCoroutineScope is just a marker interface. Its lifecycle-aware functions cancel when dropping below a threshold, then automatically restart when entering into the desired lifecycle state again. This is key to preventing the backpressure leak of the AndroidX version, and it's also more analogous to the behavior of LiveData to which many developers are accustomed.

There are two built-in ways to define a custom LifecycleCoroutineScope - by simply constructing one directly inside a Lifecycle class, or by statically setting a custom LifecycleScopeFactory. This second option can be very useful when utilizing an IdlingCoroutineScope.

Android Espresso

Espresso is able to use IdlingResource to infer when it should perform its actions, which helps to reduce the flakiness of tests. Conventional thread-based IdlingResource implementations don't work with coroutines, however.

IdlingCoroutineScope utilizes IdlingDispatchers, which count a coroutine as being "idle" when it is suspended. Using statically defined factories, service locators, or dependency injection, it is possible to utilize idling-aware dispatchers throughout a codebase during Espresso testing.

class IdlingCoroutineScopeRuleWithLifecycleSample {


  val customDispatcherProvider = IdlingDispatcherProvider()

  @JvmField
  @Rule
  val idlingRule = IdlingDispatcherProviderRule {
    IdlingDispatcherProvider(customDispatcherProvider)
  }

  /**
  * If you don't provide CoroutineScopes to your lifecycle components via a dependency injection framework,
  * you need to use the `dispatch-android-lifecycle-extensions` and `dispatch-android-viewmodel` artifacts
  * to ensure that the same `IdlingDispatcherProvider` is used.
  */
  @Before
  fun setUp() {
    LifecycleScopeFactory.set {
      MainImmediateCoroutineScope(customDispatcherProvider)
    }
    ViewModelScopeFactory.set {
      MainImmediateCoroutineScope(customDispatcherProvider)
    }
  }

  @Test
  fun testThings() = runBlocking {

    // Now any CoroutineScope which uses the DispatcherProvider
    // in TestAppComponent will sync its "idle" state with Espresso

  }

}

Android ViewModel

The AndroidX ViewModel library offers a viewModelScope extension function to provide an auto-cancelled CoroutineScope, but again, this CoroutineScope is hard-coded and uses Dispatchers.Main. This limitation needn't exist.

Dispatch-android-viewmodel doesn't have as many options as its lifecycle counterpart, because the ViewModel.onCleared function is protected and ViewModel does not expose anything about its lifecycle. The only way for a third party library to achieve a lifecycle-aware CoroutineScope is through inheritance.

CoroutineViewModel is a simple abstract class which exposes a lazy viewModelScope property which is automatically cancelled when the ViewModel is destroyed. The exact type of the viewModelScope can be configured statically via ViewModelScopeFactory. In this way, you can use IdlingCoroutineScopes for Espresso testing, TestProvidedCoroutineScopes for unit testing, or any other custom scope you'd like.

If you're using the AAC ViewModel but not dependency injection, this artifact should be very helpful with testing.

import dispatch.android.viewmodel.*
import kotlinx.coroutines.flow.*
import timber.log.*

class MyViewModel : CoroutineViewModel() {

  init {
    MyRepository.someFlow.onEach {
      Timber.d("$it")
    }.launchIn(viewModelScope)
  }
}

The DispatchLifecycleScope may be configured with any dispatcher, since MainImmediateCoroutineScope is just a marker interface. Its lifecycle-aware functions cancel when dropping below a threshold, then automatically restart when entering into the desired lifecycle state again. This is key to preventing the backpressure leak of the AndroidX version, and it's also more analogous to the behavior of LiveData to which many developers are accustomed.

There are two built-in ways to define a custom LifecycleCoroutineScope - by simply constructing one directly inside a Lifecycle class, or by statically setting a custom LifecycleScopeFactory. This second option can be very useful when utilizing an IdlingCoroutineScope.

Testing

Testing is why this library exists. TestCoroutineScope and TestCoroutineDispatcher are very powerful when they can be used, but any reference to a statically defined dispatcher (like a Dispatchers property) removes that control.

To that end, there's a configurable TestDispatcherProvider:

class TestDispatcherProvider(
  override val default: CoroutineDispatcher = TestCoroutineDispatcher(),
  override val io: CoroutineDispatcher = TestCoroutineDispatcher(),
  override val main: CoroutineDispatcher = TestCoroutineDispatcher(),
  override val mainImmediate: CoroutineDispatcher = TestCoroutineDispatcher(),
  override val unconfined: CoroutineDispatcher = TestCoroutineDispatcher()
) : DispatcherProvider

As well as a polymorphic TestProvidedCoroutineScope which may be used in place of any type-specific CoroutineScope:

val testScope = TestProvidedCoroutineScope()

val someUIClass = SomeUIClass(testScope)

class SomeUIClass(val coroutineScope: MainCoroutineScope) {

  fun foo() = coroutineScope.launch {
    // ...
  }

}

There's also testProvided, which delegates to runBlockingTest but which includes a TestDispatcherProvider inside the TestCoroutineScope.

class Subject {
  // this would normally be a hard-coded reference to Dispatchers.Main
  suspend fun sayHello() = withMain {  }
}

@Test
fun `sayHello should say hello`() = runBlockingProvided {

  val subject = SomeClass(this)
  // uses "main" TestCoroutineDispatcher safely with no additional setup
  subject.getSomeData() shouldPrint "hello"
}

Modules

artifact features
dispatch-android-espresso IdlingDispatcher

IdlingDispatcherProvider

dispatch-android-lifecycle-extensions dispatchLifecycleScope
dispatch-android-lifecycle DispatchLifecycleScope

launchOnCreate

launchOnStart

launchOnResume

onNextCreate

onNextStart

onNextResume

dispatch-android-viewmodel CoroutineViewModel

viewModelScope

dispatch-core Dispatcher-specific types and factories

Dispatcher-specific coroutine builders

dispatch-detekt Detekt rules for common auto-imported-the-wrong-thing problems
dispatch-test-junit4 TestCoroutineRule
dispatch-test-junit5 CoroutineTest

CoroutineTestExtension

dispatch-test TestProvidedCoroutineScope

TestDispatcherProvider

runBlockingProvided and testProvided

Full Gradle Config

repositories {
  mavenCentral()
}

dependencies {

  /*
  production code
  */

  // core coroutines
  implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0")
  implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0")

  // a BOM ensures that all artifacts used from the library are of the same version
  implementation(platform("com.rickbusarow.dispatch:dispatch-bom:1.0.0-beta10"))

  // everything provides :core via "api", so you only need this if you have no other "implementation" dispatch artifacts
  implementation("com.rickbusarow.dispatch:dispatch-core")
  // LifecycleCoroutineScope for Android Fragments, Activities, etc.
  implementation("com.rickbusarow.dispatch:dispatch-android-lifecycle")
  // lifecycleScope extension function with a settable factory.  Use this if you don't DI your CoroutineScopes
  // This provides :dispatch-android-lifecycle via "api", so you don't need to declare both
  implementation("com.rickbusarow.dispatch:dispatch-android-lifecycle-extensions")
  // ViewModelScope for Android ViewModels
  implementation("com.rickbusarow.dispatch:dispatch-android-viewmodel")

  /*
  jvm testing
  */

  // core coroutines-test
  testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.0")
  // you only need this if you don't have the -junit4 or -junit5 artifacts
  testImplementation("com.rickbusarow.dispatch:dispatch-test")
  // CoroutineTestRule and :dispatch-test
  // This provides :dispatch-test via "api", so you don't need to declare both
  // This can be used at the same time as :dispatch-test-junit5
  testImplementation("com.rickbusarow.dispatch:dispatch-test-junit4")
  // CoroutineTest, CoroutineTestExtension, and :dispatch-test
  // This provides :dispatch-test via "api", so you don't need to declare both
  // This can be used at the same time as :dispatch-test-junit4
  testImplementation("com.rickbusarow.dispatch:dispatch-test-junit5")
  /*
  Android testing
  */

  // core android
  androidTestImplementation("androidx.test:runner:1.3.0")
  androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0")
  // IdlingDispatcher, IdlingDispatcherProvider, and IdlingCoroutineScope
  androidTestImplementation("com.rickbusarow.dispatch:dispatch-android-espresso")
}

License

Copyright (C) 2021 Rick Busarow
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
     http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • Bump gradle-maven-publish-plugin from 0.16.0 to 0.17.0

    Bump gradle-maven-publish-plugin from 0.16.0 to 0.17.0

    Bumps gradle-maven-publish-plugin from 0.16.0 to 0.17.0.

    Release notes

    Sourced from gradle-maven-publish-plugin's releases.

    0.17.0

    Changelog

    Changelog

    Sourced from gradle-maven-publish-plugin's changelog.

    Version 0.17.0 (2021-07-04)

    • Removed the deprecated uploadArchives and installArchives tasks. Use publish and publishToMavenLocal instead.
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    automerge dependencies 
    opened by dependabot[bot] 6
  • Bump mockk from 1.11.0 to 1.12.0

    Bump mockk from 1.11.0 to 1.12.0

    Bumps mockk from 1.11.0 to 1.12.0.

    Release notes

    Sourced from mockk's releases.

    V1.12.0

    Commits
    • 67c6baa Bump version number to v1.12.0
    • 7bf389c Merge pull request #646 from vladkanash/injectMockks_optional_params_support
    • 8a361ab Merge pull request #652 from christophsturm/jdk16
    • a9daae9 Merge pull request #653 from hrach/value_class_fix
    • 2ef354b remove reduntant ValueClassSupport in JVM
    • 421a420 don't run tests on jdk 16 for now because it fails
    • ffe5192 bump byte buddy and disable a test that fails on jdk 16
    • 5ad42ea Merge pull request #648 from tkhs0604/fix_readme
    • 3d8163a rename some obj to car
    • 430d358 Merge pull request #643 from hrach/custom_any_value_generator
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    automerge dependencies 
    opened by dependabot[bot] 6
  • Bump com.autonomousapps.dependency-analysis from 0.72.0 to 0.73.0

    Bump com.autonomousapps.dependency-analysis from 0.72.0 to 0.73.0

    Bumps com.autonomousapps.dependency-analysis from 0.72.0 to 0.73.0.

    Changelog

    Sourced from com.autonomousapps.dependency-analysis's changelog.

    Version 0.73.0

    • [Fixed] Detect usage of annotations on type parameters (#372)
    • Remove deprecated functions.
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 5
  • runBlockingTestProvided() must add the TestCoroutineDispatcher to the context

    runBlockingTestProvided() must add the TestCoroutineDispatcher to the context

    The TestCoroutineDispatcher used to create the TestDispatcherProvider is not added to the context. Since there is no existing dispatcher in the context, the called runBlockingTest() will create its own TestCoroutineDispatcher.

    As a consequence, any calls to advanceTime...() will not work correctly since they are performed on a different dispatcher. The following test fails with an UncompletedCoroutinesError

        @Test
        @ExperimentalCoroutinesApi
        fun advanceTimeIssue() = runBlockingTestProvided {
            delayOnProvidedMain()
            advanceTimeBy(1000)
        }
    
        fun CoroutineScope.delayOnProvidedMain() {
            launch(dispatcherProvider.main) {
                delay(1000)
            }
        }
    

    In order to fix this situation, you must add the testDispatcher used for the provider also to the context, see this working example:

        @ExperimentalCoroutinesApi
        private fun contextWithProvider(): CoroutineContext {
            val testDispatcher = TestCoroutineDispatcher()
            val provider = TestDispatcherProvider(testDispatcher)
            return EmptyCoroutineContext + testDispatcher + provider
        }
    
        @Test
        @ExperimentalCoroutinesApi
        fun advanceTimeIssueFixed() = runBlockingTest(contextWithProvider()) {
            delayOnProvidedMain()
            advanceTimeBy(1000)
        }
    
    opened by ralfstuckert 5
  • Bump follow-redirects from 1.14.4 to 1.14.7 in /website

    Bump follow-redirects from 1.14.4 to 1.14.7 in /website

    Bumps follow-redirects from 1.14.4 to 1.14.7.

    Commits
    • 2ede36d Release version 1.14.7 of the npm package.
    • 8b347cb Drop Cookie header across domains.
    • 6f5029a Release version 1.14.6 of the npm package.
    • af706be Ignore null headers.
    • d01ab7a Release version 1.14.5 of the npm package.
    • 40052ea Make compatible with Node 17.
    • 86f7572 Fix: clear internal timer on request abort to avoid leakage
    • 2e1eaf0 Keep Authorization header on subdomain redirects.
    • 2ad9e82 Carry over Host header on relative redirects (#172)
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the Security Alerts page.
    dependencies javascript 
    opened by dependabot[bot] 4
  • Bump algoliasearch-helper from 3.5.5 to 3.6.2 in /website

    Bump algoliasearch-helper from 3.5.5 to 3.6.2 in /website

    Bumps algoliasearch-helper from 3.5.5 to 3.6.2.

    Changelog

    Sourced from algoliasearch-helper's changelog.

    3.6.2 - 2021-10-19

    3.6.1 - 2021-10-15

    3.6.0 - 2021-10-08

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the Security Alerts page.
    dependencies PR: needs recreation javascript 
    opened by dependabot[bot] 4
  • Bump immer from 8.0.1 to 9.0.6 in /website

    Bump immer from 8.0.1 to 9.0.6 in /website

    Bumps immer from 8.0.1 to 9.0.6.

    Release notes

    Sourced from immer's releases.

    v9.0.6

    9.0.6 (2021-08-31)

    Bug Fixes

    • security: Follow up on CVE-2020-28477 where path: [["__proto__"], "x"] could still pollute the prototype (fa671e5)

    v9.0.5

    9.0.5 (2021-07-05)

    Bug Fixes

    • release missing dist/ folder (bfb8dec)

    v9.0.4

    9.0.4 (2021-07-05)

    Bug Fixes

    • #791 return 'nothing' should produce undefined patch (5412c9f)
    • #807 new undefined properties should end up in result object (dc3f66c)
    • Better applyPatches type (#810) (09ac097), closes #809

    v9.0.3

    9.0.3 (2021-06-09)

    Bug Fixes

    • isPlainObject: add quick comparison between input and Object to short-circuit taxing Function.toString invocations (#805) (07575f3)

    v9.0.2

    9.0.2 (2021-04-25)

    Bug Fixes

    • #785 fix type inference for produce incorrectly inferring promise (#786) (6555173)

    v9.0.1

    9.0.1 (2021-03-20)

    Bug Fixes

    • #768 immerable field being lost during patch value cloning (#771) (e0b7c01)

    ... (truncated)

    Commits
    • fa671e5 fix(security): Follow up on CVE-2020-28477 where path: [["__proto__"], "x"]...
    • 2e0aa95 Create SECURITY.md
    • 050522d chore: fix CI. maybe.
    • 1195510 docs: Update example-setstate.mdx (#833)
    • 648d39b docs: fixing link to RFC-6902 & fixing typo (#830)
    • bc890f7 docs: Update example-setstate.mdx (#829)
    • 16a3d0f chore(deps): bump prismjs from 1.23.0 to 1.24.0 in /website (#822)
    • 847492c docs: Extended / updated documenation (#824)
    • 7f41483 chore: [workflows] don't release from forks
    • 3f9a94e chore: let's test before publish
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the Security Alerts page.
    dependencies PR: needs recreation javascript 
    opened by dependabot[bot] 4
  • Bump bye-bye-jetifier from 1.1.2 to 1.2.0

    Bump bye-bye-jetifier from 1.1.2 to 1.2.0

    Bumps bye-bye-jetifier from 1.1.2 to 1.2.0.

    Release notes

    Sourced from bye-bye-jetifier's releases.

    v1.2.0

    Implemented enhancements:

    • Support project exclusion #46

    v1.1.3

    Fixed bugs:

    • Show "Received malformed sequence exception" warning stacktrace only when verbose is enabled #36
    Changelog

    Sourced from bye-bye-jetifier's changelog.

    v1.2.0 (2021-08-25)

    Full Changelog

    Implemented enhancements:

    • Support project exclusion #46

    v1.1.3 (2021-05-24)

    Full Changelog

    Fixed bugs:

    • Execution failed #32
    • Show "Received malformed sequence exception" warning stacktrace only when verbose is enabled #36
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 4
  • Bump moshi-sealed-ksp from 0.12.1 to 0.12.2

    Bump moshi-sealed-ksp from 0.12.1 to 0.12.2

    Bumps moshi-sealed-ksp from 0.12.1 to 0.12.2.

    Release notes

    Sourced from moshi-sealed-ksp's releases.

    0.12.2

    • Fix: RecordsJsonAdapterFactory now properly respects @JsonQualifier annotations on components.
    • Fix: RecordsJsonAdapterFactory now supports non-public constructors (i.e. package or file-private).
    • Fix: Crash in moshi-ksp when dealing with generic typealias properties.
    Changelog

    Sourced from moshi-sealed-ksp's changelog.

    Version 0.12.2

    2021-08-20

    • Fix: RecordsJsonAdapterFactory now properly respects @JsonQualifier annotations on components.
    • Fix: RecordsJsonAdapterFactory now supports non-public constructors (i.e. package or file-private).
    • Fix: Crash in moshi-ksp when dealing with generic typealias properties.
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    automerge dependencies 
    opened by dependabot[bot] 4
  • Bump moshi-ksp from 0.11.2 to 0.12.0

    Bump moshi-ksp from 0.11.2 to 0.12.0

    Bumps moshi-ksp from 0.11.2 to 0.12.0.

    Release notes

    Sourced from moshi-ksp's releases.

    0.12.0

    • Update to KSP 1.5.21-1.0.0-beta05.
    • Update to Kotlin 1.5.21.
    • Update to Dokka 1.5.0.
    • Update to KotlinPoet 1.9.0.
    • Test against JDK 17 early access previews.
    • New: moshi-ksp and moshi-sealed's codegen both support a new moshi.generateProguardRules option. This can be set to false to disable proguard rule generation.
    • Fix: Artifacts now ship with a -module-name attribute set to their artifact ID to help avoid module name collisions.

    Thanks to @​SeongUgJung and @​slmlt for contributing to this release!

    Changelog

    Sourced from moshi-ksp's changelog.

    Version 0.12.0

    2021-07-15

    • Update to KSP 1.5.21-1.0.0-beta05.
    • Update to Kotlin 1.5.21.
    • Update to Dokka 1.5.0.
    • Update to KotlinPoet 1.9.0.
    • Test against JDK 17 early access previews.
    • New: moshi-ksp and moshi-sealed's codegen both support a new moshi.generateProguardRules option. This can be set to false to disable proguard rule generation.
    • Fix: Artifacts now ship with a -module-name attribute set to their artifact ID to help avoid module name collisions.

    Thanks to @​SeongUgJung and @​slmlt for contributing to this release!

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    automerge dependencies 
    opened by dependabot[bot] 4
  • Bump org.jetbrains.dokka from 1.4.10 to 1.5.0

    Bump org.jetbrains.dokka from 1.4.10 to 1.5.0

    Bumps org.jetbrains.dokka from 1.4.10 to 1.5.0.

    Release notes

    Sourced from org.jetbrains.dokka's releases.

    1.5.0 Alpha

    Kotlin compiler upgraded to 1.5.0

    Fixes:

    Make module name optional in CLI (#1850) Fix line separator issues (#1887) Fix preserving spaces in Javadoc comments (#1923) GFM renderer: sanitize line ends (#1936) Fix rendering html in briefs (#1931) Fix code blocks on Extension Points page (#1948) Remove extra dash (#1968) Don't use older dir from previous runs in versioning (#1963) Change jekyll links to be .html (#1990) Fix Gradle plugin application (#2000)

    Added features:

    Add a supertype for leaf dokka tasks that defines dokkaSourceSets (#1891) Add ability to specify older versions as a list of files (#1890) Cachable Gradle task (#1905) Multilanguage docs inheritance (#1951) Logging levels in CLI (#1976) Flatten multi-module structure (#1980)

    Special thanks to external contributors: @​rnett, @​msink, @​zsmb13, @​rachelcarmena and @​hfhbd

    1.4.32 Alpha

    Fixes:

    • Fix configuration for suppressing obvious functions (#1789)
    • Fix visibility on enum entry property (#1828)
    • Fix missing annotations in GFM and unresolved static imports (#1845)

    Added features:

    Special thanks to external contributors: @​AzimMuradov and @​hfhbd

    1.4.30 Alpha

    In this release we focused on improving multi-module experience that would allow links, search and navigation to be rendered for the whole project rather than independent modules. We have also updated the compiler to 1.4.30 and introduced the versioning plugin for the multi module, that lets users generate documentation for each version incrementally and switch between them on the main page.

    Breaking changes

    • Dokka multi module no longer uses generic dokka${format} task but rather dokka${format}Partial where format is the desired output format like html or gfm

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    automerge dependencies 
    opened by dependabot[bot] 4
  • update for AAC Lifecycle 2.5.0

    update for AAC Lifecycle 2.5.0

    The AndroidX ViewModel library offers a viewModelScope extension function to provide an auto-cancelled CoroutineScope, but again, this CoroutineScope is hard-coded and uses Dispatchers.Main. This limitation needn't exist.

    This is no longer true w/ Lifecycle 2.5.0+: https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.0

    "addCloseable() API and a new constructor overload that allow you to add one or more Closeable objects to the ViewModel that will be closed when the ViewModel is cleared without requiring any manual work in onCleared()." So you can pass in a Closable coroutinescope to a viewmodel's constructor.

    opened by kenyee 0
  • Bump loader-utils from 2.0.2 to 2.0.4 in /website

    Bump loader-utils from 2.0.2 to 2.0.4 in /website

    Bumps loader-utils from 2.0.2 to 2.0.4.

    Release notes

    Sourced from loader-utils's releases.

    v2.0.4

    2.0.4 (2022-11-11)

    Bug Fixes

    v2.0.3

    2.0.3 (2022-10-20)

    Bug Fixes

    • security: prototype pollution exploit (#217) (a93cf6f)
    Changelog

    Sourced from loader-utils's changelog.

    2.0.4 (2022-11-11)

    Bug Fixes

    2.0.3 (2022-10-20)

    Bug Fixes

    • security: prototype pollution exploit (#217) (a93cf6f)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Update dependency androidx.paging:paging-compose to v1.0.0-alpha17

    Update dependency androidx.paging:paging-compose to v1.0.0-alpha17

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | androidx.paging:paging-compose (source) | 1.0.0-alpha15 -> 1.0.0-alpha17 | age | adoption | passing | confidence |


    ⚠ Dependency Lookup Warnings ⚠

    Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.


    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Never, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    automerge dependencies 
    opened by renovate[bot] 0
  • Update coil to v2.2.2

    Update coil to v2.2.2

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | io.coil-kt:coil-gif | 2.2.1 -> 2.2.2 | age | adoption | passing | confidence | | io.coil-kt:coil | 2.2.1 -> 2.2.2 | age | adoption | passing | confidence | | io.coil-kt:coil-compose | 2.2.1 -> 2.2.2 | age | adoption | passing | confidence |


    ⚠ Dependency Lookup Warnings ⚠

    Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.


    Release Notes

    coil-kt/coil

    v2.2.2

    Compare Source

    • Ensure an image loader is fully initialized before registering its system callbacks. #​1465
    • Set the preferred bitmap config in VideoFrameDecoder on API 30+ to avoid banding. #​1487
    • Fix parsing paths containing # in FileUriMapper. #​1466
    • Fix reading responses with non-ascii headers from the disk cache. #​1468
    • Fix decoding videos inside asset subfolders. #​1489
    • Update androidx.annotation to 1.5.0.

    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Never, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about these updates again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    automerge dependencies 
    opened by renovate[bot] 0
  • Update dependency androidx.exifinterface:exifinterface to v1.3.5

    Update dependency androidx.exifinterface:exifinterface to v1.3.5

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | androidx.exifinterface:exifinterface (source) | 1.3.3 -> 1.3.5 | age | adoption | passing | confidence |


    ⚠ Dependency Lookup Warnings ⚠

    Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.


    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Never, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    automerge dependencies 
    opened by renovate[bot] 0
  • Update androidx-fragment-version to v1.5.4

    Update androidx-fragment-version to v1.5.4

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | androidx.fragment:fragment-testing (source) | 1.5.2 -> 1.5.4 | age | adoption | passing | confidence | | androidx.fragment:fragment-ktx (source) | 1.5.2 -> 1.5.4 | age | adoption | passing | confidence | | androidx.fragment:fragment (source) | 1.5.2 -> 1.5.4 | age | adoption | passing | confidence |


    ⚠ Dependency Lookup Warnings ⚠

    Warnings were logged while processing this repo. Please check the Dependency Dashboard for more information.


    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Never, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about these updates again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    automerge dependencies 
    opened by renovate[bot] 0
Releases(v1.0.0-beta10)
Gits-android-extensions - A collection of Kotlin extensions to simplify Android development

gits-android-extensions A collection of Kotlin extensions to simplify Android de

GITS Indonesia 3 Feb 3, 2022
Small Kafka Playground to play around with Test Containers, and KotlinX Coroutines bindings while reading Kafka Definite Guide V2

KafkaPlayground Small playground where I'm playing around with Kafka in Kotlin and the Kafka SDK whilst reading the Kafka book Definite Guide from Con

Simon Vergauwen 34 Dec 30, 2022
An tool to help developer to use Retrofit elegantly while using kotlinx.coroutines.

one An tool to help developer to use Retrofit elegantly while using kotlinx.coroutines. Feature Transform different data structs to one. {errorCode, d

ChengTao 30 Dec 27, 2022
Parking Robot based on 3D LiDAR. Keywords: Automatic Parking, SLAM, 3D Navigation, Remote Control, ROS, RRT

ELEC3875-Final-Project My undergraduate final project: Parking Robot based on 3D LiDAR. ELEC3875 / XJEL3875 Keywords: Automatic Parking, SLAM, 3D Navi

Hugo Hu 6 Oct 1, 2022
Built with Jetpack compose, multi modules MVVM clean architecture, coroutines + flow, dependency injection, jetpack navigation and other jetpack components

RickAndMortyCompose - Work in progress A simple app using Jetpack compose, clean architecture, multi modules, coroutines + flows, dependency injection

Daniel Waiguru 9 Jul 13, 2022
Boilerplate code for implementing MVVM in Android using Jetpack libraries, coroutines, dependency injection and local persistance

MVVM Foundation This projects aims to speed up development of Android apps by providing a solid base to extend Libraries Jetpack Fragment Material3 :

Gabriel Gonzalez 2 Nov 10, 2022
🍭 GithubSearchKMM - Github Repos Search - Android - iOS - Kotlin Multiplatform Mobile using Jetpack Compose, SwiftUI, FlowRedux, Coroutines Flow, Dagger Hilt, Koin Dependency Injection, shared KMP ViewModel, Clean Architecture

GithubSearchKMM Github Repos Search - Kotlin Multiplatform Mobile using Jetpack Compose, SwiftUI, FlowRedux, Coroutines Flow, Dagger Hilt, Koin Depend

Petrus Nguyễn Thái Học 50 Jan 7, 2023
CSV and FixedLength Formats for kotlinx-serialization

Module kotlinx-serialization-csv Serialize and deserialize ordered CSV and Fixed Length Format Files with kotlinx-serialization. Source code Docs Inst

Philip Wedemann 12 Dec 16, 2022
Android Bundle format support for Kotlinx Serialization.

Bundlizer Android Bundle format support for Kotlinx Serialization. Usage Annotate your data models with @Serializable: import kotlinx.serialization.Se

Ahmed Mourad 69 Nov 9, 2022
Minecraft NBT support for kotlinx.serialization

knbt An implementation of Minecraft's NBT format for kotlinx.serialization. Technical information about NBT can be found here. Using the same version

Ben Woodworth 41 Dec 21, 2022
Android Parcelable support for the Kotlinx Serialization library.

Android Parcelable support for the Kotlinx Serialization library.

Christopher 50 Nov 20, 2022
Kotlinx-murmurhash - Kotlin Multiplatform (KMP) library for hashing using MurmurHash

kotlinx-murmurhash Kotlin Multiplatform (KMP) library for MurmurHash, a non-cryp

Gonçalo Silva 23 Dec 27, 2022
Kotlin tooling for generating kotlinx.serialization serializers for serializing a class as a bitmask

kotlinx-serialization-bitmask Kotlin tooling for generating kotlinx.serialization serializers for serializing a class as a bitmask. Example @Serializa

marie 2 May 29, 2022
Type-safe arguments for JetPack Navigation Compose using Kotlinx.Serialization

Navigation Compose Typed Compile-time type-safe arguments for JetPack Navigation Compose library. Based on KotlinX.Serialization. Major features: Comp

Kiwi.com 32 Jan 4, 2023
KotlinX Serialization Standard Serializers (KS3)

KotlinX Serialization Standard Serializers (KS3) This project aims to provide a set of serializers for common types. ⚠️ Consider this project to be Al

Emil Kantis 3 Nov 5, 2022
Recycler-coroutines - RecyclerView Auto Add Data Using Coroutines

Sample RecyclerView Auto Add With Coroutine Colaborator Very open to anyone, I'l

Faisal Amir 8 Dec 1, 2022
Various experimental proposals and extensions to Javalin 4.x used in Reposilite 3.x

Javalin RFCs Various experimental extensions to Javalin 4.x used in Reposilite 3.x. Provides basic support for Kotlin coroutines and async routes with

Reposilite Playground 5 Feb 22, 2022
Dependency Injection library for Kotlin Multiplatform, support iOS and Android

Multiplatform-DI library for Kotlin Multiplatform Lightweight dependency injection framework for Kotlin Multiplatform application Dependency injection

Anna Zharkova 32 Nov 10, 2022
A collection of hand-crafted extensions for your Kotlin projects.

Splitties Splitties is a collection of small Kotlin multiplatform libraries (with Android as first target). These libraries are intended to reduce the

Louis CAD 2.2k Dec 25, 2022