Have you seen https://github.com/BioJulia/BufferedStreams.jl? Is that close to what you're trying to do?
Cheers, Kevin On Wed, Apr 6, 2016 at 7:23 AM, Daniel Arndt <[email protected]> wrote: > Great! that *seems* to work in my extremely limited testing so far, thanks > Milan! > > Please note that I have since identified the error in my constructor > (entirely unrelated to any issues)... it should read: > > NewIOType() = new(IOBuffer()) > > > > On Wednesday, 6 April 2016 11:06:17 UTC-3, Milan Bouchet-Valat wrote: >> >> Le mercredi 06 avril 2016 à 06:48 -0700, Daniel Arndt a écrit : >> > This is shorter than it looks, it's mostly code / output. Feel free >> > to skip to the tl;dr. >> > >> > I'm playing around with an idea where I've created a new type that >> > wraps an IOBuffer. >> > >> > This new type would hold some other information as well, but for it's >> > read/write operations, I wanted to just pass the calls on to the >> > encapsulated IOBuffer. I thought this would be fairly simple (as any >> > good programming story begins): >> > >> > import Base: write >> > >> > >> > type NewIOType <: IO >> > buffer::IOBuffer >> > some_other_stuff::Int >> > >> > new() = new(IOBuffer()) >> > end >> > >> > >> > write(io::NewIOType, x...) = write(io.buffer, x...) >> > >> > However, write seems to conflict with multiple other definitions: >> > >> > WARNING: New definition >> > write(Main.NewIOType, Any...) at In[1]:10 >> > is ambiguous with: >> > write(Base.IO, Base.Complex) at complex.jl:78. >> > To fix, define >> > write(Main.NewIOType, Base.Complex) >> > before the new definition. >> > WARNING: New definition >> > write(Main.NewIOType, Any...) at In[1]:10 >> > is ambiguous with: >> > write(Base.IO, Base.Rational) at rational.jl:66. >> > ... >> > and on and on >> > ... >> > >> > I understand the problem: Although my first parameter is more >> > specific, my second is not. In an exploratory move, I tried: >> > >> > write{T}(io::NewIOType, x::T) = write(io.buffer, x) >> > >> > Thinking that this would create a new write function for every type T >> > and therefore be more specific (I could use some clarity here, as >> > obviously my understanding is incorrect). I get this: >> > >> > WARNING: New definition >> > write(Main.NewIOType, #T<:Any) at In[1]:10 >> > is ambiguous with: >> > write(Base.IO, Base.Complex) at complex.jl:78. >> > To fix, define >> > write(Main.NewIOType, _<:Base.Complex) >> > before the new definition. >> > WARNING: New definition >> > write(Main.NewIOType, #T<:Any) at In[1]:10 >> > is ambiguous with: >> > write(Base.IO, Base.Rational) at rational.jl:66. >> > To fix, define >> > write(Main.NewIOType, _<:Base.Rational) >> > >> > tl;dr Can I wrap an IO instance, and pass all calls to 'write' to the >> > wrapped instance's version? >> > >> > I am entirely capable and aware of other approaches, so while I do >> > appreciate suggestions of alternative approaches, I am specifically >> > wondering if there is some mechanism that I'm missing that easily >> > overcomes this. >> I think you only need to provide write(s::NewIOType, x::UInt8). All >> higher-level write() methods will automatically use it. >> >> >> Regards >> >
