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) |
||
isempty(seq) && return push!(seq, r2) |
|||
r1 = seq[end] |
|||
⚫ | |||
else |
|||
if r2.start <= r1.stop + 1 |
|||
seq[end] = r1.start:r2.stop |
|||
else |
|||
push!(seq, r2) |
|||
⚫ | |||
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 && |
start != nothing && stop != nothing && push!(seq, start:stop) |
||
elseif (n = tryparse(Int, startstop[1])) != nothing |
elseif (n = tryparse(Int, startstop[1])) != nothing |
||
push!(seq, n:n) |
|||
end |
end |
||
end |
end |
||
return |
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 |
|||
insertinteger!(seq, n::Integer) = begin push!(seq, n:n); reduce(seq) end |
|||
function removeinteger!(seq, n::Integer) |
function removeinteger!(seq, n::Integer) |