fun main(args: Array<String>) {
val thingIntOpt:Int? = 0
if (thingIntOpt == null) return
val something0 = thingIntOpt?.takeIf { it < 10 } ?: return
val thingStringOpt:String? = "hoge"
if (thingStringOpt !is String) return
val something1 = thingStringOpt?.let { "hello" } ?: return
val something2 = thingStringOpt ?: return
val something3 = thingStringOpt?.apply { println(this) } ?: return
val thingStringOptInline: String = "hogeInline" as? String ?: return
println(thingStringOptInline)
val thing: String? = "fuga"
val notNullThing = thing.guard { return }
println(notNullThing)
}
inline fun <T> T.guard(block: T.() -> Unit): T {
if (this == null) block(); return this
}