Skip to content

Instantly share code, notes, and snippets.

@vitusortner
vitusortner / Guard.kt
Created November 20, 2019 09:39
Kotlin Guard
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
@ExperimentalContracts
inline fun guard(predicate: Boolean, block: () -> Nothing) {
contract {
returns() implies predicate
callsInPlace(block, InvocationKind.AT_MOST_ONCE)
}
@vitusortner
vitusortner / RxMapNotNull.kt
Created November 8, 2019 08:40
RxJava mapNotNull
/**
* Applies [transform] to values from the [Observable] and forwards values with non-null results.
*/
inline fun <T : Any, S : Any> Observable<T>.mapNotNull(
crossinline transform: (T) -> S?
): Observable<S> {
return this
.flatMap {
val result = transform(it)
if (result == null) {
@vitusortner
vitusortner / ObservableDelay.kt
Created October 28, 2019 14:26
Extension of Observable to delay every succeeding emission
fun <T> Observable<T>.delaySucceeding(interval: Long, timeUnit: TimeUnit): Observable<T> {
return Observable.merge(
this.take(1),
this.skip(1).delayEach(interval, timeUnit)
)
}
private fun <T> Observable<T>.delayEach(interval: Long, timeUnit: TimeUnit): Observable<T> {
return Observable.zip(
this,