Hi Kevin, That's definitely a useful reference, they are doing a lot of similar things. Thanks!
Cheers, Dan On Wednesday, 6 April 2016 12:44:30 UTC-3, Kevin Squire wrote: > > 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] > <javascript:>> 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 >>> >> >
