From 1db035a0aaee9d922c25f3dbf3e8077e6044b3f8 Mon Sep 17 00:00:00 2001 From: Ilya Ryzhenkov Date: Thu, 20 Mar 2014 16:03:47 +0400 Subject: [PATCH] Slice functions for arrays and lists. --- libraries/stdlib/src/generated/_Filtering.kt | 120 ++++++++++++++++++ .../stdlib/test/collections/ArraysTest.kt | 16 +++ .../test/collections/ListSpecificTest.kt | 12 +- .../src/templates/Filtering.kt | 15 +++ 4 files changed, 162 insertions(+), 1 deletion(-) diff --git a/libraries/stdlib/src/generated/_Filtering.kt b/libraries/stdlib/src/generated/_Filtering.kt index b09784587ef..720e985fced 100644 --- a/libraries/stdlib/src/generated/_Filtering.kt +++ b/libraries/stdlib/src/generated/_Filtering.kt @@ -835,6 +835,126 @@ public inline fun > Stream.filterTo(collection: } +/** + * Returns a list containing elements at specified positions + */ +public fun Array.slice(indices: Iterable) : List { + val list = ArrayList() + for (index in indices) { + list.add(get(index)) + } + return list + +} + +/** + * Returns a list containing elements at specified positions + */ +public fun BooleanArray.slice(indices: Iterable) : List { + val list = ArrayList() + for (index in indices) { + list.add(get(index)) + } + return list + +} + +/** + * Returns a list containing elements at specified positions + */ +public fun ByteArray.slice(indices: Iterable) : List { + val list = ArrayList() + for (index in indices) { + list.add(get(index)) + } + return list + +} + +/** + * Returns a list containing elements at specified positions + */ +public fun CharArray.slice(indices: Iterable) : List { + val list = ArrayList() + for (index in indices) { + list.add(get(index)) + } + return list + +} + +/** + * Returns a list containing elements at specified positions + */ +public fun DoubleArray.slice(indices: Iterable) : List { + val list = ArrayList() + for (index in indices) { + list.add(get(index)) + } + return list + +} + +/** + * Returns a list containing elements at specified positions + */ +public fun FloatArray.slice(indices: Iterable) : List { + val list = ArrayList() + for (index in indices) { + list.add(get(index)) + } + return list + +} + +/** + * Returns a list containing elements at specified positions + */ +public fun IntArray.slice(indices: Iterable) : List { + val list = ArrayList() + for (index in indices) { + list.add(get(index)) + } + return list + +} + +/** + * Returns a list containing elements at specified positions + */ +public fun LongArray.slice(indices: Iterable) : List { + val list = ArrayList() + for (index in indices) { + list.add(get(index)) + } + return list + +} + +/** + * Returns a list containing elements at specified positions + */ +public fun ShortArray.slice(indices: Iterable) : List { + val list = ArrayList() + for (index in indices) { + list.add(get(index)) + } + return list + +} + +/** + * Returns a list containing elements at specified positions + */ +public fun List.slice(indices: Iterable) : List { + val list = ArrayList() + for (index in indices) { + list.add(get(index)) + } + return list + +} + /** * Returns a list containing first *n* elements */ diff --git a/libraries/stdlib/test/collections/ArraysTest.kt b/libraries/stdlib/test/collections/ArraysTest.kt index a4888c0d826..7d15367d34c 100644 --- a/libraries/stdlib/test/collections/ArraysTest.kt +++ b/libraries/stdlib/test/collections/ArraysTest.kt @@ -186,6 +186,22 @@ class ArraysTest { assertTrue("0" !in array("1","2","3","4")) } + test fun slice() { + val iter = listOf(3, 1, 2) + + assertEquals(listOf("B"), array("A", "B", "C").slice(1..1)) + assertEquals(listOf('E', 'B', 'C'), array('A', 'B', 'C', 'E').slice(iter)) + + assertEquals(listOf(), array().slice(5..4)) + assertEquals(listOf(), array(1, 2, 3).slice(5..1)) + assertEquals(listOf(2, 3, 9), array(2, 3, 9, 2, 3, 9).slice(iter)) + assertEquals(listOf(2.0, 3.0), array(2.0, 3.0, 9.0).slice(0..1)) + assertEquals(listOf(2f, 3f), array(2f, 3f, 9f).slice(0..1)) + assertEquals(listOf(127, 100), array(50, 100, 127).slice(2 downTo 1)) + assertEquals(listOf(200, 100), array(50, 100, 200).slice(2 downTo 1)) + assertEquals(listOf(100L, 200L, 30L), array(50L, 100L, 200L, 30L).slice(1..3)) + assertEquals(listOf(true, false, true), array(true, false, true, true).slice(iter)) + } /* TODO FIXME ASAP: These currently fail on JS due to missing upto() method on numbers diff --git a/libraries/stdlib/test/collections/ListSpecificTest.kt b/libraries/stdlib/test/collections/ListSpecificTest.kt index 1f9d67f3ce4..4049fd8f956 100644 --- a/libraries/stdlib/test/collections/ListSpecificTest.kt +++ b/libraries/stdlib/test/collections/ListSpecificTest.kt @@ -1,6 +1,5 @@ package test.collections -import java.util.ArrayList import kotlin.test.* import org.junit.Test @@ -19,6 +18,17 @@ class ListSpecificTest { assertEquals(expected, actual) } + Test fun slice() { + val list = listOf('A', 'B', 'C', 'D') + // ABCD + // 0123 + assertEquals(listOf('B', 'C', 'D'), list.slice(1..3)) + assertEquals(listOf('D', 'C', 'B'), list.slice(3 downTo 1)) + + val iter = listOf(2, 0, 3) + assertEquals(listOf('C', 'A', 'D'), list.slice(iter)) + } + Test fun utils() { assertNull(empty.head) assertNull(empty.first) diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt index 50db17dc6d9..3672099f5c8 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/Filtering.kt @@ -264,5 +264,20 @@ fun filtering(): List { } } + templates add f("slice(indices: Iterable)") { + only(Lists, ArraysOfPrimitives, ArraysOfObjects) + doc { "Returns a list containing elements at specified positions" } + returns("List") + body { + """ + val list = ArrayList() + for (index in indices) { + list.add(get(index)) + } + return list + """ + } + } + return templates } \ No newline at end of file