Class: RIO::Arraynge
Class Method Summary collapse
- .arraynge(mx, rng) ⇒ Object
- .diff(rl1, rl2) ⇒ Object
- .diff1(r1, r2) ⇒ Object
- .difflist(r, rl2) ⇒ Object
- .flatten_single(r) ⇒ Object
- .flatten_singles(rl) ⇒ Object
- .ml_arraynge(mx, ml) ⇒ Object
- .ml_diff(ml1, ml2) ⇒ Object
- .ml_diff2(ml1, ml2) ⇒ Object
- .ml_expand(ml) ⇒ Object
- .ml_reduce(ml) ⇒ Object
- .ml_to_ranges(rl) ⇒ Object
- .ml_to_singles(rl) ⇒ Object
- .range_to_singles(r) ⇒ Object
- .reduce(rl) ⇒ Object
- .reduce_ranges(r1, r2) ⇒ Object
Class Method Details
.arraynge(mx, rng) ⇒ Object
61 62 63 64 65 66 67 68 69 |
# File 'lib/rio/arraynge.rb', line 61 def self.arraynge(mx,rng) begr = rng.begin mxlim = (rng.exclude_end? ? mx.succ : mx) endr = (rng.end > mxlim ? mxlim : rng.end) endr = mx + rng.end + 1 if rng.end < 0 begr = mx + rng.begin + 1 if rng.begin < 0 return (1..0) if begr < 0 or endr <0 rng.exclude_end? ? (begr...endr) : (begr..endr) end |
.diff(rl1, rl2) ⇒ Object
111 112 113 114 115 116 117 118 119 |
# File 'lib/rio/arraynge.rb', line 111 def self.diff(rl1,rl2) rd1 = reduce(rl1) rd2 = reduce(rl2) ans = [] rd1.each do |r1| ans += difflist(r1,rd2) end ans end |
.diff1(r1, r2) ⇒ Object
129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'lib/rio/arraynge.rb', line 129 def self.diff1(r1,r2) ans = [] max2 = r2.exclude_end? ? r2.end-1 : r2.end if !r1.include?(r2.begin) and !r1.include?(max2) ans << r1 unless r2.include?(r1.begin) else max1 = r1.exclude_end? ? r1.end-1 : r1.end ans << (r1.begin...r2.begin) if r1.include?(r2.begin) and r1.begin != r2.begin ans << (max2.succ..max1) if r1.include?(max2) and max1 != max2 end ans end |
.difflist(r, rl2) ⇒ Object
121 122 123 124 125 126 127 |
# File 'lib/rio/arraynge.rb', line 121 def self.difflist(r,rl2) rl2.inject([r]) do |ans,r2| (0...ans.size).inject([]) do |newans,n| newans + diff1(ans[n],r2) end end end |
.flatten_single(r) ⇒ Object
42 43 44 45 |
# File 'lib/rio/arraynge.rb', line 42 def self.flatten_single(r) max = r.exclude_end? ? r.end-1 : r.end r.begin == max ? r.begin : r end |
.flatten_singles(rl) ⇒ Object
47 48 49 |
# File 'lib/rio/arraynge.rb', line 47 def self.flatten_singles(rl) rl.map{|r| flatten_single(r) } end |
.ml_arraynge(mx, ml) ⇒ Object
57 58 59 |
# File 'lib/rio/arraynge.rb', line 57 def self.ml_arraynge(mx,ml) ml.map{|rng| (rng.is_a?(::Range) ? arraynge(mx,rng) : rng)} end |
.ml_diff(ml1, ml2) ⇒ Object
97 98 99 100 101 102 |
# File 'lib/rio/arraynge.rb', line 97 def self.ml_diff(ml1,ml2) rl1 = ml_to_ranges(ml_reduce(ml1)) rl2 = ml_to_ranges(ml_reduce(ml2)) dl = diff(rl1,rl2) flatten_singles(dl) end |
.ml_diff2(ml1, ml2) ⇒ Object
104 105 106 107 108 109 |
# File 'lib/rio/arraynge.rb', line 104 def self.ml_diff2(ml1,ml2) el1 = (ml1) el2 = (ml2) dl = el1 - el2 ml_reduce(dl) end |
.ml_expand(ml) ⇒ Object
71 72 73 74 75 |
# File 'lib/rio/arraynge.rb', line 71 def self.(ml) rl = ml_to_ranges(ml) reduced_list = reduce(rl) ml_to_singles(reduced_list) end |
.ml_reduce(ml) ⇒ Object
51 52 53 54 55 |
# File 'lib/rio/arraynge.rb', line 51 def self.ml_reduce(ml) rl = ml_to_ranges(ml) reduced_list = reduce(rl) flatten_singles(reduced_list) end |
.ml_to_ranges(rl) ⇒ Object
28 29 30 |
# File 'lib/rio/arraynge.rb', line 28 def self.ml_to_ranges(rl) rl.map{|el| (Range === el) ? el : (el..el)} end |
.ml_to_singles(rl) ⇒ Object
32 33 34 35 36 |
# File 'lib/rio/arraynge.rb', line 32 def self.ml_to_singles(rl) rl.inject([]) do |ary,el| ary + (Range === el ? el.map{|rel| rel } : [el]) end end |
.range_to_singles(r) ⇒ Object
38 39 40 |
# File 'lib/rio/arraynge.rb', line 38 def self.range_to_singles(r) r.map{|s| s} end |
.reduce(rl) ⇒ Object
77 78 79 80 81 82 83 |
# File 'lib/rio/arraynge.rb', line 77 def self.reduce(rl) return rl if rl.empty? rl = rl.sort {|a,b| a.begin <=> b.begin} (1...rl.size).inject([rl[0]]) do |ans,i| ans[0...ans.size-1] + reduce_ranges(ans[-1],rl[i]) end end |
.reduce_ranges(r1, r2) ⇒ Object
85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/rio/arraynge.rb', line 85 def self.reduce_ranges(r1,r2) # requires that r2.min >= r1.min #puts("reduce_ranges(#{r1},#{r2})") max1 = r1.exclude_end? ? r1.end-1 : r1.end if (r1.begin..max1.succ).include?(r2.begin) max2 = r2.exclude_end? ? r2.end-1 : r2.end r1.include?(max2) ? [r1] : [(r1.begin..max2)] else [r1,r2] end end |