I did debate doing this, but went with the typealias as, the way I 
understood it, CIGARString would be a variable containing a reference, to a 
vector or CIGARS. When in my mind, where a String is thought of as the 
array of chars, so it should be with CIGARString, it is the array of 
CIGARS. 

I should mention I had failed in the past to provide my own show methods 
for arrays containing some types, which is - at the heart of the matter - 
what I'm trying to do; create my own show method for and array of CIGARs. 

I solved this problem with the addition of a write mime method. This 
solution was thanks to the wonderful D.C. Jones':

function writemime(io::IO, ::MIME{symbol("text/plain")}, cs::CIGARString)
    show(io, cs)
end






On Monday, August 17, 2015 at 12:25:44 AM UTC+1, Colin Bowers wrote:
>
> No. Apologies. I didn't read the question closely enough.
>
> However, upon closer reading, I cannot see any reason why you need 
> CIGARString to be a type alias. Wouldn't it make more sense for CIGARString 
> to also be its own type?
>
> type CIGARString
>     x::Vector{CIGAR}
> end
>
> I think this would solve all your problems in one hit and you would end up 
> with something that is more versatile than using a type alias... If you 
> want to treat an instance of CIGARString like you would any old vector, 
> then just overload the standard methods, e.g. getindex, setindex!, e.t.c.
>
> On 15 August 2015 at 09:26, Ben Ward <axolotl...@gmail.com <javascript:>> 
> wrote:
>
>> Would that work? The variable to be printed isn't fed in as the second 
>> option? 
>>
>>
>> On Wednesday, August 12, 2015 at 1:34:16 AM UTC+1, colint...@gmail.com 
>> wrote:
>>>
>>> Does the following work?
>>>
>>> function Base.show(io::IO, ::Type{CIGARString})
>>>     #your code here
>>> end
>>>
>>>
>>>
>>> On Tuesday, 11 August 2015 03:07:15 UTC+10, Ben Ward wrote:
>>>>
>>>> Hi, I have implemented a basic immutable type with a type alias for a 
>>>> vector of said type:
>>>>
>>>> immutable CIGAR
>>>>     OP::Operation
>>>>     Size::Int
>>>> end
>>>>
>>>>
>>>> function CIGAR(op::Char, size::Int)
>>>>     return CIGAR(Operation(op), size)
>>>> end
>>>>
>>>>
>>>> function convert(::Type{String}, cigar::CIGAR)
>>>>     return "$(cigar.Size)$(Char(cigar.OP))"
>>>> end
>>>>
>>>>
>>>> function show(io::IO, cigar::CIGAR)
>>>>     write(io, convert(String, cigar))
>>>> end
>>>>
>>>>
>>>> typealias CIGARString Vector{CIGAR}
>>>>
>>>>
>>>> function convert(::Type{CIGARString}, str::String)
>>>>     matches = matchall(r"(\d+)(\w)", str)
>>>>     cigarString = Vector{CIGAR}(length(matches))
>>>>     @inbounds for i in 1:length(matches)
>>>>         m = matches[i]
>>>>         cigarString[i] = CIGAR(m[end], parse(Int, m[1:end-1]))
>>>>     end
>>>>     return cigarString
>>>> end
>>>>
>>>>
>>>> macro cigar_str(str)
>>>>     return CIGARString(str)
>>>> end
>>>>
>>>> I also want to define a show method for the alias CIGARString, so as it 
>>>> is converted to a string that can be used with a show method:
>>>>
>>>> function convert(::Type{String}, cigarString::CIGARString)
>>>>     outString = ""
>>>>     for cigar in cigarString
>>>>         outString *= String(cigar)
>>>>     end
>>>>     return outString
>>>> end
>>>>
>>>>
>>>> function show(io::IO, cigarstr::CIGARString)
>>>>     write(io, convert(String, cigarstr))
>>>> end
>>>>
>>>> However the output a see on the REPL is:
>>>>
>>>> *3-element Array{Bio.Align.CIGAR,1}:*
>>>>
>>>> * 5M*
>>>>
>>>> * 5N*
>>>>
>>>> * 5M*
>>>>
>>>> So, rather than the show method for CIGARString being called, the show 
>>>> method for CIGAR is being called repeatedly for every element in the 
>>>> CIGARString vector. How do I get Julia to use the show method I want for 
>>>> CIGARString?
>>>>
>>>> Thanks.
>>>>
>>>
>

Reply via email to