package innovimax.mixthem.io;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.stream.IntStream;

public class MultiChannelCharReader implements IMultiChannelCharInput {
	
	private final List<ICharInput> readers = new ArrayList<ICharInput>();
	
	/**
	* Constructor
	* @param inputs The list of inputs as InputResource
	* @param selection The input index selection (maybe empty)
	* @see innovimax.mixthem.io.InputResource
	*/
	public MultiChannelCharReader(final List<InputResource> inputs, final Set<Integer> selection) {
		IntStream.range(0, inputs.size())
			.filter(index -> selection.contains(Integer.valueOf(index)))
			.mapToObj(index -> inputs.get(index))
			.forEach(input -> {
				try {
					this.readers.add(new DefaultCharReader(input));
				} catch (IOException e) {
					throw new RuntimeException(e);
				}
			});
	}
	
	@Override
	public boolean hasCharacter() throws IOException {
		final Iterator<ICharInput> iterator = this.readers.iterator();
		while (iterator.hasNext()) {
			final ICharInput reader = iterator.next();
			if (reader.hasCharacter()) {
				return true;
			}
		}
		return false;
	}
	
	@Override
	public int[] nextCharacterRange() throws IOException {
		final int[] chars = new int[this.readers.size()];
		int channel = 0;
		final Iterator<ICharInput> iterator = this.readers.iterator();
		while (iterator.hasNext()) {
			final ICharInput reader = iterator.next();
			final int c = reader.nextCharacter();
			chars[channel++] = c;
		}
		return chars;
	}

	@Override
	public void close() throws IOException {
		final Iterator<ICharInput> iterator = this.readers.iterator();
		while (iterator.hasNext()) {
			final ICharInput reader = iterator.next();
			reader.close();
		}		
	}
	
}

@@ -612,16 +612,237 @@
 tion) %7B%0A
+%09%09if (selection.isEmpty()) %7B%0A%09%09%09inputs.stream().forEach(input -%3E %7B%0A%09%09%09%09try %7B%0A%09%09%09%09%09this.readers.add(new DefaultByteReader(input));%0A%09%09%09%09%7D catch (IOException e) %7B%0A%09%09%09%09%09throw new RuntimeException(e);%0A%09%09%09%09%7D%0A%09%09%09%7D);%0A%09%09%7D else %7B%0A%09
 %09%09IntStr
@@ -869,16 +869,17 @@
 size())%0A
+%09
 %09%09%09.filt
@@ -937,16 +937,17 @@
 x)))%0A%09%09%09
+%09
 .mapToOb
@@ -976,16 +976,17 @@
 index))%0A
+%09
 %09%09%09.forE
@@ -996,38 +996,40 @@
 (input -%3E %7B%0A%09%09%09%09
+%09
 try %7B%0A
+%09
 %09%09%09%09%09this.reader
@@ -1057,32 +1057,33 @@
 Reader(input));%0A
+%09
 %09%09%09%09%7D catch (IOE
@@ -1093,32 +1093,33 @@
 ption e) %7B%0A%09%09%09%09%09
+%09
 throw new Runtim
@@ -1137,25 +1137,31 @@
 e);%0A%09%09%09%09
+%09
 %7D%0A
+%09
 %09%09%09%7D);%0A
+%09%09%7D%0A
 %09%7D%0A%09%0A%09@O

Update MultiChannelCharReader.java