This needs a lot more work to define a proper IO interface, but
struct Tee{TIO <: Tuple} <: IO
streams::TIO
end
Tee(streams...) = Tee(streams)
function _do_tee(tee, f, xs...)
for io in tee.streams
f(io, xs...)
end
end
Base.write(tee::Tee, x) = _do_tee(tee, write, x)
Base.write(tee::Tee, x::Union{SubString{String},String}) = _do_tee(tee, write, x)
print(Tee(stdout, stderr), "will appear twice")