From 3b95e7fa7f9ca1a29a3123b0b5da972b7af3de5c Mon Sep 17 00:00:00 2001 From: James Strachan Date: Tue, 17 Apr 2012 10:12:51 +0100 Subject: [PATCH] added count(predicate) helper function to String along with Char.is*() methods from java.lang.Character --- libraries/stdlib/src/kotlin/Char.kt | 27 ++++++++++++++++++++++++++ libraries/stdlib/src/kotlin/Strings.kt | 17 +++++++++++++++- libraries/stdlib/test/StringTest.kt | 22 +++++++++++++-------- 3 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 libraries/stdlib/src/kotlin/Char.kt diff --git a/libraries/stdlib/src/kotlin/Char.kt b/libraries/stdlib/src/kotlin/Char.kt new file mode 100644 index 00000000000..ba39b85ad60 --- /dev/null +++ b/libraries/stdlib/src/kotlin/Char.kt @@ -0,0 +1,27 @@ +package kotlin + +public inline fun Char.isDefined(): Boolean = Character.isDefined(this) + +public inline fun Char.isDigit(): Boolean = Character.isDigit(this) + +public inline fun Char.isHighSurrogate(): Boolean = Character.isHighSurrogate(this) + +public inline fun Char.isIdentifierIgnorable(): Boolean = Character.isIdentifierIgnorable(this) + +public inline fun Char.isISOControl(): Boolean = Character.isISOControl(this) + +public inline fun Char.isJavaIdentifierPart(): Boolean = Character.isJavaIdentifierPart(this) + +public inline fun Char.isJavaIdentifierStart(): Boolean = Character.isJavaIdentifierStart(this) + +public inline fun Char.isJavaLetter(): Boolean = Character.isJavaLetter(this) + +public inline fun Char.isJavaLetterOrDigit(): Boolean = Character.isJavaLetterOrDigit(this) + +/** + * Returns true if the character is whitespace + * + * @includeFunctionBody ../../test/StringTest.kt count + */ +public inline fun Char.isWhitespace(): Boolean = Character.isWhitespace(this) + diff --git a/libraries/stdlib/src/kotlin/Strings.kt b/libraries/stdlib/src/kotlin/Strings.kt index e1519a90928..75079e69479 100644 --- a/libraries/stdlib/src/kotlin/Strings.kt +++ b/libraries/stdlib/src/kotlin/Strings.kt @@ -211,4 +211,19 @@ public inline fun CharSequence.subSequence(start : Int, end : Int) : CharSequenc public inline fun CharSequence.get(start : Int, end : Int) : CharSequence? = subSequence(start, end) -public inline fun CharSequence.toString() : String? = (this as java.lang.CharSequence).toString() \ No newline at end of file +public inline fun CharSequence.toString() : String? = (this as java.lang.CharSequence).toString() + +/** + * Counts the number of characters which match the given predicate + * + * @includeFunctionBody ../../test/StringTest.kt count + */ +public inline fun String.count(predicate: (Char) -> Boolean): Int { + var answer = 0 + for (c in this) { + if (predicate(c)) { + answer++ + } + } + return answer +} \ No newline at end of file diff --git a/libraries/stdlib/test/StringTest.kt b/libraries/stdlib/test/StringTest.kt index cf11b34702a..157a61a2851 100644 --- a/libraries/stdlib/test/StringTest.kt +++ b/libraries/stdlib/test/StringTest.kt @@ -3,17 +3,17 @@ package test.string import kotlin.io.* import kotlin.test.* -import junit.framework.* +import org.junit.Test as test -class StringTest() : TestCase() { - fun testStringIterator() { +class StringTest { + test fun stringIterator() { var sum = 0 for(c in "239") sum += (c.toInt() - '0'.toInt()) assertTrue(sum == 14) } - fun testStringBuilderIterator() { + test fun stringBuilderIterator() { var sum = 0 val sb = StringBuilder() for(c in "239") @@ -26,7 +26,7 @@ class StringTest() : TestCase() { assertTrue(sum == 14) } - fun testOrEmpty() { + test fun orEmpty() { val s: String? = "hey" val ns: String? = null @@ -34,16 +34,22 @@ class StringTest() : TestCase() { assertEquals("", ns.orEmpty()) } - fun testToShort() { + test fun toShort() { assertEquals(77.toShort(), "77".toShort()) } - fun testToInt() { + test fun toInt() { assertEquals(77, "77".toInt()) } - fun testToLong() { + test fun toLong() { assertEquals(77.toLong(), "77".toLong()) } + test fun count() { + val text = "hello there\tfoo\nbar" + val whitespaceCount = text.count { it.isWhitespace() } + assertEquals(3, whitespaceCount) + } + }