func merge_streams(streams) { var s = streams.map { |stream| Pair(stream, stream.readline) }.grep {|p| defined(p.value) } gather { while (s) { var p = s.min_by { .value } take(p.value) p.value = (p.key.readline \\ s.delete_if { _ == p }) } } } say merge_streams(ARGV.map {|f| File(f).open_r }).join("\n")