@bitblit/ratchet-common 4.0.80-alpha
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.
- package/dist/cjs/2d/line-2d.js +2 -0
- package/dist/cjs/2d/plane-2d.js +2 -0
- package/dist/cjs/2d/point-2d.js +2 -0
- package/dist/cjs/2d/poly-line-2d.js +2 -0
- package/dist/cjs/2d/ratchet-2d.js +250 -0
- package/dist/cjs/build/build-information.js +2 -0
- package/dist/cjs/build/ratchet-common-info.js +18 -0
- package/dist/cjs/histogram/histogram-entry.js +2 -0
- package/dist/cjs/histogram/histogram.js +54 -0
- package/dist/cjs/index.js +74 -0
- package/dist/cjs/jwt/common-jwt-token.js +2 -0
- package/dist/cjs/jwt/expired-jwt-handling.js +9 -0
- package/dist/cjs/jwt/jwt-ratchet-like.js +2 -0
- package/dist/cjs/jwt/jwt-ratchet.js +164 -0
- package/dist/cjs/jwt/jwt-token-base.js +2 -0
- package/dist/cjs/lang/array-ratchet.js +87 -0
- package/dist/cjs/lang/base64-ratchet.js +49 -0
- package/dist/cjs/lang/boolean-ratchet.js +49 -0
- package/dist/cjs/lang/composite-last-success-provider.js +28 -0
- package/dist/cjs/lang/date-ratchet.js +33 -0
- package/dist/cjs/lang/duration-ratchet.js +46 -0
- package/dist/cjs/lang/enum-ratchet.js +34 -0
- package/dist/cjs/lang/error-ratchet.js +49 -0
- package/dist/cjs/lang/expiring-object.js +68 -0
- package/dist/cjs/lang/geolocation-ratchet.js +267 -0
- package/dist/cjs/lang/global-ratchet.js +48 -0
- package/dist/cjs/lang/key-value.js +6 -0
- package/dist/cjs/lang/last-success-provider.js +2 -0
- package/dist/cjs/lang/map-ratchet.js +168 -0
- package/dist/cjs/lang/no.js +8 -0
- package/dist/cjs/lang/number-ratchet.js +156 -0
- package/dist/cjs/lang/parsed-url.js +2 -0
- package/dist/cjs/lang/promise-ratchet.js +142 -0
- package/dist/cjs/lang/require-ratchet.js +60 -0
- package/dist/cjs/lang/stop-watch.js +117 -0
- package/dist/cjs/lang/string-ratchet.js +195 -0
- package/dist/cjs/lang/time-zone-ratchet.js +80 -0
- package/dist/cjs/lang/timeout-token.js +19 -0
- package/dist/cjs/lang/transform-ratchet.js +70 -0
- package/dist/cjs/logger/classic-single-line-log-message-formatter.js +18 -0
- package/dist/cjs/logger/log-message-builder.js +51 -0
- package/dist/cjs/logger/log-message-format-type.js +9 -0
- package/dist/cjs/logger/log-message-formatter.js +2 -0
- package/dist/cjs/logger/log-message-processor.js +2 -0
- package/dist/cjs/logger/log-message.js +2 -0
- package/dist/cjs/logger/log-snapshot.js +2 -0
- package/dist/cjs/logger/logger-instance.js +207 -0
- package/dist/cjs/logger/logger-level-name.js +12 -0
- package/dist/cjs/logger/logger-meta.js +2 -0
- package/dist/cjs/logger/logger-options.js +2 -0
- package/dist/cjs/logger/logger-output-function.js +9 -0
- package/dist/cjs/logger/logger-ring-buffer.js +76 -0
- package/dist/cjs/logger/logger-util.js +49 -0
- package/dist/cjs/logger/logger.js +139 -0
- package/dist/cjs/logger/none-log-message-formatter.js +9 -0
- package/dist/cjs/logger/structured-json-log-message-formatter.js +24 -0
- package/dist/cjs/network/browser-local-ip-provider.js +25 -0
- package/dist/cjs/network/fixed-local-ip-provider.js +12 -0
- package/dist/cjs/network/local-ip-provider.js +2 -0
- package/dist/cjs/network/network-ratchet.js +106 -0
- package/dist/cjs/stream/buffer-writable.js +20 -0
- package/dist/cjs/stream/stream-ratchet.js +72 -0
- package/dist/cjs/stream/string-writable.js +18 -0
- package/dist/cjs/third-party/google/google-recaptcha-ratchet.js +33 -0
- package/dist/cjs/third-party/twilio/twilio-ratchet.js +75 -0
- package/dist/cjs/transform/built-in-transforms.js +195 -0
- package/dist/cjs/transform/transform-rule.js +2 -0
- package/dist/cjs/tx/transaction-configuration.js +2 -0
- package/dist/cjs/tx/transaction-final-state.js +9 -0
- package/dist/cjs/tx/transaction-ratchet.js +80 -0
- package/dist/cjs/tx/transaction-result.js +2 -0
- package/dist/cjs/tx/transaction-step.js +2 -0
- package/dist/es/2d/line-2d.js +1 -0
- package/dist/es/2d/plane-2d.js +1 -0
- package/dist/es/2d/point-2d.js +1 -0
- package/dist/es/2d/poly-line-2d.js +1 -0
- package/dist/es/2d/ratchet-2d.js +245 -0
- package/dist/es/build/build-information.js +1 -0
- package/dist/es/build/ratchet-common-info.js +14 -0
- package/dist/es/histogram/histogram-entry.js +1 -0
- package/dist/es/histogram/histogram.js +50 -0
- package/dist/es/index.js +71 -0
- package/dist/es/jwt/common-jwt-token.js +1 -0
- package/dist/es/jwt/expired-jwt-handling.js +6 -0
- package/dist/es/jwt/jwt-ratchet-like.js +1 -0
- package/dist/es/jwt/jwt-ratchet.js +159 -0
- package/dist/es/jwt/jwt-token-base.js +1 -0
- package/dist/es/lang/array-ratchet.js +83 -0
- package/dist/es/lang/base64-ratchet.js +45 -0
- package/dist/es/lang/boolean-ratchet.js +45 -0
- package/dist/es/lang/composite-last-success-provider.js +24 -0
- package/dist/es/lang/date-ratchet.js +29 -0
- package/dist/es/lang/duration-ratchet.js +42 -0
- package/dist/es/lang/enum-ratchet.js +30 -0
- package/dist/es/lang/error-ratchet.js +44 -0
- package/dist/es/lang/expiring-object.js +63 -0
- package/dist/es/lang/geolocation-ratchet.js +263 -0
- package/dist/es/lang/global-ratchet.js +43 -0
- package/dist/es/lang/key-value.js +2 -0
- package/dist/es/lang/last-success-provider.js +1 -0
- package/dist/es/lang/map-ratchet.js +164 -0
- package/dist/es/lang/no.js +4 -0
- package/dist/es/lang/number-ratchet.js +152 -0
- package/dist/es/lang/parsed-url.js +1 -0
- package/dist/es/lang/promise-ratchet.js +138 -0
- package/dist/es/lang/require-ratchet.js +56 -0
- package/dist/es/lang/stop-watch.js +113 -0
- package/dist/es/lang/string-ratchet.js +191 -0
- package/dist/es/lang/time-zone-ratchet.js +76 -0
- package/dist/es/lang/timeout-token.js +15 -0
- package/dist/es/lang/transform-ratchet.js +66 -0
- package/dist/es/logger/classic-single-line-log-message-formatter.js +13 -0
- package/dist/es/logger/log-message-builder.js +47 -0
- package/dist/es/logger/log-message-format-type.js +6 -0
- package/dist/es/logger/log-message-formatter.js +1 -0
- package/dist/es/logger/log-message-processor.js +1 -0
- package/dist/es/logger/log-message.js +1 -0
- package/dist/es/logger/log-snapshot.js +1 -0
- package/dist/es/logger/logger-instance.js +201 -0
- package/dist/es/logger/logger-level-name.js +9 -0
- package/dist/es/logger/logger-meta.js +1 -0
- package/dist/es/logger/logger-options.js +1 -0
- package/dist/es/logger/logger-output-function.js +6 -0
- package/dist/es/logger/logger-ring-buffer.js +72 -0
- package/dist/es/logger/logger-util.js +44 -0
- package/dist/es/logger/logger.js +134 -0
- package/dist/es/logger/none-log-message-formatter.js +5 -0
- package/dist/es/logger/structured-json-log-message-formatter.js +19 -0
- package/dist/es/network/browser-local-ip-provider.js +21 -0
- package/dist/es/network/fixed-local-ip-provider.js +8 -0
- package/dist/es/network/local-ip-provider.js +1 -0
- package/dist/es/network/network-ratchet.js +102 -0
- package/dist/es/stream/buffer-writable.js +16 -0
- package/dist/es/stream/stream-ratchet.js +68 -0
- package/dist/es/stream/string-writable.js +14 -0
- package/dist/es/third-party/google/google-recaptcha-ratchet.js +28 -0
- package/dist/es/third-party/twilio/twilio-ratchet.js +70 -0
- package/dist/es/transform/built-in-transforms.js +191 -0
- package/dist/es/transform/transform-rule.js +1 -0
- package/dist/es/tx/transaction-configuration.js +1 -0
- package/dist/es/tx/transaction-final-state.js +6 -0
- package/dist/es/tx/transaction-ratchet.js +76 -0
- package/dist/es/tx/transaction-result.js +1 -0
- package/dist/es/tx/transaction-step.js +1 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.es.tsbuildinfo +1 -0
- package/dist/tsconfig.types.tsbuildinfo +1 -0
- package/dist/types/2d/line-2d.d.ts +5 -0
- package/dist/types/2d/plane-2d.d.ts +6 -0
- package/dist/types/2d/point-2d.d.ts +4 -0
- package/dist/types/2d/poly-line-2d.d.ts +4 -0
- package/dist/types/2d/ratchet-2d.d.ts +37 -0
- package/dist/types/build/build-information.d.ts +8 -0
- package/dist/types/build/ratchet-common-info.d.ts +5 -0
- package/dist/types/histogram/histogram-entry.d.ts +4 -0
- package/dist/types/histogram/histogram.d.ts +15 -0
- package/dist/types/index.d.ts +74 -0
- package/dist/types/jwt/common-jwt-token.d.ts +17 -0
- package/dist/types/jwt/expired-jwt-handling.d.ts +5 -0
- package/dist/types/jwt/jwt-ratchet-like.d.ts +18 -0
- package/dist/types/jwt/jwt-ratchet.d.ts +39 -0
- package/dist/types/jwt/jwt-token-base.d.ts +13 -0
- package/dist/types/lang/array-ratchet.d.ts +30 -0
- package/dist/types/lang/base64-ratchet.d.ts +10 -0
- package/dist/types/lang/boolean-ratchet.d.ts +7 -0
- package/dist/types/lang/composite-last-success-provider.d.ts +8 -0
- package/dist/types/lang/date-ratchet.d.ts +11 -0
- package/dist/types/lang/duration-ratchet.d.ts +7 -0
- package/dist/types/lang/enum-ratchet.d.ts +12 -0
- package/dist/types/lang/error-ratchet.d.ts +6 -0
- package/dist/types/lang/expiring-object.d.ts +20 -0
- package/dist/types/lang/geolocation-ratchet.d.ts +40 -0
- package/dist/types/lang/global-ratchet.d.ts +6 -0
- package/dist/types/lang/key-value.d.ts +4 -0
- package/dist/types/lang/last-success-provider.d.ts +4 -0
- package/dist/types/lang/map-ratchet.d.ts +15 -0
- package/dist/types/lang/no.d.ts +3 -0
- package/dist/types/lang/number-ratchet.d.ts +20 -0
- package/dist/types/lang/parsed-url.d.ts +10 -0
- package/dist/types/lang/promise-ratchet.d.ts +32 -0
- package/dist/types/lang/require-ratchet.d.ts +11 -0
- package/dist/types/lang/stop-watch.d.ts +17 -0
- package/dist/types/lang/string-ratchet.d.ts +27 -0
- package/dist/types/lang/time-zone-ratchet.d.ts +50 -0
- package/dist/types/lang/timeout-token.d.ts +9 -0
- package/dist/types/lang/transform-ratchet.d.ts +7 -0
- package/dist/types/logger/classic-single-line-log-message-formatter.d.ts +6 -0
- package/dist/types/logger/log-message-builder.d.ts +14 -0
- package/dist/types/logger/log-message-format-type.d.ts +5 -0
- package/dist/types/logger/log-message-formatter.d.ts +5 -0
- package/dist/types/logger/log-message-processor.d.ts +5 -0
- package/dist/types/logger/log-message.d.ts +8 -0
- package/dist/types/logger/log-snapshot.d.ts +5 -0
- package/dist/types/logger/logger-instance.d.ts +46 -0
- package/dist/types/logger/logger-level-name.d.ts +8 -0
- package/dist/types/logger/logger-meta.d.ts +6 -0
- package/dist/types/logger/logger-options.d.ts +13 -0
- package/dist/types/logger/logger-output-function.d.ts +5 -0
- package/dist/types/logger/logger-ring-buffer.d.ts +18 -0
- package/dist/types/logger/logger-util.d.ts +8 -0
- package/dist/types/logger/logger.d.ts +52 -0
- package/dist/types/logger/none-log-message-formatter.d.ts +6 -0
- package/dist/types/logger/structured-json-log-message-formatter.d.ts +6 -0
- package/dist/types/network/browser-local-ip-provider.d.ts +7 -0
- package/dist/types/network/fixed-local-ip-provider.d.ts +6 -0
- package/dist/types/network/local-ip-provider.d.ts +4 -0
- package/dist/types/network/network-ratchet.d.ts +9 -0
- package/dist/types/stream/buffer-writable.d.ts +9 -0
- package/dist/types/stream/stream-ratchet.d.ts +12 -0
- package/dist/types/stream/string-writable.d.ts +8 -0
- package/dist/types/third-party/google/google-recaptcha-ratchet.d.ts +4 -0
- package/dist/types/third-party/twilio/twilio-ratchet.d.ts +15 -0
- package/dist/types/transform/built-in-transforms.d.ts +18 -0
- package/dist/types/transform/transform-rule.d.ts +3 -0
- package/dist/types/tx/transaction-configuration.d.ts +7 -0
- package/dist/types/tx/transaction-final-state.d.ts +5 -0
- package/dist/types/tx/transaction-ratchet.d.ts +6 -0
- package/dist/types/tx/transaction-result.d.ts +9 -0
- package/dist/types/tx/transaction-step.d.ts +5 -0
- package/package.json +65 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeolocationRatchet = void 0;
|
|
4
|
+
const require_ratchet_1 = require("./require-ratchet");
|
|
5
|
+
const number_ratchet_1 = require("./number-ratchet");
|
|
6
|
+
const error_ratchet_1 = require("./error-ratchet");
|
|
7
|
+
const logger_1 = require("../logger/logger");
|
|
8
|
+
class GeolocationRatchet {
|
|
9
|
+
constructor() { }
|
|
10
|
+
static distanceBetweenLocations(lat1, lon1, lat2, lon2, unit = 'M') {
|
|
11
|
+
const uU = !!unit ? unit.toUpperCase() : '';
|
|
12
|
+
if (['M', 'K', 'N', 'F', 'E'].indexOf(uU) === -1) {
|
|
13
|
+
throw new Error('Invalid unit');
|
|
14
|
+
}
|
|
15
|
+
if (lat1 == lat2 && lon1 == lon2) {
|
|
16
|
+
return 0;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
const radlat1 = (Math.PI * lat1) / 180;
|
|
20
|
+
const radlat2 = (Math.PI * lat2) / 180;
|
|
21
|
+
const theta = lon1 - lon2;
|
|
22
|
+
const radtheta = (Math.PI * theta) / 180;
|
|
23
|
+
let dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
|
|
24
|
+
if (dist > 1) {
|
|
25
|
+
dist = 1;
|
|
26
|
+
}
|
|
27
|
+
dist = Math.acos(dist);
|
|
28
|
+
dist = (dist * 180) / Math.PI;
|
|
29
|
+
dist = dist * 60 * 1.1515;
|
|
30
|
+
if (uU === 'F') {
|
|
31
|
+
dist *= 5280;
|
|
32
|
+
}
|
|
33
|
+
if (uU === 'K') {
|
|
34
|
+
dist *= 1.609344;
|
|
35
|
+
}
|
|
36
|
+
if (uU === 'E') {
|
|
37
|
+
dist *= 1609.344;
|
|
38
|
+
}
|
|
39
|
+
if (uU === 'N') {
|
|
40
|
+
dist *= 0.8684;
|
|
41
|
+
}
|
|
42
|
+
return dist;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
static distanceBetweenRatchetGeoLocations(loc1, loc2, unit = 'M') {
|
|
46
|
+
return GeolocationRatchet.distanceBetweenLocations(loc1.lat, loc1.lng, loc2.lat, loc2.lng, unit);
|
|
47
|
+
}
|
|
48
|
+
static degreeOfLatLngInMiles(latitudeInDecimalDegress = 0) {
|
|
49
|
+
const latInRads = (latitudeInDecimalDegress * Math.PI) / 180;
|
|
50
|
+
const cosLat = Math.cos(latInRads);
|
|
51
|
+
const rval = number_ratchet_1.NumberRatchet.safeNumber((cosLat * 69.172).toFixed(4));
|
|
52
|
+
return rval;
|
|
53
|
+
}
|
|
54
|
+
static milesInDegLatLng(miles, latitudeInDecimalDegress = 0) {
|
|
55
|
+
require_ratchet_1.RequireRatchet.notNullOrUndefined(miles);
|
|
56
|
+
require_ratchet_1.RequireRatchet.true(miles >= 0);
|
|
57
|
+
const degreeInMiles = GeolocationRatchet.degreeOfLatLngInMiles(latitudeInDecimalDegress);
|
|
58
|
+
return miles / degreeInMiles;
|
|
59
|
+
}
|
|
60
|
+
static centerOfBounds(bounds) {
|
|
61
|
+
require_ratchet_1.RequireRatchet.notNullOrUndefined(bounds);
|
|
62
|
+
return {
|
|
63
|
+
lat: (bounds.extent.lat + bounds.origin.lat) / 2,
|
|
64
|
+
lng: (bounds.extent.lng + bounds.origin.lng) / 2,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
static calculateSplits(input, slices, field) {
|
|
68
|
+
require_ratchet_1.RequireRatchet.notNullOrUndefined(input);
|
|
69
|
+
require_ratchet_1.RequireRatchet.notNullOrUndefined(slices);
|
|
70
|
+
require_ratchet_1.RequireRatchet.notNullOrUndefined(field);
|
|
71
|
+
input.sort((a, b) => a.origin[field] - b.origin[field]);
|
|
72
|
+
const centers = input.map((i) => GeolocationRatchet.centerOfBounds(i));
|
|
73
|
+
const vals = centers.map((c) => c[field]);
|
|
74
|
+
const splits = [];
|
|
75
|
+
for (let i = 1; i < vals.length; i++) {
|
|
76
|
+
const size = vals[i] - vals[i - 1];
|
|
77
|
+
if (splits.length < slices) {
|
|
78
|
+
splits.push({ idx: i, size: size });
|
|
79
|
+
splits.sort((a, b) => a.size - b.size);
|
|
80
|
+
}
|
|
81
|
+
else if (size > splits[0].size) {
|
|
82
|
+
splits[0] = { idx: i, size: size };
|
|
83
|
+
splits.sort((a, b) => a.size - b.size);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
logger_1.Logger.silly('Skipping, size : %d, %j', size, splits);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
logger_1.Logger.info('Splits at : %j', splits);
|
|
90
|
+
splits.sort((a, b) => a.idx - b.idx);
|
|
91
|
+
return splits;
|
|
92
|
+
}
|
|
93
|
+
static clusterGeoBounds(inputVal, latSlices = 2, lngSlices = 5) {
|
|
94
|
+
let rval = null;
|
|
95
|
+
if (latSlices * lngSlices < 2) {
|
|
96
|
+
error_ratchet_1.ErrorRatchet.throwFormattedErr('Cannot set slices to less than 2 : %d x %d', latSlices, lngSlices);
|
|
97
|
+
}
|
|
98
|
+
if (!!inputVal) {
|
|
99
|
+
rval = [];
|
|
100
|
+
const input = Object.assign([], inputVal);
|
|
101
|
+
input.sort((a, b) => a.origin.lng - b.origin.lng);
|
|
102
|
+
const lngSplits = GeolocationRatchet.calculateSplits(inputVal, lngSlices - 1, 'lng');
|
|
103
|
+
lngSplits.sort((a, b) => a.idx - b.idx);
|
|
104
|
+
for (let i = 0; i <= lngSplits.length; i++) {
|
|
105
|
+
const lngStartIdx = i === 0 ? 0 : lngSplits[i - 1].idx;
|
|
106
|
+
const lngEndIdx = i === lngSplits.length ? input.length : lngSplits[i].idx;
|
|
107
|
+
const lngBatch = input.slice(lngStartIdx, lngEndIdx);
|
|
108
|
+
lngBatch.sort((a, b) => a.origin.lat - b.origin.lat);
|
|
109
|
+
const latSplits = GeolocationRatchet.calculateSplits(lngBatch, latSlices - 1, 'lat');
|
|
110
|
+
for (let j = 0; j <= latSplits.length; j++) {
|
|
111
|
+
const latStartIdx = j == 0 ? 0 : latSplits[j - 1].idx;
|
|
112
|
+
const latEndIdx = j === latSplits.length ? lngBatch.length : latSplits[j].idx;
|
|
113
|
+
const latBatch = lngBatch.slice(latStartIdx, latEndIdx);
|
|
114
|
+
rval.push(GeolocationRatchet.combineBounds(latBatch));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
logger_1.Logger.info('New bounds : %j', rval);
|
|
118
|
+
}
|
|
119
|
+
return rval;
|
|
120
|
+
}
|
|
121
|
+
static canonicalizeBounds(inp, allowCrossover = false) {
|
|
122
|
+
require_ratchet_1.RequireRatchet.notNullOrUndefined(inp, 'RatchetLocationBounds');
|
|
123
|
+
const minLat = Math.min(inp.extent.lat, inp.origin.lat);
|
|
124
|
+
const maxLat = Math.max(inp.extent.lat, inp.origin.lat);
|
|
125
|
+
const minLng = Math.min(inp.extent.lng, inp.origin.lng);
|
|
126
|
+
const maxLng = Math.max(inp.extent.lng, inp.origin.lng);
|
|
127
|
+
const latXover = (minLat < 0 && maxLat > 0) || (minLat > 0 && maxLat < 0);
|
|
128
|
+
const lngXover = (minLat < 0 && maxLat > 0) || (minLat > 0 && maxLat < 0);
|
|
129
|
+
if (latXover || lngXover) {
|
|
130
|
+
if (allowCrossover) {
|
|
131
|
+
return inp;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
throw new Error('Cannot canonicalize, bounds crosses over boundary');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const rval = {
|
|
138
|
+
origin: {
|
|
139
|
+
lat: minLat,
|
|
140
|
+
lng: minLng,
|
|
141
|
+
},
|
|
142
|
+
extent: {
|
|
143
|
+
lat: maxLat,
|
|
144
|
+
lng: maxLng,
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
return rval;
|
|
148
|
+
}
|
|
149
|
+
static combineBounds(inp) {
|
|
150
|
+
let rval = null;
|
|
151
|
+
if (inp && inp.length > 0) {
|
|
152
|
+
rval = {
|
|
153
|
+
origin: {
|
|
154
|
+
lat: inp.map((i) => i.origin.lat).reduce((a, i) => Math.min(a, i)),
|
|
155
|
+
lng: inp.map((i) => i.origin.lng).reduce((a, i) => Math.min(a, i)),
|
|
156
|
+
},
|
|
157
|
+
extent: {
|
|
158
|
+
lat: inp.map((i) => i.extent.lat).reduce((a, i) => Math.max(a, i)),
|
|
159
|
+
lng: inp.map((i) => i.extent.lng).reduce((a, i) => Math.max(a, i)),
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return rval;
|
|
164
|
+
}
|
|
165
|
+
static roundLocation(r, roundDigits) {
|
|
166
|
+
return {
|
|
167
|
+
lat: number_ratchet_1.NumberRatchet.safeNumber(r.lat.toFixed(roundDigits)),
|
|
168
|
+
lng: number_ratchet_1.NumberRatchet.safeNumber(r.lng.toFixed(roundDigits)),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
static locationToBounds(loc, radiusMiles) {
|
|
172
|
+
const offset = GeolocationRatchet.milesInDegLatLng(radiusMiles, loc.lat);
|
|
173
|
+
const gfb = {
|
|
174
|
+
origin: {
|
|
175
|
+
lat: loc.lat - offset,
|
|
176
|
+
lng: loc.lng - offset,
|
|
177
|
+
},
|
|
178
|
+
extent: {
|
|
179
|
+
lat: loc.lat + offset,
|
|
180
|
+
lng: loc.lng + offset,
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
return gfb;
|
|
184
|
+
}
|
|
185
|
+
static sameLocation(loc1, loc2) {
|
|
186
|
+
return !!loc1 && !!loc2 && loc1.lat === loc2.lat && loc1.lng === loc2.lng;
|
|
187
|
+
}
|
|
188
|
+
static pointInBounds(pt, bound) {
|
|
189
|
+
return (!!pt &&
|
|
190
|
+
!!bound &&
|
|
191
|
+
number_ratchet_1.NumberRatchet.between(pt.lat, bound.origin.lat, bound.extent.lat) &&
|
|
192
|
+
number_ratchet_1.NumberRatchet.between(pt.lng, bound.origin.lng, bound.extent.lng));
|
|
193
|
+
}
|
|
194
|
+
static pointInAnyBound(pt, inBounds, minPointsBeforeMapping = 10) {
|
|
195
|
+
let rval = false;
|
|
196
|
+
if (inBounds.length > minPointsBeforeMapping) {
|
|
197
|
+
const mp = GeolocationRatchet.buildRatchetLocationBoundsMap(inBounds);
|
|
198
|
+
rval = GeolocationRatchet.pointInRatchetLocationBoundsMap(pt, mp);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
for (let i = 0; i < inBounds.length && !rval; i++) {
|
|
202
|
+
rval = GeolocationRatchet.pointInBounds(pt, inBounds[i]);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return rval;
|
|
206
|
+
}
|
|
207
|
+
static pointInRatchetLocationBoundsMap(pt, mp) {
|
|
208
|
+
let rval = false;
|
|
209
|
+
const entry = GeolocationRatchet.findRatchetLocationBoundsMapEntry(pt, mp);
|
|
210
|
+
if (!!entry) {
|
|
211
|
+
const bounds = entry.bounds;
|
|
212
|
+
for (let i = 0; i < bounds.length && !rval; i++) {
|
|
213
|
+
rval = GeolocationRatchet.pointInBounds(pt, bounds[i]);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return rval;
|
|
217
|
+
}
|
|
218
|
+
static findRatchetLocationBoundsMapEntry(pt, mp) {
|
|
219
|
+
let rval = null;
|
|
220
|
+
if (pt.lat >= mp.latOffset && pt.lat <= mp.maxLat && pt.lng >= mp.lngOffset && pt.lng <= mp.maxLng) {
|
|
221
|
+
const ltIdx = Math.trunc(pt.lat) - mp.latOffset;
|
|
222
|
+
const lngIdx = Math.trunc(pt.lng) - mp.lngOffset;
|
|
223
|
+
rval = mp.mapping[ltIdx][lngIdx];
|
|
224
|
+
}
|
|
225
|
+
return rval;
|
|
226
|
+
}
|
|
227
|
+
static buildRatchetLocationBoundsMap(inBounds) {
|
|
228
|
+
const minLat = inBounds.map((i) => i.origin.lat).reduce((a, i) => Math.min(a, i));
|
|
229
|
+
const minLng = inBounds.map((i) => i.origin.lng).reduce((a, i) => Math.min(a, i));
|
|
230
|
+
const maxLat = inBounds.map((i) => i.extent.lat).reduce((a, i) => Math.max(a, i));
|
|
231
|
+
const maxLng = inBounds.map((i) => i.extent.lng).reduce((a, i) => Math.max(a, i));
|
|
232
|
+
const latOffset = Math.trunc(minLat) - 1;
|
|
233
|
+
const lngOffset = Math.trunc(minLng) - 1;
|
|
234
|
+
const latEntries = Math.trunc(maxLat) - latOffset + 1;
|
|
235
|
+
const lngEntries = Math.trunc(maxLng) - lngOffset + 1;
|
|
236
|
+
const mapping = [];
|
|
237
|
+
for (let i = 0; i < latEntries; i++) {
|
|
238
|
+
const newRow = [];
|
|
239
|
+
for (let j = 0; j < lngEntries; j++) {
|
|
240
|
+
newRow.push({
|
|
241
|
+
lat: latOffset + i,
|
|
242
|
+
lng: lngOffset + j,
|
|
243
|
+
bounds: [],
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
mapping.push(newRow);
|
|
247
|
+
}
|
|
248
|
+
inBounds.forEach((b) => {
|
|
249
|
+
for (let i = Math.trunc(b.origin.lat); i <= Math.trunc(b.extent.lat); i++) {
|
|
250
|
+
const latIdx = i - latOffset;
|
|
251
|
+
const row = mapping[latIdx];
|
|
252
|
+
for (let j = Math.trunc(b.origin.lng); j <= Math.trunc(b.extent.lng); j++) {
|
|
253
|
+
const lngIdx = j - lngOffset;
|
|
254
|
+
row[lngIdx].bounds.push(b);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
return {
|
|
259
|
+
latOffset: latOffset,
|
|
260
|
+
lngOffset: lngOffset,
|
|
261
|
+
maxLat: latOffset + latEntries,
|
|
262
|
+
maxLng: lngOffset + lngEntries,
|
|
263
|
+
mapping: mapping,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
exports.GeolocationRatchet = GeolocationRatchet;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GlobalRatchet = void 0;
|
|
4
|
+
const error_ratchet_1 = require("./error-ratchet");
|
|
5
|
+
const require_ratchet_1 = require("./require-ratchet");
|
|
6
|
+
const logger_1 = require("../logger/logger");
|
|
7
|
+
class GlobalRatchet {
|
|
8
|
+
constructor() { }
|
|
9
|
+
static fetchGlobalRecord(returnNullOnNone) {
|
|
10
|
+
var _a;
|
|
11
|
+
let rval = null;
|
|
12
|
+
if (process === null || process === void 0 ? void 0 : process.env) {
|
|
13
|
+
logger_1.Logger.silly('Using process.env as global');
|
|
14
|
+
rval = process.env;
|
|
15
|
+
}
|
|
16
|
+
else if ((_a = global === null || global === void 0 ? void 0 : global.process) === null || _a === void 0 ? void 0 : _a.env) {
|
|
17
|
+
logger_1.Logger.silly('Using global.process.env as global');
|
|
18
|
+
rval = global.process.env;
|
|
19
|
+
}
|
|
20
|
+
else if (global) {
|
|
21
|
+
logger_1.Logger.silly('Using process.env as global');
|
|
22
|
+
rval = global;
|
|
23
|
+
}
|
|
24
|
+
if (!rval) {
|
|
25
|
+
if (returnNullOnNone) {
|
|
26
|
+
logger_1.Logger.silly('Returning null as global');
|
|
27
|
+
rval = null;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
throw error_ratchet_1.ErrorRatchet.fErr('Could not find process.env OR global in scope');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return rval;
|
|
34
|
+
}
|
|
35
|
+
static fetchGlobalVar(envVar) {
|
|
36
|
+
require_ratchet_1.RequireRatchet.notNullOrUndefined(envVar, 'envVar');
|
|
37
|
+
const myGlobal = GlobalRatchet.fetchGlobalRecord();
|
|
38
|
+
const value = myGlobal[envVar];
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
static setGlobalVar(envVar, value) {
|
|
42
|
+
require_ratchet_1.RequireRatchet.notNullOrUndefined(envVar, 'envVar');
|
|
43
|
+
require_ratchet_1.RequireRatchet.notNullOrUndefined(value, 'value');
|
|
44
|
+
const myGlobal = GlobalRatchet.fetchGlobalRecord();
|
|
45
|
+
myGlobal[envVar] = value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.GlobalRatchet = GlobalRatchet;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MapRatchet = void 0;
|
|
4
|
+
const logger_1 = require("../logger/logger");
|
|
5
|
+
const error_ratchet_1 = require("./error-ratchet");
|
|
6
|
+
const lodash_1 = require("lodash");
|
|
7
|
+
class MapRatchet {
|
|
8
|
+
static expandNestedKeys(src) {
|
|
9
|
+
const rval = {};
|
|
10
|
+
Object.keys(src).forEach((k) => {
|
|
11
|
+
(0, lodash_1.set)(rval, k, src[k]);
|
|
12
|
+
});
|
|
13
|
+
return rval;
|
|
14
|
+
}
|
|
15
|
+
static mapByUniqueProperty(input, propName) {
|
|
16
|
+
if (!input || !propName) {
|
|
17
|
+
throw new Error('Neither input nor propName can be null');
|
|
18
|
+
}
|
|
19
|
+
const rval = new Map();
|
|
20
|
+
input.forEach((i) => {
|
|
21
|
+
const val = !!i ? i[propName] : null;
|
|
22
|
+
if (val === null || val === undefined) {
|
|
23
|
+
throw new Error('No value for ' + propName + ' found in ' + JSON.stringify(i));
|
|
24
|
+
}
|
|
25
|
+
if (rval.has(val)) {
|
|
26
|
+
throw new Error('Multiple values found for ' + val);
|
|
27
|
+
}
|
|
28
|
+
rval.set(val, i);
|
|
29
|
+
});
|
|
30
|
+
return rval;
|
|
31
|
+
}
|
|
32
|
+
static groupByProperty(input, propName) {
|
|
33
|
+
if (!input || !propName) {
|
|
34
|
+
throw new Error('Neither input nor propName can be null');
|
|
35
|
+
}
|
|
36
|
+
const rval = new Map();
|
|
37
|
+
input.forEach((i) => {
|
|
38
|
+
const val = !!i ? i[propName] : null;
|
|
39
|
+
if (val === null || val === undefined) {
|
|
40
|
+
throw error_ratchet_1.ErrorRatchet.fErr('No value for %s found in %j', propName, i);
|
|
41
|
+
}
|
|
42
|
+
if (!rval.has(val)) {
|
|
43
|
+
rval.set(val, []);
|
|
44
|
+
}
|
|
45
|
+
rval.get(val).push(i);
|
|
46
|
+
});
|
|
47
|
+
return rval;
|
|
48
|
+
}
|
|
49
|
+
static findValue(toSearch, path) {
|
|
50
|
+
if (!path || path.length == 0) {
|
|
51
|
+
return toSearch;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
if (toSearch) {
|
|
55
|
+
return MapRatchet.findValue(toSearch[path[0]], path.slice(1));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
static findValueDotPath(toSearch, dotPath) {
|
|
63
|
+
if (!dotPath || dotPath.length == 0) {
|
|
64
|
+
return toSearch;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
if (toSearch) {
|
|
68
|
+
return MapRatchet.findValue(toSearch, dotPath.split('.'));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
static simpleDeepCompare(object1, object2) {
|
|
76
|
+
if (object1 == null && object2 == null)
|
|
77
|
+
return true;
|
|
78
|
+
if (object1 == null || object2 == null)
|
|
79
|
+
return false;
|
|
80
|
+
return JSON.stringify(object1) == JSON.stringify(object2);
|
|
81
|
+
}
|
|
82
|
+
static toKeyValueList(value) {
|
|
83
|
+
const returnArray = [];
|
|
84
|
+
for (const k of Object.keys(value)) {
|
|
85
|
+
returnArray.push({
|
|
86
|
+
key: k,
|
|
87
|
+
value: value[k],
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return returnArray;
|
|
91
|
+
}
|
|
92
|
+
static fromKeyValueList(list) {
|
|
93
|
+
const rval = {};
|
|
94
|
+
list.forEach((a) => (rval[a.key] = a.value));
|
|
95
|
+
return rval;
|
|
96
|
+
}
|
|
97
|
+
static cleanup(obj, stripZero = false, stripNull = true, stripUndefined = true, stripEmptyString = true) {
|
|
98
|
+
if (obj === null || obj === undefined || typeof obj !== 'object') {
|
|
99
|
+
return obj;
|
|
100
|
+
}
|
|
101
|
+
const o = JSON.parse(JSON.stringify(obj));
|
|
102
|
+
Object.keys(o).forEach((key) => {
|
|
103
|
+
if (o[key] && typeof o[key] === 'object') {
|
|
104
|
+
if (Array.isArray(o[key])) {
|
|
105
|
+
for (let i = 0; i < o[key].length; i++) {
|
|
106
|
+
o[key][i] = MapRatchet.cleanup(o[key][i]);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
o[key] = MapRatchet.cleanup(o[key]);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else if ((o[key] === undefined && stripUndefined) ||
|
|
114
|
+
(o[key] === null && stripNull) ||
|
|
115
|
+
(o[key] === '' && stripEmptyString) ||
|
|
116
|
+
(o[key] === 0 && stripZero)) {
|
|
117
|
+
delete o[key];
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
o[key] = o[key];
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
return o;
|
|
124
|
+
}
|
|
125
|
+
static extractValueFromMapIgnoreCase(src, key) {
|
|
126
|
+
let rval = null;
|
|
127
|
+
if (src && key) {
|
|
128
|
+
const finder = key.toLowerCase();
|
|
129
|
+
Object.keys(src).forEach((s) => {
|
|
130
|
+
if (s.toLowerCase() === finder) {
|
|
131
|
+
const newVal = src[s];
|
|
132
|
+
if (rval) {
|
|
133
|
+
logger_1.Logger.warn('Multiple entries found for %s (replacing %s with %s', key, rval, newVal);
|
|
134
|
+
}
|
|
135
|
+
rval = newVal;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return rval;
|
|
140
|
+
}
|
|
141
|
+
static safeCallFunction(ob, fnName) {
|
|
142
|
+
let rval = false;
|
|
143
|
+
if (!!ob && !!ob[fnName] && typeof ob[fnName] === 'function') {
|
|
144
|
+
try {
|
|
145
|
+
ob[fnName]();
|
|
146
|
+
rval = true;
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
logger_1.Logger.warn('Error calling %s on %s : %s', fnName, ob, err, err);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return rval;
|
|
153
|
+
}
|
|
154
|
+
static caseInsensitiveAccess(ob, keyName) {
|
|
155
|
+
let rval = null;
|
|
156
|
+
if (!!ob && !!keyName) {
|
|
157
|
+
rval = ob[keyName];
|
|
158
|
+
if (!rval) {
|
|
159
|
+
const keyNameCI = Object.keys(ob).find((f) => f.toLowerCase() === keyName.toLowerCase());
|
|
160
|
+
if (!!keyNameCI) {
|
|
161
|
+
rval = ob[keyNameCI];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return rval;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
exports.MapRatchet = MapRatchet;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NumberRatchet = void 0;
|
|
4
|
+
const logger_1 = require("../logger/logger");
|
|
5
|
+
const require_ratchet_1 = require("./require-ratchet");
|
|
6
|
+
class NumberRatchet {
|
|
7
|
+
static toFixedDecimalNumber(input, placesAfterPoint) {
|
|
8
|
+
const v = NumberRatchet.safeNumber(input);
|
|
9
|
+
return v === null || v === undefined ? v : NumberRatchet.safeNumber(v.toFixed(placesAfterPoint));
|
|
10
|
+
}
|
|
11
|
+
static leadingZeros(val, size) {
|
|
12
|
+
const sVal = String(val);
|
|
13
|
+
if (sVal.length < size) {
|
|
14
|
+
let pad = '0000';
|
|
15
|
+
if (size > NumberRatchet.MAX_LEADING_ZEROS_FORMAT_LENGTH) {
|
|
16
|
+
throw 'Cannot format number that large (max length is ' + NumberRatchet.MAX_LEADING_ZEROS_FORMAT_LENGTH + ')';
|
|
17
|
+
}
|
|
18
|
+
while (pad.length < size) {
|
|
19
|
+
pad = pad + pad;
|
|
20
|
+
}
|
|
21
|
+
return (pad + sVal).slice(-1 * size);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
return sVal;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
static between(inTest, inP1, inP2) {
|
|
28
|
+
const test = NumberRatchet.safeNumber(inTest);
|
|
29
|
+
const p1 = NumberRatchet.safeNumber(inP1);
|
|
30
|
+
const p2 = NumberRatchet.safeNumber(inP2);
|
|
31
|
+
return (test >= p1 && test <= p2) || (test >= p2 && test <= p1);
|
|
32
|
+
}
|
|
33
|
+
static safeNumber(input, ifNotNumber = null) {
|
|
34
|
+
let rval = null;
|
|
35
|
+
if (input != null) {
|
|
36
|
+
const type = typeof input;
|
|
37
|
+
if (type == 'number') {
|
|
38
|
+
rval = input;
|
|
39
|
+
}
|
|
40
|
+
else if (type == 'string') {
|
|
41
|
+
if (input.trim().length === 0) {
|
|
42
|
+
rval = ifNotNumber;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
rval = Number.parseFloat(input);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
logger_1.Logger.warn('Value is of type %s, returning default', type);
|
|
50
|
+
rval = ifNotNumber;
|
|
51
|
+
}
|
|
52
|
+
if (isNaN(rval)) {
|
|
53
|
+
logger_1.Logger.debug('Parsed string to NaN - using NaN value from param');
|
|
54
|
+
rval = ifNotNumber;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return rval;
|
|
58
|
+
}
|
|
59
|
+
static numberCSVToList(inputCSV) {
|
|
60
|
+
let rval = null;
|
|
61
|
+
if (inputCSV) {
|
|
62
|
+
rval = inputCSV.split(',').map((s) => {
|
|
63
|
+
return NumberRatchet.safeNumber(s.trim());
|
|
64
|
+
});
|
|
65
|
+
rval = rval.filter((r) => typeof r === 'number' && !isNaN(r));
|
|
66
|
+
}
|
|
67
|
+
return rval;
|
|
68
|
+
}
|
|
69
|
+
static fitToWindow(val, b1, b2) {
|
|
70
|
+
let rval = val;
|
|
71
|
+
if (val === null || b1 === null || b2 === null || b1 < 0 || b2 < 0 || val < 0) {
|
|
72
|
+
throw new Error('All values must be non-null and larger than 0');
|
|
73
|
+
}
|
|
74
|
+
const low = Math.min(b1, b2);
|
|
75
|
+
const high = Math.max(b1, b2);
|
|
76
|
+
const windowSize = high - low;
|
|
77
|
+
if (high === low) {
|
|
78
|
+
rval = high;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
while (rval < low) {
|
|
82
|
+
rval += windowSize;
|
|
83
|
+
}
|
|
84
|
+
while (rval > high) {
|
|
85
|
+
rval -= windowSize;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return rval;
|
|
89
|
+
}
|
|
90
|
+
static groupNumbersIntoContiguousRanges(inputData, minRangeSize = 3) {
|
|
91
|
+
require_ratchet_1.RequireRatchet.notNullOrUndefined(inputData);
|
|
92
|
+
const input = Object.assign([], inputData);
|
|
93
|
+
input.sort((a, b) => a - b);
|
|
94
|
+
const singles = [];
|
|
95
|
+
const ranges = [];
|
|
96
|
+
let start = 0;
|
|
97
|
+
for (let i = 1; i < input.length; i++) {
|
|
98
|
+
if (input[i] === input[i - 1] + 1) {
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
if (start === i - 1) {
|
|
102
|
+
singles.push(input[i - 1]);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
const rangeSize = i - start;
|
|
106
|
+
if (rangeSize < minRangeSize) {
|
|
107
|
+
for (let j = start; j < i; j++) {
|
|
108
|
+
singles.push(input[j]);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
ranges.push({
|
|
113
|
+
min: input[start],
|
|
114
|
+
max: input[i - 1],
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
start = i;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
singles: singles,
|
|
123
|
+
ranges: ranges,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
static distributeItemsEvenly(items, buckets) {
|
|
127
|
+
require_ratchet_1.RequireRatchet.notNullOrUndefined(items, 'items');
|
|
128
|
+
require_ratchet_1.RequireRatchet.notNullOrUndefined(buckets, 'buckets');
|
|
129
|
+
require_ratchet_1.RequireRatchet.true(items > 0 && items === Math.floor(items), 'Items integer larger than 0');
|
|
130
|
+
require_ratchet_1.RequireRatchet.true(buckets > 0 && buckets === Math.floor(buckets), 'Buckets integer larger than 0');
|
|
131
|
+
const offset = buckets / items;
|
|
132
|
+
const rval = [];
|
|
133
|
+
for (let i = 0; i < buckets; i++) {
|
|
134
|
+
rval.push(0);
|
|
135
|
+
}
|
|
136
|
+
let loc = 0;
|
|
137
|
+
let rem = items;
|
|
138
|
+
while (rem > 0) {
|
|
139
|
+
rval[Math.floor(loc) % buckets]++;
|
|
140
|
+
rem--;
|
|
141
|
+
loc += offset;
|
|
142
|
+
}
|
|
143
|
+
return rval;
|
|
144
|
+
}
|
|
145
|
+
static createRange(minInclusive, maxExclusive, step = 1) {
|
|
146
|
+
const rval = [];
|
|
147
|
+
let val = minInclusive;
|
|
148
|
+
while (val < maxExclusive) {
|
|
149
|
+
rval.push(val);
|
|
150
|
+
val += step;
|
|
151
|
+
}
|
|
152
|
+
return rval;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.NumberRatchet = NumberRatchet;
|
|
156
|
+
NumberRatchet.MAX_LEADING_ZEROS_FORMAT_LENGTH = 1000;
|