Skip to content

Instantly share code, notes, and snippets.

View elizarov's full-sized avatar

Roman Elizarov elizarov

View GitHub Profile
@elizarov
elizarov / ContextCounter.kt
Last active April 28, 2021 12:42
Using Kotlin Coroutine context to keep a mutable counter
import kotlinx.coroutines.experimental.CommonPool
import kotlinx.coroutines.experimental.launch
import kotlinx.coroutines.experimental.runBlocking
import java.util.concurrent.atomic.AtomicInteger
import kotlin.coroutines.experimental.AbstractCoroutineContextElement
import kotlin.coroutines.experimental.CoroutineContext
import kotlin.coroutines.experimental.intrinsics.*
// coroutine context element that keeps a (mutable) integer counter
class Counter : AbstractCoroutineContextElement(Key) {
@elizarov
elizarov / BackgroundInit.kt
Created May 12, 2017 10:03
Perform some long-running initialization in background thread
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val application = this
launch(UI) { // start a new coroutine in Android UI context
// switch to background thread for some long-running initialization
run(CommonPool) { AndroidThreeTen.init(application) }
// then init UI
initUI()
}
@elizarov
elizarov / StackComputation.kt
Last active September 2, 2020 14:19
Using coroutines to avoid StackOverflowException on recursive calls
import kotlin.coroutines.experimental.*
import kotlin.coroutines.experimental.intrinsics.COROUTINE_SUSPENDED
import kotlin.coroutines.experimental.intrinsics.suspendCoroutineOrReturn
@RestrictsSuspension
abstract class StackComputation {
abstract suspend fun <T> push(block: suspend StackComputation.() -> T): T
}
fun <T> compute(block: suspend StackComputation.() -> T): T =
@elizarov
elizarov / Converted.kt
Last active June 21, 2017 22:45
Converted Rx Code
/*
fun BluetoothSocket.asyncListen(): Flowable<String> =
flowable<String>(BackpressureStrategy.BUFFER) { emitter ->
try {
val reader = BufferedReader(InputStreamReader(inputStream))
while (!emitter.isCancelled) {
reader.readLine()?.let { emitter.onNext(it) }
}
} catch (e: IOException) {
emitter.onError(e)
/*
fun BluetoothSocket.asyncListen(): Flowable<String> =
flowable<String>(BackpressureStrategy.BUFFER) { emitter ->
try {
val reader = BufferedReader(InputStreamReader(inputStream))
while (!emitter.isCancelled) {
reader.readLine()?.let { emitter.onNext(it) }
}
} catch (e: IOException) {
emitter.onError(e)
@elizarov
elizarov / Result.kt
Last active June 16, 2020 17:04
Result for Kotlin
class Result<T> private constructor(private val result: Any?) {
// discovery
val isFailure: Boolean get() = result is Failure
val isSuccess: Boolean get() = result !is Failure
// value retrieval
fun get(): T =
if (result is Failure) throw result.exception
@elizarov
elizarov / TaskConcurrencyManifesto.md
Created August 18, 2017 15:28 — forked from lattner/TaskConcurrencyManifesto.md
Task-based concurrency manifesto draft

Concurrency in Swift: One possible approach

Introduction

This document is published in the style of a "Swift evolution manifesto", outlining a long-term view of how to tackle a very large problem. It explores one possible approach to adding a first-class concurrency model to Swift, in an effort to catalyze positive discussion that leads us to a best-possible design. As such, it isn't an approved or finalized design

import kotlinx.coroutines.experimental.runBlocking
import okhttp3.*
import java.io.IOException
import kotlin.coroutines.experimental.suspendCoroutine
fun main(args: Array<String>) {
val http = OkHttpClient.Builder().build()
val appid = "mock"
val secret = "mock"
val code = "mock"
@elizarov
elizarov / Example.kt
Last active September 21, 2019 16:15
// https://akarnokd.blogspot.ru/2017/09/rxjava-vs-kotlin-coroutines-quick-look.html
import kotlinx.coroutines.experimental.*
suspend fun f1(i: Int): Int {
Thread.sleep(if (i != 2) 2000L else 200L)
return 1
}
suspend fun f2(i: Int): Int {
Thread.sleep(if (i != 2) 2000L else 200L)
// https://akarnokd.blogspot.ru/2017/09/rxjava-vs-kotlin-coroutines-quick-look.html
// Refactoring
import kotlinx.coroutines.experimental.*
suspend fun f1(i: Int): Int {
Thread.sleep(if (i != 2) 2000L else 200L)
return 1
}
suspend fun f2(i: Int): Int {