inline class SafeIndex(val rawIndex: Int) { val orNull: Int? get() = rawIndex.takeUnless { it < 0 } } inline fun SafeIndex.orElse(default: () -> Int): Int = if (rawIndex < 0) default() else rawIndex inline fun Iterable.safeIndexOfFirst(predicate: (T) -> Bool) = SafeIndex(indexOf(predicate)) val n = completionProviders.safeIndexOfFirst { ... } .orElse { completionProviders.size }