Class: RIO::Arraynge

Inherits:
Object show all
Defined in:
lib/rio/arraynge.rb

Class Method Summary collapse

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 = ml_expand(ml1)
  el2 = ml_expand(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_expand(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