private val DEF_HTTP_RETRY_LOGIC = { errors : Observable -> errors.zipWith( Observable.range(1, DEF_HTTP_RETRY_COUNT + 1), { error, attempt -> Pair(error, attempt) } ) .flatMap { val error = it.first val attempt = it.second Timber.d("Error: $error during attempt $attempt") if (attempt <= DEF_HTTP_RETRY_COUNT && error is RetrofitError && error.kind == RetrofitError.Kind.NETWORK) { Timber.d("Retrying...") Observable.timer(attempt.toLong(), TimeUnit.SECONDS) } else { Observable.error(error as Throwable) } } }