@wener/utils 1.1.56 → 1.1.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,36 +1,278 @@
1
- import { expect, test } from "vitest";
2
- import { createRandom } from "./random.js";
3
- test("createRandom", function () {
4
- var random = createRandom(0);
5
- expect(random.random(100)).toBe(47);
6
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7
- try {
8
- for (var _iterator = random[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
9
- var a = _step.value;
10
- expect(a).toBe(0.557133817113936);
11
- break;
12
- }
13
- }
14
- catch (err) {
15
- _didIteratorError = true;
16
- _iteratorError = err;
17
- }
18
- finally {
1
+ function _array_like_to_array(arr, len) {
2
+ if (len == null || len > arr.length)
3
+ len = arr.length;
4
+ for (var i = 0, arr2 = new Array(len); i < len; i++)
5
+ arr2[i] = arr[i];
6
+ return arr2;
7
+ }
8
+ function _array_without_holes(arr) {
9
+ if (Array.isArray(arr))
10
+ return _array_like_to_array(arr);
11
+ }
12
+ function _iterable_to_array(iter) {
13
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
14
+ return Array.from(iter);
15
+ }
16
+ function _non_iterable_spread() {
17
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
18
+ }
19
+ function _to_consumable_array(arr) {
20
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
21
+ }
22
+ function _unsupported_iterable_to_array(o, minLen) {
23
+ if (!o)
24
+ return;
25
+ if (typeof o === "string")
26
+ return _array_like_to_array(o, minLen);
27
+ var n = Object.prototype.toString.call(o).slice(8, -1);
28
+ if (n === "Object" && o.constructor)
29
+ n = o.constructor.name;
30
+ if (n === "Map" || n === "Set")
31
+ return Array.from(n);
32
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))
33
+ return _array_like_to_array(o, minLen);
34
+ }
35
+ import { describe, expect, test } from "vitest";
36
+ import { createRandom, resolveRandom } from "./random.js";
37
+ describe("createRandom", function () {
38
+ test("deterministic with same seed", function () {
39
+ var r1 = createRandom(12345);
40
+ var r2 = createRandom(12345);
41
+ expect(r1.random()).toBe(r2.random());
42
+ expect(r1.randomInt(100)).toBe(r2.randomInt(100));
43
+ });
44
+ test("random() returns [0, 1)", function () {
45
+ var r = createRandom(0);
46
+ for (var i = 0; i < 100; i++) {
47
+ var v = r.random();
48
+ expect(v).toBeGreaterThanOrEqual(0);
49
+ expect(v).toBeLessThan(1);
50
+ }
51
+ });
52
+ test("random(a) returns [0, a)", function () {
53
+ var r = createRandom(42);
54
+ for (var i = 0; i < 100; i++) {
55
+ var v = r.random(50);
56
+ expect(v).toBeGreaterThanOrEqual(0);
57
+ expect(v).toBeLessThan(50);
58
+ }
59
+ });
60
+ test("random(a, b) returns [a, b)", function () {
61
+ var r = createRandom(42);
62
+ for (var i = 0; i < 100; i++) {
63
+ var v = r.random(10, 20);
64
+ expect(v).toBeGreaterThanOrEqual(10);
65
+ expect(v).toBeLessThan(20);
66
+ }
67
+ });
68
+ test("randomInt(max) returns [0, max]", function () {
69
+ var r = createRandom(42);
70
+ var results = new Set();
71
+ for (var i = 0; i < 1000; i++) {
72
+ var v = r.randomInt(5);
73
+ expect(v).toBeGreaterThanOrEqual(0);
74
+ expect(v).toBeLessThanOrEqual(5);
75
+ expect(Number.isInteger(v)).toBe(true);
76
+ results.add(v);
77
+ }
78
+ // should hit all values 0-5
79
+ expect(results.size).toBe(6);
80
+ });
81
+ test("randomInt(min, max) returns [min, max]", function () {
82
+ var r = createRandom(42);
83
+ var results = new Set();
84
+ for (var i = 0; i < 1000; i++) {
85
+ var v = r.randomInt(10, 15);
86
+ expect(v).toBeGreaterThanOrEqual(10);
87
+ expect(v).toBeLessThanOrEqual(15);
88
+ expect(Number.isInteger(v)).toBe(true);
89
+ results.add(v);
90
+ }
91
+ // should hit all values 10-15
92
+ expect(results.size).toBe(6);
93
+ });
94
+ test("shuffle", function () {
95
+ var r = createRandom(42);
96
+ var arr = [
97
+ 1,
98
+ 2,
99
+ 3,
100
+ 4,
101
+ 5
102
+ ];
103
+ var shuffled = r.shuffle(_to_consumable_array(arr));
104
+ expect(shuffled).toHaveLength(5);
105
+ expect(shuffled.sort()).toEqual(arr);
106
+ });
107
+ test("sample", function () {
108
+ var r = createRandom(42);
109
+ var arr = [
110
+ 1,
111
+ 2,
112
+ 3,
113
+ 4,
114
+ 5,
115
+ 6,
116
+ 7,
117
+ 8,
118
+ 9,
119
+ 10
120
+ ];
121
+ var sampled = r.sample(arr, 3);
122
+ expect(sampled).toHaveLength(3);
123
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
124
+ try {
125
+ // all sampled items should be from original array
126
+ for (var _iterator = sampled[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
127
+ var v = _step.value;
128
+ expect(arr).toContain(v);
129
+ }
130
+ }
131
+ catch (err) {
132
+ _didIteratorError = true;
133
+ _iteratorError = err;
134
+ }
135
+ finally {
136
+ try {
137
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
138
+ _iterator.return();
139
+ }
140
+ }
141
+ finally {
142
+ if (_didIteratorError) {
143
+ throw _iteratorError;
144
+ }
145
+ }
146
+ }
147
+ // no duplicates
148
+ expect(new Set(sampled).size).toBe(3);
149
+ });
150
+ test("sample with n >= arr.length returns shuffled copy", function () {
151
+ var r = createRandom(42);
152
+ var arr = [
153
+ 1,
154
+ 2,
155
+ 3
156
+ ];
157
+ var sampled = r.sample(arr, 5);
158
+ expect(sampled).toHaveLength(3);
159
+ expect(sampled.sort()).toEqual(arr);
160
+ });
161
+ test("pick", function () {
162
+ var r = createRandom(42);
163
+ var arr = [
164
+ 1,
165
+ 2,
166
+ 3,
167
+ 4,
168
+ 5
169
+ ];
170
+ var picked = r.pick(arr);
171
+ expect(arr).toContain(picked);
172
+ });
173
+ test("reset restores initial state", function () {
174
+ var r = createRandom(42);
175
+ var first = r.random();
176
+ r.random();
177
+ r.random();
178
+ r.reset();
179
+ expect(r.random()).toBe(first);
180
+ });
181
+ test("reset with new seed", function () {
182
+ var r = createRandom(42);
183
+ r.reset(100);
184
+ var r2 = createRandom(100);
185
+ expect(r.random()).toBe(r2.random());
186
+ });
187
+ test("reset with string seed", function () {
188
+ var r = createRandom(42);
189
+ r.reset("hello");
190
+ var r2 = createRandom("hello");
191
+ expect(r.random()).toBe(r2.random());
192
+ });
193
+ test("seed property", function () {
194
+ var r = createRandom(12345);
195
+ expect(r.seed).toBe(12345);
196
+ });
197
+ test("string seed", function () {
198
+ var r1 = createRandom("test-seed");
199
+ var r2 = createRandom("test-seed");
200
+ expect(r1.random()).toBe(r2.random());
201
+ });
202
+ test("randomBytes(n) returns Uint8Array of length n", function () {
203
+ var r = createRandom(42);
204
+ var bytes = r.randomBytes(16);
205
+ expect(bytes).toBeInstanceOf(Uint8Array);
206
+ expect(bytes.length).toBe(16);
207
+ });
208
+ test("randomBytes fills provided buffer", function () {
209
+ var r = createRandom(42);
210
+ var buf = new Uint8Array(8);
211
+ var result = r.randomBytes(buf);
212
+ expect(result).toBe(buf);
213
+ // should not be all zeros
214
+ expect(buf.some(function (v) {
215
+ return v !== 0;
216
+ })).toBe(true);
217
+ });
218
+ test("randomBytes is deterministic", function () {
219
+ var r1 = createRandom(42);
220
+ var r2 = createRandom(42);
221
+ expect(r1.randomBytes(16)).toEqual(r2.randomBytes(16));
222
+ });
223
+ test("randomBytes handles non-multiple of 4", function () {
224
+ var r = createRandom(42);
225
+ var bytes1 = r.randomBytes(1);
226
+ expect(bytes1.length).toBe(1);
227
+ var r2 = createRandom(42);
228
+ var bytes5 = r2.randomBytes(5);
229
+ expect(bytes5.length).toBe(5);
230
+ var r3 = createRandom(42);
231
+ var bytes7 = r3.randomBytes(7);
232
+ expect(bytes7.length).toBe(7);
233
+ });
234
+ test("randomBytes produces values in range 0-255", function () {
235
+ var r = createRandom(42);
236
+ var bytes = r.randomBytes(1000);
237
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
19
238
  try {
20
- if (!_iteratorNormalCompletion && _iterator.return != null) {
21
- _iterator.return();
239
+ for (var _iterator = bytes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
240
+ var b = _step.value;
241
+ expect(b).toBeGreaterThanOrEqual(0);
242
+ expect(b).toBeLessThanOrEqual(255);
22
243
  }
23
244
  }
245
+ catch (err) {
246
+ _didIteratorError = true;
247
+ _iteratorError = err;
248
+ }
24
249
  finally {
25
- if (_didIteratorError) {
26
- throw _iteratorError;
250
+ try {
251
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
252
+ _iterator.return();
253
+ }
254
+ }
255
+ finally {
256
+ if (_didIteratorError) {
257
+ throw _iteratorError;
258
+ }
27
259
  }
28
260
  }
29
- }
30
- expect(random.randomBytes(4)).toEqual(Uint8Array.from([
31
- 163,
32
- 85,
33
- 196,
34
- 62
35
- ]));
261
+ });
262
+ });
263
+ describe("resolveRandom", function () {
264
+ test("returns existing RNG", function () {
265
+ var r = createRandom(42);
266
+ expect(resolveRandom(r)).toBe(r);
267
+ });
268
+ test("creates RNG from number seed", function () {
269
+ var r = resolveRandom(42);
270
+ var r2 = createRandom(42);
271
+ expect(r.random()).toBe(r2.random());
272
+ });
273
+ test("creates RNG from string seed", function () {
274
+ var r = resolveRandom("test");
275
+ var r2 = createRandom("test");
276
+ expect(r.random()).toBe(r2.random());
277
+ });
36
278
  });
@@ -1,174 +1,188 @@
1
- function _define_property(obj, key, value) {
2
- if (key in obj) {
3
- Object.defineProperty(obj, key, {
4
- value: value,
5
- enumerable: true,
6
- configurable: true,
7
- writable: true
8
- });
9
- } else {
10
- obj[key] = value;
11
- }
12
- return obj;
1
+ function _array_like_to_array(arr, len) {
2
+ if (len == null || len > arr.length) len = arr.length;
3
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
4
+ return arr2;
13
5
  }
14
- function _ts_generator(thisArg, body) {
15
- var f, y, t, _ = {
16
- label: 0,
17
- sent: function() {
18
- if (t[0] & 1) throw t[1];
19
- return t[1];
20
- },
21
- trys: [],
22
- ops: []
23
- }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
24
- return d(g, "next", {
25
- value: verb(0)
26
- }), d(g, "throw", {
27
- value: verb(1)
28
- }), d(g, "return", {
29
- value: verb(2)
30
- }), typeof Symbol === "function" && d(g, Symbol.iterator, {
31
- value: function() {
32
- return this;
33
- }
34
- }), g;
35
- function verb(n) {
36
- return function(v) {
37
- return step([
38
- n,
39
- v
40
- ]);
41
- };
42
- }
43
- function step(op) {
44
- if (f) throw new TypeError("Generator is already executing.");
45
- while(g && (g = 0, op[0] && (_ = 0)), _)try {
46
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
47
- if (y = 0, t) op = [
48
- op[0] & 2,
49
- t.value
50
- ];
51
- switch(op[0]){
52
- case 0:
53
- case 1:
54
- t = op;
55
- break;
56
- case 4:
57
- _.label++;
58
- return {
59
- value: op[1],
60
- done: false
61
- };
62
- case 5:
63
- _.label++;
64
- y = op[1];
65
- op = [
66
- 0
67
- ];
68
- continue;
69
- case 7:
70
- op = _.ops.pop();
71
- _.trys.pop();
72
- continue;
73
- default:
74
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
75
- _ = 0;
76
- continue;
77
- }
78
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
79
- _.label = op[1];
80
- break;
81
- }
82
- if (op[0] === 6 && _.label < t[1]) {
83
- _.label = t[1];
84
- t = op;
85
- break;
86
- }
87
- if (t && _.label < t[2]) {
88
- _.label = t[2];
89
- _.ops.push(op);
90
- break;
91
- }
92
- if (t[2]) _.ops.pop();
93
- _.trys.pop();
94
- continue;
95
- }
96
- op = body.call(thisArg, _);
97
- } catch (e) {
98
- op = [
99
- 6,
100
- e
101
- ];
102
- y = 0;
103
- } finally{
104
- f = t = 0;
6
+ function _array_without_holes(arr) {
7
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
8
+ }
9
+ function _iterable_to_array(iter) {
10
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
11
+ }
12
+ function _non_iterable_spread() {
13
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
14
+ }
15
+ function _to_consumable_array(arr) {
16
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
17
+ }
18
+ function _unsupported_iterable_to_array(o, minLen) {
19
+ if (!o) return;
20
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
21
+ var n = Object.prototype.toString.call(o).slice(8, -1);
22
+ if (n === "Object" && o.constructor) n = o.constructor.name;
23
+ if (n === "Map" || n === "Set") return Array.from(n);
24
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
25
+ }
26
+ function resolveSeed() {
27
+ var seed = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : Date.now();
28
+ var v = 0;
29
+ if (typeof seed === 'number') {
30
+ v = seed;
31
+ } else {
32
+ seed = String(seed);
33
+ for(var i = 0; i < seed.length; i++){
34
+ v = Math.imul(31, v) + seed.charCodeAt(i) | 0;
105
35
  }
106
- if (op[0] & 5) throw op[1];
107
- return {
108
- value: op[0] ? op[1] : void 0,
109
- done: true
110
- };
111
36
  }
37
+ // uint32
38
+ v = v >>> 0;
39
+ return v;
112
40
  }
113
- // LCG pseudo random
114
- export function createRandom() {
115
- var _seed = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : Date.now();
116
- var seed = 0;
117
- if (typeof _seed === 'string') {
118
- for(var i = 0; i < _seed.length; i++){
119
- seed = Math.imul(31, seed) + _seed.charCodeAt(i) | 0;
41
+ export function createRandom(s) {
42
+ // seealso https://github.com/skeeto/rng-js/blob/master/rng.js
43
+ var initialSeed = resolveSeed(s);
44
+ var rng = createXorshift128plus(initialSeed);
45
+ var random = function(a, b) {
46
+ var r = rng.next();
47
+ if (a !== undefined && b !== undefined) {
48
+ return r * (b - a) + a;
120
49
  }
121
- } else if (typeof _seed === 'number') {
122
- seed = _seed;
123
- }
124
- // int32
125
- seed = seed >>> 0;
126
- // alternative 梅森旋转算法 (Mersenne Twister), Xorshift
127
- // LCG
128
- var m = 0x80000000; // 2^31
129
- var a = 1664525;
130
- var c = 1013904223;
131
- var random = function(n) {
132
- seed = (a * seed + c) % m;
133
- var r = seed / m;
134
- if (n) {
135
- r = Math.floor(r * n);
50
+ if (a !== undefined) {
51
+ return r * a;
136
52
  }
137
53
  return r;
138
54
  };
139
- var randomBytes = function(length) {
140
- var bytes = new Uint8Array(length);
141
- for(var i = 0; i < length; i++){
142
- bytes[i] = Math.floor(random() * 256);
55
+ var randomInt = function(min, max) {
56
+ if (max === undefined) {
57
+ max = min;
58
+ min = 0;
143
59
  }
144
- return bytes;
60
+ return Math.floor(random(min, max + 1));
145
61
  };
146
- return _define_property({
147
- random: random,
148
- randomBytes: randomBytes
149
- }, Symbol.iterator, function() {
150
- return _ts_generator(this, function(_state) {
151
- switch(_state.label){
152
- case 0:
153
- if (!true) return [
154
- 3,
155
- 2
156
- ];
157
- return [
158
- 4,
159
- random()
160
- ];
161
- case 1:
162
- _state.sent();
163
- return [
164
- 3,
165
- 0
166
- ];
167
- case 2:
168
- return [
169
- 2
170
- ];
62
+ var shuffle = function(arr) {
63
+ // Fisher-Yates shuffle
64
+ for(var i = arr.length - 1; i > 0; i--){
65
+ var j = randomInt(0, i);
66
+ var tmp = arr[i];
67
+ arr[i] = arr[j];
68
+ arr[j] = tmp;
69
+ }
70
+ return arr;
71
+ };
72
+ var sample = function(arr, n) {
73
+ if (n >= arr.length) {
74
+ return shuffle(_to_consumable_array(arr));
75
+ }
76
+ // 使用 partial Fisher-Yates
77
+ var copy = _to_consumable_array(arr);
78
+ var result = [];
79
+ for(var i = 0; i < n; i++){
80
+ var j = randomInt(i, copy.length - 1);
81
+ var tmp = copy[i];
82
+ copy[i] = copy[j];
83
+ copy[j] = tmp;
84
+ result.push(copy[i]);
85
+ }
86
+ return result;
87
+ };
88
+ var pick = function(arr) {
89
+ return arr[randomInt(0, arr.length - 1)];
90
+ };
91
+ var randomBytes = function(input) {
92
+ var buf = typeof input === 'number' ? new Uint8Array(input) : input;
93
+ var len = buf.length;
94
+ // 每次 nextInt32 产生 4 字节
95
+ var i = 0;
96
+ while(i + 4 <= len){
97
+ var v = rng.nextInt32();
98
+ buf[i] = v & 0xff;
99
+ buf[i + 1] = v >>> 8 & 0xff;
100
+ buf[i + 2] = v >>> 16 & 0xff;
101
+ buf[i + 3] = v >>> 24 & 0xff;
102
+ i += 4;
103
+ }
104
+ // 处理剩余字节
105
+ if (i < len) {
106
+ var v1 = rng.nextInt32();
107
+ for(var j = 0; i < len; i++, j++){
108
+ buf[i] = v1 >>> j * 8 & 0xff;
171
109
  }
172
- });
173
- });
110
+ }
111
+ return buf;
112
+ };
113
+ return {
114
+ random: random,
115
+ randomInt: randomInt,
116
+ randomBytes: randomBytes,
117
+ shuffle: shuffle,
118
+ sample: sample,
119
+ pick: pick,
120
+ reset: function(seed) {
121
+ return rng.reset(seed !== undefined ? resolveSeed(seed) : undefined);
122
+ },
123
+ get seed () {
124
+ return rng.seed;
125
+ }
126
+ };
127
+ }
128
+ export function resolveRandom() {
129
+ var r = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : Date.now();
130
+ if (typeof r !== 'string' && typeof r !== 'number') {
131
+ return r;
132
+ }
133
+ return createRandom(r);
134
+ }
135
+ /**
136
+ * xorshift128+ 算法
137
+ * 周期: 2^128 - 1,统计特性优于 LCG
138
+ * 参考: https://prng.di.unimi.it/
139
+ */ function createXorshift128plus(seed) {
140
+ var initialSeed = seed;
141
+ // 使用 SplitMix64 风格初始化两个状态
142
+ var s0 = seed >>> 0;
143
+ var s1 = seed * 1812433253 + 1 >>> 0;
144
+ // 确保状态非零
145
+ if (s0 === 0) s0 = 0xdeadbeef;
146
+ if (s1 === 0) s1 = 0xcafebabe;
147
+ var nextInt32 = function() {
148
+ // xorshift128+ 核心算法(32位简化版)
149
+ var x = s0;
150
+ var y = s1;
151
+ s0 = y;
152
+ x ^= x << 23;
153
+ x ^= x >>> 17;
154
+ x ^= y;
155
+ x ^= y >>> 26;
156
+ s1 = x >>> 0;
157
+ // 返回 uint32
158
+ return s0 + s1 >>> 0;
159
+ };
160
+ // 32 位精度 [0, 1)
161
+ var nextFloat = function() {
162
+ return nextInt32() / 0x100000000;
163
+ };
164
+ // 53 位精度 [0, 1),两次迭代组合
165
+ var nextDouble = function() {
166
+ var hi = nextInt32() >>> 11; // 21 位
167
+ var lo = nextInt32(); // 32 位
168
+ return hi / (1 << 21) + lo / ((1 << 21) * 0x100000000);
169
+ };
170
+ var next = nextFloat;
171
+ var reset = function() {
172
+ var newSeed = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : initialSeed;
173
+ s0 = newSeed >>> 0;
174
+ s1 = newSeed * 1812433253 + 1 >>> 0;
175
+ if (s0 === 0) s0 = 0xdeadbeef;
176
+ if (s1 === 0) s1 = 0xcafebabe;
177
+ };
178
+ return {
179
+ next: next,
180
+ nextFloat: nextFloat,
181
+ nextDouble: nextDouble,
182
+ nextInt32: nextInt32,
183
+ reset: reset,
184
+ get seed () {
185
+ return initialSeed;
186
+ }
187
+ };
174
188
  }
@@ -1,4 +1,3 @@
1
- var _this = this;
2
1
  /**
3
2
  * isomorphic globalThis
4
3
  *
@@ -13,6 +12,5 @@ var _this = this;
13
12
  if (typeof self !== 'undefined') return self;
14
13
  if (typeof window !== 'undefined') return window;
15
14
  if (typeof global !== 'undefined') return global;
16
- if (typeof _this !== 'undefined') return _this;
17
15
  throw new Error('Unable to locate global `this`');
18
16
  };