feat: add lazy skip and take methods to Sequence with SkipSequence and TakeSequence classes

Implement `skip(count)` and `take(count)` on the Sequence class, backed by new SkipSequence and TakeSequence wrapper classes that lazily skip or limit iteration. Includes documentation in the sequence module markdown, core source definitions, and unit tests for edge cases (zero, negative, and overflow counts).
This commit is contained in:
Bob Nystrom
2017-03-15 14:15:00 +00:00
5 changed files with 155 additions and 0 deletions
+28
View File
@@ -0,0 +1,28 @@
class TestSequence is Sequence {
construct new() {}
iterate(iterator) {
if (iterator == null) return 1
if (iterator == 3) return false
return iterator + 1
}
iteratorValue(iterator) { iterator }
}
var test = TestSequence.new().skip(0)
System.print(test is Sequence) // expect: true
System.print(test) // expect: instance of SkipSequence
// Skipping 0 changes nothing
System.print(test.toList) // expect: [1, 2, 3]
// Skipping 1 works
System.print(test.skip(1).toList) // expect: [2, 3]
// Skipping more than length of sequence produces empty list
System.print(test.skip(4).isEmpty) // expect: true
// Skipping less than 0 changes nothing
System.print(test.skip(-10).toList) // expect: [1, 2, 3]
+28
View File
@@ -0,0 +1,28 @@
class TestSequence is Sequence {
construct new() {}
iterate(iterator) {
if (iterator == null) return 1
if (iterator == 3) return false
return iterator + 1
}
iteratorValue(iterator) { iterator }
}
var test = TestSequence.new().take(3)
System.print(test is Sequence) // expect: true
System.print(test) // expect: instance of TakeSequence
// Taking 0 produces empty list
System.print(test.take(0).isEmpty) // expect: true
// Taking 1 works
System.print(test.take(1).toList) // expect: [1]
// Taking more than length of sequence produces whole sequence
System.print(test.take(4).toList) // expect: [1, 2, 3]
// Taking less than 0 produces empty list
System.print(test.take(-10).isEmpty) // expect: true