windowed function: add default parameters, drop or keep partial windows, KEEP-11

Make step default to 1.
Add partialWindows boolean parameter defaulting to false to control
whether to keep partial windows in the end.
This commit is contained in:
Ilya Gorbunov
2017-07-27 00:57:58 +03:00
parent c04b0072af
commit 559255f38e
17 changed files with 336 additions and 142 deletions
@@ -167,23 +167,36 @@ abstract class OrderedIterableTests<T : Iterable<String>>(createFrom: (Array<out
val size = 7
val data = createFrom(Array(size) { "$it" })
val result = data.windowed(4, 2)
assertEquals(listOf(
listOf("0", "1", "2", "3"),
listOf("2", "3", "4", "5")
), result)
val resultPartial = data.windowed(4, 2, partialWindows = true)
assertEquals(listOf(
listOf("0", "1", "2", "3"),
listOf("2", "3", "4", "5"),
listOf("4", "5", "6"),
listOf("6")
), result)
), resultPartial)
val result2 = data.windowed(2, 3) { it.joinToString("") }
assertEquals(listOf("01", "34", "6"), result2)
assertEquals(listOf("01", "34"), result2)
assertEquals(data.chunked(2), data.windowed(2, 2))
val result2partial = data.windowed(2, 3, partialWindows = true) { it.joinToString("") }
assertEquals(listOf("01", "34", "6"), result2partial)
assertEquals(data.chunked(2), data.windowed(2, 2, partialWindows = true))
assertEquals(data.take(2), data.windowed(2, size).single())
assertEquals(data.take(3), data.windowed(3, size + 3).single())
val result3 = data.windowed(size, 1)
result3.forEachIndexed { index, window ->
assertEquals(data.toList(), data.windowed(size, 1).single())
assertTrue(data.windowed(size + 1, 1).isEmpty())
val result3partial = data.windowed(size, 1, partialWindows = true)
result3partial.forEachIndexed { index, window ->
assertEquals(size - index, window.size, "size of window#$index")
}
@@ -259,23 +259,36 @@ public class SequenceTest {
val seq = infiniteSeq.take(7)
val result1 = seq.windowed(4, 2)
assertEquals(listOf(
listOf(0, 1, 2, 3),
listOf(2, 3, 4, 5)
), result1.toList())
val result1partial = seq.windowed(4, 2, partialWindows = true)
assertEquals(listOf(
listOf(0, 1, 2, 3),
listOf(2, 3, 4, 5),
listOf(4, 5, 6),
listOf(6)
), result1.toList())
), result1partial.toList())
val result2 = seq.windowed(2, 3) { it.joinToString("") }
assertEquals(listOf("01", "34", "6"), result2.toList())
assertEquals(listOf("01", "34"), result2.toList())
assertEquals(seq.chunked(2).toList(), seq.windowed(2, 2).toList())
val result2partial = seq.windowed(2, 3, partialWindows = true) { it.joinToString("") }
assertEquals(listOf("01", "34", "6"), result2partial.toList())
assertEquals(seq.chunked(2).toList(), seq.windowed(2, 2, partialWindows = true).toList())
assertEquals(seq.take(2).toList(), seq.windowed(2, size).single())
assertEquals(seq.take(3).toList(), seq.windowed(3, size + 3).single())
val result3 = seq.windowed(size, 1)
result3.forEachIndexed { index, window ->
assertEquals(seq.toList(), seq.windowed(size, 1).single())
assertTrue(seq.windowed(size + 1, 1).none())
val result3partial = seq.windowed(size, 1, partialWindows = true)
result3partial.forEachIndexed { index, window ->
assertEquals(size - index, window.size, "size of window#$index")
}
+19 -7
View File
@@ -884,18 +884,27 @@ class StringTest {
val size = 7
val data = arg1("abcdefg")
val result = data.windowed(4, 2)
assertEquals(listOf("abcd", "cdef", "efg", "g"), result)
assertEquals(listOf("abcd", "cdef"), result)
val resultPartial = data.windowed(4, 2, partialWindows = true)
assertEquals(listOf("abcd", "cdef", "efg", "g"), resultPartial)
val result2 = data.windowed(2, 3) { it.reversed().toString() }
assertEquals(listOf("ba", "ed", "g"), result2)
assertEquals(listOf("ba", "ed"), result2)
val result2partial = data.windowed(2, 3, partialWindows = true) { it.reversed().toString() }
assertEquals(listOf("ba", "ed", "g"), result2partial)
assertEquals(data.chunked(2), data.windowed(2, 2))
assertEquals(data.chunked(2), data.windowed(2, 2, partialWindows = true))
assertEquals(data.take(2), data.windowed(2, size).single())
assertEquals(data.take(3), data.windowed(3, size + 3).single())
val result3 = data.windowed(size, 1)
result3.forEachIndexed { index, window ->
assertEquals(data.toString(), data.windowed(size, 1).single())
assertTrue(data.windowed(size + 1, 1).isEmpty())
val result3partial = data.windowed(size, 1, partialWindows = true)
result3partial.forEachIndexed { index, window ->
assertEquals(size - index, window.length, "size of window#$index")
}
@@ -907,8 +916,11 @@ class StringTest {
}
for (window in 1..size + 1) {
for (step in 1..size + 1)
compare(data.windowed(window, step).iterator(), data.windowedSequence(window, step).iterator()) { iteratorBehavior() }
for (step in 1..size + 1) {
compare(data.windowed(window, step).iterator(), data.windowedSequence(window, step).iterator()) { iteratorBehavior() }
compare(data.windowed(window, step, partialWindows = true).iterator(),
data.windowedSequence(window, step, partialWindows = true).iterator()) { iteratorBehavior() }
}
}
}