package org.core4j;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.util.Iterator;
public class Enumerables {
public static Enumerable<String> lines(final InputStream stream) {
final ThrowingFunc<Reader> source = new ThrowingFunc<Reader>() {
public Reader apply() throws Exception {
return new InputStreamReader(stream);
}
};
return Enumerable.createFromIterator(new Func<Iterator<String>>() {
public Iterator<String> apply() {
return new ReaderLinesIterator(source);
}
});
}
public static Enumerable<Character> chars(String value) {
return chars(value.toCharArray());
}
public static Enumerable<Character> chars(char[] chars) {
Character[] rt = new Character[chars.length];
for (int i = 0; i < chars.length; i++) {
rt[i] = chars[i];
}
return Enumerable.create(rt);
}
public static Enumerable<String> lines(final URL url) {
final ThrowingFunc<Reader> source = new ThrowingFunc<Reader>() {
public Reader apply() throws Exception {
return new InputStreamReader(url.openStream());
}
};
return Enumerable.createFromIterator(new Func<Iterator<String>>() {
public Iterator<String> apply() {
return new ReaderLinesIterator(source);
}
});
}
public static Enumerable<String> lines(final File file) {
final ThrowingFunc<Reader> source = new ThrowingFunc<Reader>() {
public Reader apply() throws Exception {
return new FileReader(file);
}
};
return Enumerable.createFromIterator(new Func<Iterator<String>>() {
public Iterator<String> apply() {
return new ReaderLinesIterator(source);
}
});
}
private static class ReaderLinesIterator extends ReadOnlyIterator<String> {
private final ThrowingFunc<Reader> readerSource;
public ReaderLinesIterator(ThrowingFunc<Reader> readerSource) {
this.readerSource = readerSource;
}
private BufferedReader reader;
@Override
protected IterationResult<String> advance() throws Exception {
if (reader == null) {
reader = new BufferedReader(readerSource.apply());
}
String line = reader.readLine();
if (line == null) {
reader.close();
return IterationResult.done();
}
return IterationResult.next(line);
}
}
}