core :: union_find
union–find algorithm using an efficient disjoint-set data structure
class FilterReader
	super Reader
	# Filter readed elements
	var stream: nullable Reader = null
	redef fun eof: Bool
	do
		assert stream != null
		return stream.eof
	end
end
class FilterWriter
	super Writer
	# Filter outputed elements
	var stream: nullable Writer = null
	# Can the stream be used to write
	redef fun is_writable: Bool
	do
		assert stream != null
		return stream.is_writable
	end
end
class StreamCat
	super FilterReader
	private var streams: Iterator[Reader]
	redef fun eof: Bool
	do
		if stream == null then
			return true
		else if stream.eof then
			stream.close
			stream = null
			return eof
		else
			return false
		end
	end
	redef fun stream: nullable Reader
	do
		var res = super
		if res == null and _streams.is_ok then
			res = _streams.item
			stream = res
			assert stream != null
			_streams.next
		end
		return res
	end
	redef fun read_char
	do
		assert not eof
		return stream.read_char
	end
	redef fun close
	do
		while stream != null do
			stream.close
			stream = null
		end
	end
	init with_streams(streams: Array[Reader])
	do
		_streams = streams.iterator
	end
	init(streams: Reader ...) is old_style_init do
		_streams = streams.iterator
	end
end
class StreamDemux
	super FilterWriter
	private var streams: Array[Writer]
	redef fun is_writable: Bool
	do
		if stream.is_writable then
			return true
		else
			for i in _streams
			do
				if i.is_writable then
					return true
				end
			end
			return false
		end
	end
	redef fun write(s: Text)
	do
		for i in _streams
		do
			stream = i
			if stream.is_writable then
				stream.write(s)
			end
		end
	end
	redef fun close
	do
		for i in _streams
		do
			stream = i
			stream.close
		end
	end
	init with_streams(streams: Array[Writer])
	do
		_streams = streams
	end
	init(streams: Writer ...) is old_style_init do
		_streams = streams
	end
end
lib/filter_stream/filter_stream.nit:14,1--139,3