Skip to content

Instantly share code, notes, and snippets.

View elizarov's full-sized avatar

Roman Elizarov elizarov

View GitHub Profile
@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

@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
/*
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 / 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)
@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 / 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 / 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 / MultiShotEnumeration.kt
Created May 3, 2017 09:01
Showcase for Kotlin multishot continuations
import kotlin.coroutines.experimental.*
import kotlin.coroutines.experimental.intrinsics.*
fun main(args: Array<String>) {
enumerate {
if (flip("A")) {
if (flip("B")) 1 else 2
} else {
if (flip("C")) 3 else if (flip("D")) 4 else 5
}
@elizarov
elizarov / CancellableHandlerContext.kt
Created April 24, 2017 08:15
Alternative implementation of HandlerContext for Android that continues coroutine with CancellationException when the job is complete (i.e. it was cancelled from outside)
public class CancellableHandlerContext(
private val handler: Handler
) : AbstractCoroutineContextElement(ContinuationInterceptor), ContinuationInterceptor, Delay
{
override fun <T> interceptContinuation(continuation: Continuation<T>): Continuation<T> =
DispatchedContinuation(continuation)
override fun scheduleResumeAfterDelay(time: Long, unit: TimeUnit, continuation: CancellableContinuation<Unit>) {
handler.postDelayed(object : ResumeTask<Unit>(continuation) {
override fun resume() = continuation.resume(Unit)
import javafx.beans.property.SimpleStringProperty
import javafx.geometry.Insets
import javafx.scene.Scene
import javafx.scene.control.ButtonBar
import javafx.scene.control.ButtonType
import javafx.scene.control.Dialog
import javafx.util.Callback
import kotlinx.coroutines.experimental.CommonPool
import kotlinx.coroutines.experimental.javafx.JavaFx
import kotlinx.coroutines.experimental.launch