1 | import { factory } from '../../utils/factory.js';
|
2 | var name = 'Spa';
|
3 | var dependencies = ['addScalar', 'equalScalar', 'FibonacciHeap'];
|
4 | export var createSpaClass = factory(name, dependencies, _ref => {
|
5 | var {
|
6 | addScalar,
|
7 | equalScalar,
|
8 | FibonacciHeap
|
9 | } = _ref;
|
10 |
|
11 | |
12 |
|
13 |
|
14 |
|
15 | function Spa() {
|
16 | if (!(this instanceof Spa)) {
|
17 | throw new SyntaxError('Constructor must be called with the new operator');
|
18 | }
|
19 |
|
20 |
|
21 | this._values = [];
|
22 | this._heap = new FibonacciHeap();
|
23 | }
|
24 | |
25 |
|
26 |
|
27 |
|
28 |
|
29 | Spa.prototype.type = 'Spa';
|
30 | Spa.prototype.isSpa = true;
|
31 | |
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 | Spa.prototype.set = function (i, v) {
|
39 |
|
40 | if (!this._values[i]) {
|
41 |
|
42 | var node = this._heap.insert(i, v);
|
43 |
|
44 |
|
45 | this._values[i] = node;
|
46 | } else {
|
47 |
|
48 | this._values[i].value = v;
|
49 | }
|
50 | };
|
51 |
|
52 | Spa.prototype.get = function (i) {
|
53 | var node = this._values[i];
|
54 |
|
55 | if (node) {
|
56 | return node.value;
|
57 | }
|
58 |
|
59 | return 0;
|
60 | };
|
61 |
|
62 | Spa.prototype.accumulate = function (i, v) {
|
63 |
|
64 | var node = this._values[i];
|
65 |
|
66 | if (!node) {
|
67 |
|
68 | node = this._heap.insert(i, v);
|
69 |
|
70 | this._values[i] = node;
|
71 | } else {
|
72 |
|
73 | node.value = addScalar(node.value, v);
|
74 | }
|
75 | };
|
76 |
|
77 | Spa.prototype.forEach = function (from, to, callback) {
|
78 |
|
79 | var heap = this._heap;
|
80 | var values = this._values;
|
81 |
|
82 | var nodes = [];
|
83 |
|
84 | var node = heap.extractMinimum();
|
85 |
|
86 | if (node) {
|
87 | nodes.push(node);
|
88 | }
|
89 |
|
90 |
|
91 | while (node && node.key <= to) {
|
92 |
|
93 | if (node.key >= from) {
|
94 |
|
95 | if (!equalScalar(node.value, 0)) {
|
96 |
|
97 | callback(node.key, node.value, this);
|
98 | }
|
99 | }
|
100 |
|
101 |
|
102 | node = heap.extractMinimum();
|
103 |
|
104 | if (node) {
|
105 | nodes.push(node);
|
106 | }
|
107 | }
|
108 |
|
109 |
|
110 | for (var i = 0; i < nodes.length; i++) {
|
111 |
|
112 | var n = nodes[i];
|
113 |
|
114 | node = heap.insert(n.key, n.value);
|
115 |
|
116 | values[node.key] = node;
|
117 | }
|
118 | };
|
119 |
|
120 | Spa.prototype.swap = function (i, j) {
|
121 |
|
122 | var nodei = this._values[i];
|
123 | var nodej = this._values[j];
|
124 |
|
125 | if (!nodei && nodej) {
|
126 |
|
127 | nodei = this._heap.insert(i, nodej.value);
|
128 |
|
129 | this._heap.remove(nodej);
|
130 |
|
131 |
|
132 | this._values[i] = nodei;
|
133 | this._values[j] = undefined;
|
134 | } else if (nodei && !nodej) {
|
135 |
|
136 | nodej = this._heap.insert(j, nodei.value);
|
137 |
|
138 | this._heap.remove(nodei);
|
139 |
|
140 |
|
141 | this._values[j] = nodej;
|
142 | this._values[i] = undefined;
|
143 | } else if (nodei && nodej) {
|
144 |
|
145 | var v = nodei.value;
|
146 | nodei.value = nodej.value;
|
147 | nodej.value = v;
|
148 | }
|
149 | };
|
150 |
|
151 | return Spa;
|
152 | }, {
|
153 | isClass: true
|
154 | }); |
\ | No newline at end of file |