Range modifications: Difference between revisions

Content added Content deleted
m (remove redundant parsing)
Line 214: Line 214:


function combine!(seq::RangeSequence, r2)
function combine!(seq::RangeSequence, r2)
if isempty(seq)
isempty(seq) && return push!(seq, r2)
push!(seq, r2)
r1 = seq[end]
if r2.stop > r1.stop
else
r1 = seq[end]
if r2.start <= r1.stop + 1
if r1.start > r2.start
seq[end] = r1.start:r2.stop
r1, r2 = r2, r1
else
end
push!(seq, r2)
if r2.stop > r1.stop
if r2.start <= r1.stop + 1
seq[end] = r1.start:r2.stop
else
push!(seq, r2)
end
end
end
end
end
Line 234: Line 228:
function parse(::Type{RangeSequence}, s)
function parse(::Type{RangeSequence}, s)
seq = UnitRange[]
seq = UnitRange[]
entries = split(s, r"\s*,\s*")
entries = sort!(split(s, r"\s*,\s*"))
for e in entries
for e in entries
startstop = split(e, r"\:|\-")
startstop = split(e, r"\:|\-")
Line 240: Line 234:
start, stop = tryparse(Int, startstop[1]), tryparse(Int, startstop[2])
start, stop = tryparse(Int, startstop[1]), tryparse(Int, startstop[2])
start, stop = start <= stop ? (start, stop) : (stop, start)
start, stop = start <= stop ? (start, stop) : (stop, start)
start != nothing && stop != nothing && combine!(seq, start:stop)
start != nothing && stop != nothing && push!(seq, start:stop)
elseif (n = tryparse(Int, startstop[1])) != nothing
elseif (n = tryparse(Int, startstop[1])) != nothing
combine!(seq, n:n)
push!(seq, n:n)
end
end
end
end
return sort!(seq)
return reduce(seq)
end
end


reduce(a::RangeSequence) = (seq = UnitRange[]; for r in sort!(a) combine!(seq, r) end; seq)
function insertinteger!(seq, n::Integer)
isempty(seq) && return push!(seq, n:n)
pos = findlast(x -> x.start <= n, seq)
if pos == nothing
if seq[1].start - n > 1
pushfirst!(seq, n:n)
else
r = popfirst!(seq)
pushfirst!(seq, UnitRange(n:r.stop))
end
else
newseq = vcat(combine!(seq[1:pos], n:n), seq[pos+1:end])
append!(empty!(seq), newseq)
end
return seq
end


reduce(a::RangeSequence) = begin seq = UnitRange[]; for r in a combine!(seq, r) end; seq end
insertinteger!(seq, n::Integer) = begin push!(seq, n:n); reduce(seq) end


function removeinteger!(seq, n::Integer)
function removeinteger!(seq, n::Integer)