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