JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / bin / jalview / util / MapList.js
1 Clazz.declarePackage ("jalview.util");\r
2 Clazz.load (["java.util.ArrayList"], "jalview.util.MapList", ["java.lang.StringBuilder", "java.util.Arrays"], function () {\r
3 c$ = Clazz.decorateAsClass (function () {\r
4 this.fromShifts = null;\r
5 this.toShifts = null;\r
6 this.fromRatio = 0;\r
7 this.toRatio = 0;\r
8 this.fromLowest = 0;\r
9 this.fromHighest = 0;\r
10 this.toLowest = 0;\r
11 this.toHighest = 0;\r
12 Clazz.instantialize (this, arguments);\r
13 }, jalview.util, "MapList");\r
14 Clazz.prepareFields (c$, function () {\r
15 this.fromShifts =  new java.util.ArrayList ();\r
16 this.toShifts =  new java.util.ArrayList ();\r
17 });\r
18 Clazz.overrideMethod (c$, "equals", \r
19 function (o) {\r
20 if (o == null || !(Clazz.instanceOf (o, jalview.util.MapList))) {\r
21 return false;\r
22 }var obj = o;\r
23 if (obj === this) {\r
24 return true;\r
25 }if (obj.fromRatio != this.fromRatio || obj.toRatio != this.toRatio || obj.fromShifts == null || obj.toShifts == null) {\r
26 return false;\r
27 }return java.util.Arrays.deepEquals (this.fromShifts.toArray (), obj.fromShifts.toArray ()) && java.util.Arrays.deepEquals (this.toShifts.toArray (), obj.toShifts.toArray ());\r
28 }, "~O");\r
29 Clazz.defineMethod (c$, "getFromRanges", \r
30 function () {\r
31 return this.fromShifts;\r
32 });\r
33 Clazz.defineMethod (c$, "getToRanges", \r
34 function () {\r
35 return this.toShifts;\r
36 });\r
37 c$.getRanges = Clazz.defineMethod (c$, "getRanges", \r
38 function (shifts) {\r
39 var rnges =  Clazz.newIntArray (2 * shifts.size (), 0);\r
40 var i = 0;\r
41 for (var r, $r = shifts.iterator (); $r.hasNext () && ((r = $r.next ()) || true);) {\r
42 rnges[i++] = r[0];\r
43 rnges[i++] = r[1];\r
44 }\r
45 return rnges;\r
46 }, "java.util.List");\r
47 Clazz.defineMethod (c$, "getFromRatio", \r
48 function () {\r
49 return this.fromRatio;\r
50 });\r
51 Clazz.defineMethod (c$, "getToRatio", \r
52 function () {\r
53 return this.toRatio;\r
54 });\r
55 Clazz.defineMethod (c$, "getFromLowest", \r
56 function () {\r
57 return this.fromLowest;\r
58 });\r
59 Clazz.defineMethod (c$, "getFromHighest", \r
60 function () {\r
61 return this.fromHighest;\r
62 });\r
63 Clazz.defineMethod (c$, "getToLowest", \r
64 function () {\r
65 return this.toLowest;\r
66 });\r
67 Clazz.defineMethod (c$, "getToHighest", \r
68 function () {\r
69 return this.toHighest;\r
70 });\r
71 Clazz.makeConstructor (c$, \r
72 function (from, to, fromRatio, toRatio) {\r
73 this.fromRatio = fromRatio;\r
74 this.toRatio = toRatio;\r
75 this.fromLowest = from[0];\r
76 this.fromHighest = from[1];\r
77 for (var i = 0; i < from.length; i += 2) {\r
78 this.fromLowest = Math.min (this.fromLowest, from[i]);\r
79 this.fromHighest = Math.max (this.fromHighest, from[i + 1]);\r
80 this.fromShifts.add ( Clazz.newIntArray (-1, [from[i], from[i + 1]]));\r
81 }\r
82 this.toLowest = to[0];\r
83 this.toHighest = to[1];\r
84 for (var i = 0; i < to.length; i += 2) {\r
85 this.toLowest = Math.min (this.toLowest, to[i]);\r
86 this.toHighest = Math.max (this.toHighest, to[i + 1]);\r
87 this.toShifts.add ( Clazz.newIntArray (-1, [to[i], to[i + 1]]));\r
88 }\r
89 }, "~A,~A,~N,~N");\r
90 Clazz.makeConstructor (c$, \r
91 function (map) {\r
92 this.fromLowest = map.fromLowest;\r
93 this.fromHighest = map.fromHighest;\r
94 this.toLowest = map.toLowest;\r
95 this.toHighest = map.toHighest;\r
96 this.fromRatio = map.fromRatio;\r
97 this.toRatio = map.toRatio;\r
98 if (map.fromShifts != null) {\r
99 for (var r, $r = map.fromShifts.iterator (); $r.hasNext () && ((r = $r.next ()) || true);) {\r
100 this.fromShifts.add ( Clazz.newIntArray (-1, [r[0], r[1]]));\r
101 }\r
102 }if (map.toShifts != null) {\r
103 for (var r, $r = map.toShifts.iterator (); $r.hasNext () && ((r = $r.next ()) || true);) {\r
104 this.toShifts.add ( Clazz.newIntArray (-1, [r[0], r[1]]));\r
105 }\r
106 }}, "jalview.util.MapList");\r
107 Clazz.makeConstructor (c$, \r
108 function (fromRange, toRange, fromRatio, toRatio) {\r
109 this.fromShifts = fromRange;\r
110 this.toShifts = toRange;\r
111 this.fromRatio = fromRatio;\r
112 this.toRatio = toRatio;\r
113 this.fromLowest = 2147483647;\r
114 this.fromHighest = 0;\r
115 for (var range, $range = fromRange.iterator (); $range.hasNext () && ((range = $range.next ()) || true);) {\r
116 this.fromLowest = Math.min (this.fromLowest, range[0]);\r
117 this.fromHighest = Math.max (this.fromHighest, range[1]);\r
118 }\r
119 this.toLowest = 2147483647;\r
120 this.toHighest = 0;\r
121 for (var range, $range = toRange.iterator (); $range.hasNext () && ((range = $range.next ()) || true);) {\r
122 this.toLowest = Math.min (this.toLowest, range[0]);\r
123 this.toHighest = Math.max (this.toHighest, range[1]);\r
124 }\r
125 }, "java.util.List,java.util.List,~N,~N");\r
126 Clazz.defineMethod (c$, "makeFromMap", \r
127 function () {\r
128 return this.posMap (this.fromShifts, this.fromRatio, this.toShifts, this.toRatio);\r
129 });\r
130 Clazz.defineMethod (c$, "makeToMap", \r
131 function () {\r
132 return this.posMap (this.toShifts, this.toRatio, this.fromShifts, this.fromRatio);\r
133 });\r
134 Clazz.defineMethod (c$, "posMap", \r
135 ($fz = function (shiftTo, ratio, shiftFrom, toRatio) {\r
136 var iv = 0;\r
137 var ivSize = shiftTo.size ();\r
138 if (iv >= ivSize) {\r
139 return null;\r
140 }var intv = shiftTo.get (iv++);\r
141 var from = intv[0];\r
142 var to = intv[1];\r
143 if (from > to) {\r
144 from = intv[1];\r
145 to = intv[0];\r
146 }while (iv < ivSize) {\r
147 intv = shiftTo.get (iv++);\r
148 if (intv[0] < from) {\r
149 from = intv[0];\r
150 }if (intv[1] < from) {\r
151 from = intv[1];\r
152 }if (intv[0] > to) {\r
153 to = intv[0];\r
154 }if (intv[1] > to) {\r
155 to = intv[1];\r
156 }}\r
157 var tF = 0;\r
158 var tT = 0;\r
159 var mp =  Clazz.newIntArray (to - from + 2, 0);\r
160 for (var i = 0; i < mp.length; i++) {\r
161 var m = jalview.util.MapList.shift (i + from, shiftTo, ratio, shiftFrom, toRatio);\r
162 if (m != null) {\r
163 if (i == 0) {\r
164 tF = tT = m[0];\r
165 } else {\r
166 if (m[0] < tF) {\r
167 tF = m[0];\r
168 }if (m[0] > tT) {\r
169 tT = m[0];\r
170 }}}mp[i] = m;\r
171 }\r
172 var map =  Clazz.newArray (-1, [ Clazz.newIntArray (-1, [from, to, tF, tT]),  Clazz.newIntArray (to - from + 2, 0)]);\r
173 map[0][2] = tF;\r
174 map[0][3] = tT;\r
175 for (var i = 0; i < mp.length; i++) {\r
176 if (mp[i] != null) {\r
177 map[1][i] = mp[i][0] - tF;\r
178 } else {\r
179 map[1][i] = -1;\r
180 }}\r
181 return map;\r
182 }, $fz.isPrivate = true, $fz), "java.util.List,~N,java.util.List,~N");\r
183 Clazz.defineMethod (c$, "shiftFrom", \r
184 function (pos) {\r
185 return jalview.util.MapList.shift (pos, this.fromShifts, this.fromRatio, this.toShifts, this.toRatio);\r
186 }, "~N");\r
187 Clazz.defineMethod (c$, "shiftTo", \r
188 function (pos) {\r
189 return jalview.util.MapList.shift (pos, this.toShifts, this.toRatio, this.fromShifts, this.fromRatio);\r
190 }, "~N");\r
191 c$.shift = Clazz.defineMethod (c$, "shift", \r
192 function (pos, shiftTo, fromRatio, shiftFrom, toRatio) {\r
193 var fromCount = jalview.util.MapList.countPos (shiftTo, pos);\r
194 if (fromCount == null) {\r
195 return null;\r
196 }var fromRemainder = (fromCount[0] - 1) % fromRatio;\r
197 var toCount = 1 + ((Clazz.doubleToInt ((fromCount[0] - 1) / fromRatio)) * toRatio);\r
198 var toPos = jalview.util.MapList.countToPos (shiftFrom, toCount);\r
199 if (toPos == null) {\r
200 return null;\r
201 }return  Clazz.newIntArray (-1, [toPos[0], fromRemainder, toPos[1]]);\r
202 }, "~N,java.util.List,~N,java.util.List,~N");\r
203 c$.countPos = Clazz.defineMethod (c$, "countPos", \r
204 function (shiftTo, pos) {\r
205 var count = 0;\r
206 var intv;\r
207 var iv = 0;\r
208 var ivSize = shiftTo.size ();\r
209 while (iv < ivSize) {\r
210 intv = shiftTo.get (iv++);\r
211 if (intv[0] <= intv[1]) {\r
212 if (pos >= intv[0] && pos <= intv[1]) {\r
213 return  Clazz.newIntArray (-1, [count + pos - intv[0] + 1, 1]);\r
214 } else {\r
215 count += intv[1] - intv[0] + 1;\r
216 }} else {\r
217 if (pos >= intv[1] && pos <= intv[0]) {\r
218 return  Clazz.newIntArray (-1, [count + intv[0] - pos + 1, -1]);\r
219 } else {\r
220 count += intv[0] - intv[1] + 1;\r
221 }}}\r
222 return null;\r
223 }, "java.util.List,~N");\r
224 c$.countToPos = Clazz.defineMethod (c$, "countToPos", \r
225 function (shiftFrom, pos) {\r
226 var count = 0;\r
227 var diff = 0;\r
228 var iv = 0;\r
229 var ivSize = shiftFrom.size ();\r
230 var intv =  Clazz.newIntArray (-1, [0, 0]);\r
231 while (iv < ivSize) {\r
232 intv = shiftFrom.get (iv++);\r
233 diff = intv[1] - intv[0];\r
234 if (diff >= 0) {\r
235 if (pos <= count + 1 + diff) {\r
236 return  Clazz.newIntArray (-1, [pos - count - 1 + intv[0], 1]);\r
237 } else {\r
238 count += 1 + diff;\r
239 }} else {\r
240 if (pos <= count + 1 - diff) {\r
241 return  Clazz.newIntArray (-1, [intv[0] - (pos - count - 1), -1]);\r
242 } else {\r
243 count += 1 - diff;\r
244 }}}\r
245 return null;\r
246 }, "java.util.List,~N");\r
247 Clazz.defineMethod (c$, "locateInFrom", \r
248 function (start, end) {\r
249 var fromStart = this.shiftTo (start);\r
250 var fromEnd = this.shiftTo (end);\r
251 return jalview.util.MapList.getIntervals (this.fromShifts, fromStart, fromEnd, this.fromRatio);\r
252 }, "~N,~N");\r
253 Clazz.defineMethod (c$, "locateInTo", \r
254 function (start, end) {\r
255 var toStart = this.shiftFrom (start);\r
256 var toEnd = this.shiftFrom (end);\r
257 return jalview.util.MapList.getIntervals (this.toShifts, toStart, toEnd, this.toRatio);\r
258 }, "~N,~N");\r
259 c$.getIntervals = Clazz.defineMethod (c$, "getIntervals", \r
260 function (shiftFrom, fromStart, fromEnd, fromRatio2) {\r
261 if (fromStart == null || fromEnd == null) {\r
262 return null;\r
263 }var startpos;\r
264 var endpos;\r
265 startpos = fromStart[0];\r
266 endpos = fromEnd[0];\r
267 var endindx = (fromRatio2 - 1);\r
268 var intv = 0;\r
269 var intvSize = shiftFrom.size ();\r
270 var iv;\r
271 var i = 0;\r
272 var fs = -1;\r
273 var fe_s = -1;\r
274 var fe = -1;\r
275 while (intv < intvSize && (fs == -1 || fe == -1)) {\r
276 iv = shiftFrom.get (intv++);\r
277 if (fe_s > -1) {\r
278 endpos = iv[0];\r
279 endindx--;\r
280 }if (iv[0] <= iv[1]) {\r
281 if (fs == -1 && startpos >= iv[0] && startpos <= iv[1]) {\r
282 fs = i;\r
283 }if (endpos >= iv[0] && endpos <= iv[1]) {\r
284 if (fe_s == -1) {\r
285 fe_s = i;\r
286 }if (fe_s != -1) {\r
287 if (endpos + endindx <= iv[1]) {\r
288 fe = i;\r
289 endpos = endpos + endindx;\r
290 } else {\r
291 endindx -= iv[1] - endpos;\r
292 }}}} else {\r
293 if (fs == -1 && startpos <= iv[0] && startpos >= iv[1]) {\r
294 fs = i;\r
295 }if (endpos <= iv[0] && endpos >= iv[1]) {\r
296 if (fe_s == -1) {\r
297 fe_s = i;\r
298 }if (fe_s != -1) {\r
299 if (endpos - endindx >= iv[1]) {\r
300 fe = i;\r
301 endpos = endpos - endindx;\r
302 } else {\r
303 endindx -= endpos - iv[1];\r
304 }}}}i++;\r
305 }\r
306 if (fs == fe && fe == -1) {\r
307 return null;\r
308 }var ranges =  new java.util.ArrayList ();\r
309 if (fs <= fe) {\r
310 intv = fs;\r
311 i = fs;\r
312 iv = shiftFrom.get (intv++);\r
313 iv =  Clazz.newIntArray (-1, [iv[0], iv[1]]);\r
314 if (i == fs) {\r
315 iv[0] = startpos;\r
316 }while (i != fe) {\r
317 ranges.add (iv);\r
318 iv = shiftFrom.get (intv++);\r
319 iv =  Clazz.newIntArray (-1, [iv[0], iv[1]]);\r
320 i++;\r
321 }\r
322 if (i == fe) {\r
323 iv[1] = endpos;\r
324 }ranges.add (iv);\r
325 } else {\r
326 i = shiftFrom.size () - 1;\r
327 while (i > fs) {\r
328 i--;\r
329 }\r
330 iv = shiftFrom.get (i);\r
331 iv =  Clazz.newIntArray (-1, [iv[1], iv[0]]);\r
332 if (i == fs) {\r
333 iv[0] = startpos;\r
334 }while (--i != fe) {\r
335 ranges.add (iv);\r
336 iv = shiftFrom.get (i);\r
337 iv =  Clazz.newIntArray (-1, [iv[1], iv[0]]);\r
338 }\r
339 if (i == fe) {\r
340 iv[1] = endpos;\r
341 }ranges.add (iv);\r
342 }var range = null;\r
343 if (ranges != null && ranges.size () > 0) {\r
344 range =  Clazz.newIntArray (ranges.size () * 2, 0);\r
345 intv = 0;\r
346 intvSize = ranges.size ();\r
347 i = 0;\r
348 while (intv < intvSize) {\r
349 iv = ranges.get (intv);\r
350 range[i++] = iv[0];\r
351 range[i++] = iv[1];\r
352 ranges.set (intv++, null);\r
353 }\r
354 }return range;\r
355 }, "java.util.List,~A,~A,~N");\r
356 Clazz.defineMethod (c$, "getToPosition", \r
357 function (mpos) {\r
358 var mp = this.shiftTo (mpos);\r
359 if (mp != null) {\r
360 return mp[0];\r
361 }return mpos;\r
362 }, "~N");\r
363 Clazz.defineMethod (c$, "getToWord", \r
364 function (mpos) {\r
365 var mp = this.shiftTo (mpos);\r
366 if (mp != null) {\r
367 return  Clazz.newIntArray (-1, [mp[0], mp[0] + mp[2] * (this.getFromRatio () - 1)]);\r
368 }return null;\r
369 }, "~N");\r
370 Clazz.defineMethod (c$, "getMappedPosition", \r
371 function (pos) {\r
372 var mp = this.shiftFrom (pos);\r
373 if (mp != null) {\r
374 return mp[0];\r
375 }return pos;\r
376 }, "~N");\r
377 Clazz.defineMethod (c$, "getMappedWord", \r
378 function (pos) {\r
379 var mp = this.shiftFrom (pos);\r
380 if (mp != null) {\r
381 return  Clazz.newIntArray (-1, [mp[0], mp[0] + mp[2] * (this.getToRatio () - 1)]);\r
382 }return null;\r
383 }, "~N");\r
384 Clazz.defineMethod (c$, "getInverse", \r
385 function () {\r
386 return  new jalview.util.MapList (this.getToRanges (), this.getFromRanges (), this.getToRatio (), this.getFromRatio ());\r
387 });\r
388 Clazz.defineMethod (c$, "containsEither", \r
389 function (local, map) {\r
390 if (local) {\r
391 return ((this.getFromLowest () >= map.getFromLowest () && this.getFromHighest () <= map.getFromHighest ()) || (this.getFromLowest () <= map.getFromLowest () && this.getFromHighest () >= map.getFromHighest ()));\r
392 } else {\r
393 return ((this.getToLowest () >= map.getToLowest () && this.getToHighest () <= map.getToHighest ()) || (this.getToLowest () <= map.getToLowest () && this.getToHighest () >= map.getToHighest ()));\r
394 }}, "~B,jalview.util.MapList");\r
395 Clazz.overrideMethod (c$, "toString", \r
396 function () {\r
397 var sb =  new StringBuilder (64);\r
398 sb.append ("From (").append (this.fromRatio).append (":").append (this.toRatio).append (") [");\r
399 for (var shift, $shift = this.fromShifts.iterator (); $shift.hasNext () && ((shift = $shift.next ()) || true);) {\r
400 sb.append (" ").append (java.util.Arrays.toString (shift));\r
401 }\r
402 sb.append (" ] To [");\r
403 for (var shift, $shift = this.toShifts.iterator (); $shift.hasNext () && ((shift = $shift.next ()) || true);) {\r
404 sb.append (" ").append (java.util.Arrays.toString (shift));\r
405 }\r
406 sb.append (" ]");\r
407 return sb.toString ();\r
408 });\r
409 });\r