Jump to content

Range modifications: Difference between revisions

m
remove redundant parsing
m (remove redundant parsing)
Line 214:
 
function combine!(seq::RangeSequence, r2)
if isempty(seq) && return push!(seq, r2)
r1 = push!(seq, r2)[end]
if r2.stop > r1.stop
else
r1if r2.start <= seq[end]r1.stop + 1
if seq[end] = r1.start > :r2.startstop
r1, r2 = r2, r1else
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
Line 234 ⟶ 228:
function parse(::Type{RangeSequence}, s)
seq = UnitRange[]
entries = sort!(split(s, r"\s*,\s*"))
for e in entries
startstop = split(e, r"\:|\-")
Line 240 ⟶ 234:
start, stop = tryparse(Int, startstop[1]), tryparse(Int, startstop[2])
start, stop = start <= stop ? (start, stop) : (stop, start)
start != nothing && stop != nothing && combinepush!(seq, start:stop)
elseif (n = tryparse(Int, startstop[1])) != nothing
combinepush!(seq, n:n)
end
end
return sort!reduce(seq)
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
 
reduceinsertinteger!(aseq, n::RangeSequenceInteger) = begin seq = UnitRange[]; for r in a combinepush!(seq, rn:n) end; reduce(seq) end
 
function removeinteger!(seq, n::Integer)
4,105

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.