Skip to content

Commit

Permalink
add slice with unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Rico Schiekel committed Feb 19, 2009
1 parent 12ea7cb commit 61c5b46
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 0 deletions.
65 changes: 65 additions & 0 deletions src/main/java/de/downgra/jitertools/JIterTools.java
Expand Up @@ -619,4 +619,69 @@ public static <T> Iterable<T> ncycles(final Iterable<T> iterable,
final int n) {
return chain(repeat(iterable, n));
}

public static <T> Iterable<T> slice(final Iterable<T> iterable,
final int stop) {
return slice(iterable, 0, stop, 1);
}

public static <T> Iterable<T> slice(final Iterable<T> iterable,
final int start, final int stop) {
return slice(iterable, start, stop, 1);
}

public static <T> Iterable<T> slice(final Iterable<T> iterable,
final int start, final int stop, final int step) {
assert step > 0;
assert start <= stop;
return new Iterable<T>() {
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
final Iterator<Integer> _counter = range(start, stop < 0 ? Integer.MAX_VALUE : stop, step)
.iterator();
final Iterator<Pair<Integer, T>> _iterator = enumerate(
iterable).iterator();
Integer _current_counter = _counter.hasNext() ? _counter
.next() : null;
T _last = null;

private final void consume() {
if (_last == null) {
while (_iterator.hasNext()
&& _current_counter != null) {
Pair<Integer, T> p = _iterator.next();
if (p.getFirst() == _current_counter) {
_last = p.getSecond();
if (_counter.hasNext()) {
_current_counter = _counter.next();
}
return;
}
}
}
}

@Override
public boolean hasNext() {
consume();
return _last != null;
}

@Override
public T next() {
consume();
T ret = _last;
_last = null;
return ret;
}

@Override
public void remove() {
}
};
}
};
}

}
48 changes: 48 additions & 0 deletions src/test/java/de/downgra/jitertools/TestSlice.java
@@ -0,0 +1,48 @@
package de.downgra.jitertools;

import static de.downgra.jitertools.JIterTools.list;
import static de.downgra.jitertools.JIterTools.range;
import static de.downgra.jitertools.JIterTools.slice;
import static org.junit.Assert.assertArrayEquals;

import java.util.ArrayList;

import org.junit.Test;

public class TestSlice {

@Test
public void stop() {
assertArrayEquals(new Integer[] { 0, 1, 2, 3, 4 }, list(
slice(range(10), 5)).toArray());
assertArrayEquals(new Integer[] {}, list(slice(range(10), 0)).toArray());
assertArrayEquals(new Integer[] { 3, 4, 5 },
list(slice(range(3, 6), 3)).toArray());
}

@Test
public void startStop() {
assertArrayEquals(new Integer[] { 2, 3, 4 }, list(
slice(range(10), 2, 5)).toArray());
assertArrayEquals(new Integer[] {}, list(slice(range(10), 0, 0))
.toArray());
}

@Test
public void startStopStep() {
assertArrayEquals(new Integer[] { 2, 4, 6 }, list(
slice(range(10), 2, 8, 2)).toArray());
}

@Test
public void empty() {
assertArrayEquals(new Integer[] {}, list(
slice(new ArrayList<Integer>(), 2)).toArray());
}

@Test
public void noStop() {
assertArrayEquals(new Integer[] { 0, 33, 66, 99 }, list(
slice(range(100), 0, -1, 33)).toArray());
}
}

0 comments on commit 61c5b46

Please sign in to comment.