diff --git a/stdlib/ktSrc/Standard.kt b/stdlib/ktSrc/Standard.kt index 45c65e9888c..ce1753db5e0 100644 --- a/stdlib/ktSrc/Standard.kt +++ b/stdlib/ktSrc/Standard.kt @@ -68,4 +68,24 @@ inline fun Iterator.toTreeSet() = to(TreeSet()) /* Run function f */ -inline fun run(f: () -> T) = f() \ No newline at end of file +inline fun run(f: () -> T) = f() + +/* +Allow a default value to be provided when converting a nullable type to a non-nullable type +*/ +inline fun T?.getOrElse(defaultValue: T): T { + return if (this != null) + this + else + defaultValue +} + +/* +Allow a default value to be lazily provided from a function when converting a nullable type to a non-nullable type +*/ +inline fun T?.getOrElse(defaultValueFactory: ()-> T): T { + return if (this != null) + this + else + defaultValueFactory() +} diff --git a/testlib/test/GetOrElseTest.kt b/testlib/test/GetOrElseTest.kt new file mode 100644 index 00000000000..7507936f0b6 --- /dev/null +++ b/testlib/test/GetOrElseTest.kt @@ -0,0 +1,39 @@ +package test.standard + +import std.* +import stdhack.test.* +import stdhack.test.assertEquals + +class GetOrElseTest() : TestSupport() { + val v1: String? = "hello" + val v2: String? = null + + fun testDefaultValue() { + /** + TODO compiler error? + + assertEquals("hello", v1.getOrElse("bar")) + assertEquals("bar", v2.getOrElse("bar")) + + expect("hello") { + v1.getOrElse("bar") + } + expect("bar") { + v2.getOrElse("bar") + } + */ + } + + fun testLazyDefaultValue() { + var counter = 0 + + /** + TODO compiler error? + assertEquals("hello", v1.getOrElse{ counter++; "bar"} + assertEquals(counter, 0, "counter should not be incremented yet") + + assertEquals("bar", v2.getOrElse{ counter++; "bar"} + assertEquals(counter, 1, "counter should be incremented in the default function") + */ + } +}