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 <[email protected] <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, [email protected]
>> 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.
>>>>
>>>
>