Added Sequence.take and Sequence.skip
These lazy iterator producing methods are useful when working with arbitrary sequences and you need to skip or take some number of elements at the start.
This commit is contained in:
@@ -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]
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user