Keep the non-suspend version and make it inline
. This solves the problem because the inlined lambda can then contain suspending calls without being declared suspend
itself. It is how most of the Kotlin stdlib does this (forEach
, map
, etc.):
inline fun validationWrapper(supplier: () -> Unit) = try {
supplier.invoke()
} catch (ex: Exception) {
when (ex) {
is IllegalArgumentException, is IllegalStateException -> throw ValidationException(ex.message!!)
else -> throw ex
}
}
Also, it is generally useful for higher-order functions that take lambdas to be declared inline
, because it avoids extra costs of lambda instances.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…