@blazedpath/commons 0.0.11 → 0.1.0
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/blz-base/index.js +893 -895
- package/blz-cache/index.js +25 -14
- package/blz-core/index.js +347 -349
- package/blz-cryptography/index.js +47 -49
- package/blz-datetimes/index.js +348 -350
- package/blz-file/index.js +83 -88
- package/blz-hazelcast/index.js +100 -103
- package/blz-iterable/index.js +404 -406
- package/blz-json-schema/index.js +6 -8
- package/blz-jwt/index.js +89 -92
- package/blz-kafka/index.js +106 -108
- package/blz-math/index.js +127 -129
- package/blz-mongodb/index.js +33 -35
- package/blz-rds/index.js +44 -46
- package/blz-rds-mysql/index.js +9 -11
- package/blz-rds-mysqlx/index.js +10 -12
- package/blz-rds-oracle/index.js +99 -104
- package/blz-rds-postgres/index.js +11 -13
- package/blz-redis/index.js +123 -125
- package/blz-regex/index.js +22 -24
- package/blz-strings/index.js +165 -167
- package/blz-uuid/index.js +2 -4
- package/blz-yaml/index.js +16 -19
- package/package.json +1 -1
package/blz-iterable/index.js
CHANGED
|
@@ -1,448 +1,446 @@
|
|
|
1
1
|
module.exports = {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
2
|
+
errorUndefinedArgument: function( argName ) {
|
|
3
|
+
const err = new Error();
|
|
4
|
+
err.code = 'UndefinedArgument';
|
|
5
|
+
err.data = { argName: argName };
|
|
6
|
+
return err;
|
|
7
|
+
},
|
|
8
|
+
compare: function( value1, value2 ) { // TODO: Sort require for objects
|
|
9
|
+
if( value1 === null && value2 === null ) return 0;
|
|
10
|
+
if( value1 === null && value2 !== null ) return -1;
|
|
11
|
+
if( value1 !== null && value2 === null ) return 1;
|
|
12
|
+
|
|
13
|
+
const value1Type = toString.call( value1 );
|
|
14
|
+
const value2Type = toString.call( value2 );
|
|
15
|
+
let value1ToCompare = null;
|
|
16
|
+
let value2ToCompare = null;
|
|
17
|
+
if ((value1Type === '[object String]' && value2Type === '[object String]') ||
|
|
18
|
+
(value1Type === '[object Number]' && value2Type === '[object Number]')) {
|
|
19
|
+
value1ToCompare = value1;
|
|
20
|
+
value2ToCompare = value2;
|
|
21
|
+
}
|
|
22
|
+
else if( value1Type === '[object Boolean]' && value2Type === '[object Boolean]' ) {
|
|
23
|
+
value1ToCompare = value1 ? 1 : 0;
|
|
24
|
+
value2ToCompare = value2 ? 1 : 0;
|
|
25
|
+
}
|
|
26
|
+
else if( value1Type === '[object Date]' && value2Type === '[object Date]' ) {
|
|
27
|
+
value1ToCompare = value1.getTime();
|
|
28
|
+
value2ToCompare = value2.getTime();
|
|
29
|
+
}
|
|
30
|
+
else if( value1Type === '[object Object]' && value2Type === '[object Object]' ) {
|
|
31
|
+
value1ToCompare = JSON.stringify( value1 );
|
|
32
|
+
value2ToCompare = JSON.stringify( value2 );
|
|
33
|
+
}
|
|
34
|
+
else if( value1Type === '[object Array]' && value2Type === '[object Array]' ) {
|
|
35
|
+
let result = this.compare( value1.length, value2.length );
|
|
36
|
+
if( result !== 0 )
|
|
37
|
+
return result;
|
|
38
|
+
for( let i = 0; i < value1.length; ++i ) {
|
|
39
|
+
const item1 = value1[ i ];
|
|
40
|
+
const item2 = value2[ i ];
|
|
41
|
+
result = this.compare( item1, item2 );
|
|
42
|
+
if( result !== 0 )
|
|
38
43
|
return result;
|
|
39
|
-
for (let i = 0; i < value1.length; ++i) {
|
|
40
|
-
const item1 = value1[i];
|
|
41
|
-
const item2 = value2[i];
|
|
42
|
-
result = this.compare(item1, item2);
|
|
43
|
-
if (result !== 0)
|
|
44
|
-
return result;
|
|
45
|
-
}
|
|
46
|
-
return 0;
|
|
47
44
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const getValueToCompare = ( valueType, value ) => {
|
|
49
|
+
switch( valueType ) {
|
|
50
|
+
case '[object String]' : return value
|
|
51
|
+
case '[object Number]' : return value.toString()
|
|
52
|
+
case '[object Boolean]' : return value ? '1' : '0'
|
|
53
|
+
case '[object Date]' : return value.toJSON()
|
|
54
|
+
default : return value.toString()
|
|
58
55
|
}
|
|
59
56
|
|
|
60
|
-
value1ToCompare = getValueToCompare(value1Type, value1)
|
|
61
|
-
value2ToCompare = getValueToCompare(value2Type, value2)
|
|
62
57
|
}
|
|
63
58
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
else return null;
|
|
59
|
+
value1ToCompare = getValueToCompare( value1Type, value1 )
|
|
60
|
+
value2ToCompare = getValueToCompare( value2Type, value2 )
|
|
61
|
+
}
|
|
68
62
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
63
|
+
if( value1ToCompare === value2ToCompare ) return 0;
|
|
64
|
+
else if( value1ToCompare < value2ToCompare ) return -1;
|
|
65
|
+
else if( value1ToCompare > value2ToCompare ) return 1;
|
|
66
|
+
else return null;
|
|
72
67
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
for (let i = 0; i < list.length; ++i) {
|
|
107
|
-
const value = list[i];
|
|
108
|
-
if (value !== null) {
|
|
109
|
-
totalSum += value;
|
|
110
|
-
totalCount++;
|
|
111
|
-
}
|
|
68
|
+
},
|
|
69
|
+
all: function( list, fnCondition ) {
|
|
70
|
+
if( list === null ) return false;
|
|
71
|
+
|
|
72
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
73
|
+
const item = list[ i ];
|
|
74
|
+
if( !(fnCondition( item )) )
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
return true;
|
|
78
|
+
},
|
|
79
|
+
any: function( list, fnCondition ) {
|
|
80
|
+
if( list === null ) return false;
|
|
81
|
+
|
|
82
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
83
|
+
const item = list[ i ];
|
|
84
|
+
if( fnCondition( item ) )
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
},
|
|
89
|
+
avg: function( list, fnSelection ) {
|
|
90
|
+
if( list === null ) return null;
|
|
91
|
+
|
|
92
|
+
let totalSum = 0;
|
|
93
|
+
let totalCount = 0;
|
|
94
|
+
if( fnSelection ) {
|
|
95
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
96
|
+
const item = list[ i ];
|
|
97
|
+
const value = fnSelection( item );
|
|
98
|
+
if( value !== null ) {
|
|
99
|
+
totalSum += value;
|
|
100
|
+
totalCount++;
|
|
112
101
|
}
|
|
113
102
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
count: function (list) {
|
|
122
|
-
if (list === null) return null;
|
|
123
|
-
return list.length;
|
|
124
|
-
},
|
|
125
|
-
distinct: function (list, fnSelection) {
|
|
126
|
-
if (list === null) return null;
|
|
127
|
-
|
|
128
|
-
const resultArray = [];
|
|
129
|
-
if (fnSelection) {
|
|
130
|
-
const keys = [];
|
|
131
|
-
for (let i = 0; i < list.length; ++i) {
|
|
132
|
-
const item = list[i];
|
|
133
|
-
const key = fnSelection(item);
|
|
134
|
-
if (keys.indexOf(key) === -1) {
|
|
135
|
-
keys.push(key);
|
|
136
|
-
resultArray.push(item);
|
|
137
|
-
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
106
|
+
const value = list[ i ];
|
|
107
|
+
if( value !== null ) {
|
|
108
|
+
totalSum += value;
|
|
109
|
+
totalCount++;
|
|
138
110
|
}
|
|
139
111
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
112
|
+
}
|
|
113
|
+
return totalSum / totalCount;
|
|
114
|
+
},
|
|
115
|
+
concatList: function() {
|
|
116
|
+
if( arguments.length === 0 ) return null
|
|
117
|
+
if( arguments.length === 1 && arguments[ 0 ] === null ) return null
|
|
118
|
+
return Array.from( arguments ).filter( list => list !== null ).flat()
|
|
119
|
+
},
|
|
120
|
+
count: function( list ) {
|
|
121
|
+
if( list === null ) return null;
|
|
122
|
+
return list.length;
|
|
123
|
+
},
|
|
124
|
+
distinct: function( list, fnSelection ) {
|
|
125
|
+
if( list === null ) return null;
|
|
126
|
+
|
|
127
|
+
const resultArray = [];
|
|
128
|
+
if( fnSelection ) {
|
|
129
|
+
const keys = [];
|
|
130
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
131
|
+
const item = list[ i ];
|
|
132
|
+
const key = fnSelection( item );
|
|
133
|
+
if( keys.indexOf( key ) === -1 ) {
|
|
134
|
+
keys.push( key );
|
|
135
|
+
resultArray.push( item );
|
|
145
136
|
}
|
|
146
137
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
return result === undefined ? null : result
|
|
154
|
-
},
|
|
155
|
-
getSelections: function (list, fnSelection) {
|
|
156
|
-
if (!fnSelection) return list
|
|
157
|
-
|
|
158
|
-
const selections = new Array(list.length)
|
|
159
|
-
for (let i = 0; i < list.length; ++i) {
|
|
160
|
-
selections[i] = fnSelection(list[i])
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
141
|
+
const item = list[ i ];
|
|
142
|
+
if( resultArray.indexOf( item ) === -1 )
|
|
143
|
+
resultArray.push( item );
|
|
161
144
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
145
|
+
}
|
|
146
|
+
return resultArray;
|
|
147
|
+
},
|
|
148
|
+
elementAt: function( list, index ) {
|
|
149
|
+
if( list === null ) return null
|
|
150
|
+
|
|
151
|
+
const result = list[ index ]
|
|
152
|
+
return result === undefined ? null : result
|
|
153
|
+
},
|
|
154
|
+
getSelections: function( list, fnSelection ) {
|
|
155
|
+
if( !fnSelection ) return list
|
|
156
|
+
|
|
157
|
+
const selections = new Array( list.length )
|
|
158
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
159
|
+
selections[ i ] = fnSelection( list[ i ] )
|
|
160
|
+
}
|
|
161
|
+
return selections
|
|
162
|
+
},
|
|
163
|
+
except: function( listA, listB, fnSelection ) {
|
|
164
|
+
if( listA === null ) return null
|
|
165
|
+
if( listB === null ) return listA.slice()
|
|
166
|
+
|
|
167
|
+
const selectionsA = this.getSelections( listA, fnSelection )
|
|
168
|
+
const selectionsB = this.getSelections( listB, fnSelection )
|
|
169
|
+
|
|
170
|
+
const resultArray = [];
|
|
171
|
+
for( let i = 0; i < listA.length; ++i ) {
|
|
172
|
+
let except = false
|
|
173
|
+
for( let j = 0; j < listB.length; ++j ) {
|
|
174
|
+
if( this.compare( selectionsA[ i ], selectionsB[ j ] ) === 0 ) {
|
|
175
|
+
except = true
|
|
176
|
+
break
|
|
179
177
|
}
|
|
180
|
-
if (!except) resultArray.push(listA[i])
|
|
181
|
-
}
|
|
182
|
-
return resultArray;
|
|
183
|
-
},
|
|
184
|
-
findAll: function (list, fnCondition) {
|
|
185
|
-
if (list === null) return null;
|
|
186
|
-
|
|
187
|
-
const resultArray = [];
|
|
188
|
-
for (let i = 0; i < list.length; ++i) {
|
|
189
|
-
const item = list[i];
|
|
190
|
-
if (fnCondition(item))
|
|
191
|
-
resultArray.push(item);
|
|
192
|
-
}
|
|
193
|
-
return resultArray;
|
|
194
|
-
},
|
|
195
|
-
findFirstInternal: function (list, fnCondition) {
|
|
196
|
-
if (list === null) return null
|
|
197
|
-
|
|
198
|
-
for (let i = 0; i < list.length; ++i) {
|
|
199
|
-
const item = list[i]
|
|
200
|
-
if (fnCondition(item))
|
|
201
|
-
return { item, index: i }
|
|
202
178
|
}
|
|
179
|
+
if( !except ) resultArray.push( listA[ i ] )
|
|
180
|
+
}
|
|
181
|
+
return resultArray;
|
|
182
|
+
},
|
|
183
|
+
findAll: function( list, fnCondition ) {
|
|
184
|
+
if( list === null ) return null;
|
|
185
|
+
|
|
186
|
+
const resultArray = [];
|
|
187
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
188
|
+
const item = list[ i ];
|
|
189
|
+
if( fnCondition( item ) )
|
|
190
|
+
resultArray.push( item );
|
|
191
|
+
}
|
|
192
|
+
return resultArray;
|
|
193
|
+
},
|
|
194
|
+
findFirstInternal: function( list, fnCondition ) {
|
|
195
|
+
if( list === null ) return null
|
|
196
|
+
|
|
197
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
198
|
+
const item = list[ i ]
|
|
199
|
+
if( fnCondition( item ) )
|
|
200
|
+
return { item, index: i }
|
|
201
|
+
}
|
|
203
202
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
}
|
|
265
|
-
if (include)
|
|
266
|
-
resultArray.push(listA[i]);
|
|
203
|
+
return { item: null, index: -1 }
|
|
204
|
+
},
|
|
205
|
+
findFirst: function( list, fnCondition ) {
|
|
206
|
+
const result = this.findFirstInternal( list, fnCondition )
|
|
207
|
+
return result === null ? null : result.item
|
|
208
|
+
},
|
|
209
|
+
findIndex: function( list, fnCondition ) {
|
|
210
|
+
const result = this.findFirstInternal( list, fnCondition )
|
|
211
|
+
return result === null ? null : result.index
|
|
212
|
+
},
|
|
213
|
+
findLastInternal: function( list, fnCondition ) {
|
|
214
|
+
if( list === null ) return null
|
|
215
|
+
|
|
216
|
+
for( let i = ( list.length - 1 ); i > -1; i-- ) {
|
|
217
|
+
const item = list[ i ]
|
|
218
|
+
if( fnCondition( item ) )
|
|
219
|
+
return { item, index: i }
|
|
220
|
+
}
|
|
221
|
+
return { item: null, index: -1 }
|
|
222
|
+
},
|
|
223
|
+
findLast: function( list, fnCondition ) {
|
|
224
|
+
const result = this.findLastInternal( list, fnCondition )
|
|
225
|
+
return result === null ? null : result.item
|
|
226
|
+
},
|
|
227
|
+
findLastIndex: function( list, fnCondition ) {
|
|
228
|
+
const result = this.findLastInternal( list, fnCondition )
|
|
229
|
+
return result === null ? null : result.index
|
|
230
|
+
},
|
|
231
|
+
first: function( list ) {
|
|
232
|
+
if( list === null ) return null;
|
|
233
|
+
return list.length > 0 ? list[ 0 ] : null;
|
|
234
|
+
},
|
|
235
|
+
flat: function( list, depth ) {
|
|
236
|
+
if( list === null ) return null
|
|
237
|
+
return list.flat( depth )
|
|
238
|
+
},
|
|
239
|
+
includes: function( list, searchElement, fromIndex ) {
|
|
240
|
+
if( list === null ) return false
|
|
241
|
+
return list.includes( searchElement, fromIndex )
|
|
242
|
+
},
|
|
243
|
+
insertAt: function( list, index, elements ) {
|
|
244
|
+
if( list === null ) return null
|
|
245
|
+
if( elements === null ) return list.slice()
|
|
246
|
+
const copiedList = list.slice()
|
|
247
|
+
copiedList.splice( index, 0, ...elements )
|
|
248
|
+
return copiedList
|
|
249
|
+
},
|
|
250
|
+
intersect: function( listA, listB, fnSelection ) {
|
|
251
|
+
if( listA === null ) return null;
|
|
252
|
+
if( listB === null ) return null;
|
|
253
|
+
|
|
254
|
+
const selectionsA = this.getSelections( listA, fnSelection )
|
|
255
|
+
const selectionsB = this.getSelections( listB, fnSelection )
|
|
256
|
+
|
|
257
|
+
const resultArray = [];
|
|
258
|
+
for( let i = 0; i < listA.length; ++i ) {
|
|
259
|
+
let include = false;
|
|
260
|
+
for( let j = 0; j < listB.length; j++ ) {
|
|
261
|
+
if( this.compare( selectionsA[ i ], selectionsB[ j ] ) === 0 )
|
|
262
|
+
include = true;
|
|
267
263
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
264
|
+
if( include )
|
|
265
|
+
resultArray.push( listA[ i ] );
|
|
266
|
+
}
|
|
267
|
+
return resultArray;
|
|
268
|
+
},
|
|
269
|
+
last: function( list ) {
|
|
270
|
+
if( list === null ) return null;
|
|
271
|
+
return list.length > 0 ? list[ list.length - 1 ] : null;
|
|
272
|
+
},
|
|
273
|
+
max: function( list, fnSelection ) {
|
|
274
|
+
if( list === null ) return null;
|
|
275
|
+
|
|
276
|
+
let max = null;
|
|
277
|
+
if( fnSelection ) {
|
|
278
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
279
|
+
const item = list[ i ];
|
|
280
|
+
const value = fnSelection( item );
|
|
281
|
+
if( max === null || this.compare( value, max ) > 0 )
|
|
282
|
+
max = value;
|
|
285
283
|
}
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
287
|
+
const value = list[ i ];
|
|
288
|
+
if( max === null || this.compare( value, max ) > 0 )
|
|
289
|
+
max = value;
|
|
292
290
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
291
|
+
}
|
|
292
|
+
return max;
|
|
293
|
+
},
|
|
294
|
+
min: function( list, fnSelection ) {
|
|
295
|
+
if( list === null ) return null;
|
|
296
|
+
|
|
297
|
+
let min = null;
|
|
298
|
+
if( fnSelection ) {
|
|
299
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
300
|
+
const item = list[ i ];
|
|
301
|
+
const value = fnSelection( item );
|
|
302
|
+
if( min === null || this.compare( value, min ) < 0 )
|
|
303
|
+
min = value;
|
|
306
304
|
}
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
308
|
+
const value = list[ i ];
|
|
309
|
+
if( min === null || this.compare( value, min ) < 0 )
|
|
310
|
+
min = value;
|
|
313
311
|
}
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
312
|
+
}
|
|
313
|
+
return min;
|
|
314
|
+
},
|
|
315
|
+
removeAt: function( list, index, deleteCount ) {
|
|
316
|
+
if( list === null ) return null
|
|
317
|
+
const copiedList = list.slice()
|
|
318
|
+
copiedList.splice( index, deleteCount )
|
|
319
|
+
return copiedList
|
|
320
|
+
},
|
|
321
|
+
reverse: function( list ) {
|
|
322
|
+
if( list === null ) return null
|
|
323
|
+
return list.slice().reverse()
|
|
324
|
+
},
|
|
325
|
+
skip: function( list, count ) {
|
|
326
|
+
if( list === null ) return null
|
|
327
|
+
return list.slice( count )
|
|
328
|
+
},
|
|
329
|
+
skipWhile: function( list, fnCondition ) {
|
|
330
|
+
if( list === null ) return null
|
|
331
|
+
|
|
332
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
333
|
+
if( !fnCondition( list[ i ] ) ) {
|
|
334
|
+
return list.slice( i )
|
|
337
335
|
}
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
336
|
+
}
|
|
337
|
+
return []
|
|
338
|
+
},
|
|
339
|
+
slice: function( list, start, end ) {
|
|
340
|
+
if( list === null ) return null
|
|
341
|
+
return list.slice( start, end )
|
|
342
|
+
},
|
|
343
|
+
sortInternal: function( { list, fnSelection, compareFunctionWithFnSelection, compareFunction } ) {
|
|
345
344
|
|
|
346
|
-
|
|
345
|
+
if( list === null ) return null
|
|
347
346
|
|
|
348
|
-
|
|
347
|
+
if( !fnSelection ) return list.slice().sort( compareFunction )
|
|
349
348
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
349
|
+
const unsorted = new Array( list.length )
|
|
350
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
351
|
+
unsorted[ i ] = { index: i, compareValue: fnSelection( list[ i ] ) }
|
|
352
|
+
}
|
|
354
353
|
|
|
355
|
-
|
|
354
|
+
const sorted = unsorted.sort( compareFunctionWithFnSelection );
|
|
356
355
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
356
|
+
const resultArray = new Array( sorted.length )
|
|
357
|
+
for( let i = 0; i < sorted.length; ++i ) {
|
|
358
|
+
resultArray[ i ] = list[ sorted[ i ].index ]
|
|
359
|
+
}
|
|
361
360
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
else {
|
|
392
|
-
for (let i = 0; i < list.length; ++i) {
|
|
393
|
-
const value = list[i];
|
|
394
|
-
if (value !== null)
|
|
395
|
-
sum += value;
|
|
396
|
-
}
|
|
361
|
+
return resultArray;
|
|
362
|
+
},
|
|
363
|
+
sort: function( list, fnSelection ) {
|
|
364
|
+
return this.sortInternal( {
|
|
365
|
+
list,
|
|
366
|
+
fnSelection,
|
|
367
|
+
compareFunctionWithFnSelection: function( a, b ) { return this.compare( a.compareValue, b.compareValue ) }.bind( this ),
|
|
368
|
+
compareFunction: function( a, b ) { return this.compare( a, b ) }.bind( this )
|
|
369
|
+
} )
|
|
370
|
+
},
|
|
371
|
+
sortDescending: function( list, fnSelection ) {
|
|
372
|
+
return this.sortInternal( {
|
|
373
|
+
list,
|
|
374
|
+
fnSelection,
|
|
375
|
+
compareFunctionWithFnSelection: function( a, b ) { return this.compare( b.compareValue, a.compareValue ); }.bind( this ),
|
|
376
|
+
compareFunction: function( a, b ) { return this.compare( b, a ); }.bind( this )
|
|
377
|
+
} )
|
|
378
|
+
},
|
|
379
|
+
sum: function( list, fnSelection ) {
|
|
380
|
+
if( list === null ) return null;
|
|
381
|
+
let sum = 0;
|
|
382
|
+
if( fnSelection ) {
|
|
383
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
384
|
+
const item = list[ i ];
|
|
385
|
+
const value = fnSelection( item );
|
|
386
|
+
if( value !== null )
|
|
387
|
+
sum += value;
|
|
397
388
|
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
takeWhile: function (list, fnCondition) {
|
|
405
|
-
if (list === null) return null;
|
|
406
|
-
|
|
407
|
-
let i;
|
|
408
|
-
for (i = 0; i < list.length; ++i) {
|
|
409
|
-
if (!fnCondition(list[i])) {
|
|
410
|
-
break
|
|
411
|
-
}
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
for( let i = 0; i < list.length; ++i ) {
|
|
392
|
+
const value = list[ i ];
|
|
393
|
+
if( value !== null )
|
|
394
|
+
sum += value;
|
|
412
395
|
}
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
396
|
+
}
|
|
397
|
+
return sum;
|
|
398
|
+
},
|
|
399
|
+
take: function( list, count ) {
|
|
400
|
+
if( list === null ) return null
|
|
401
|
+
return list.slice( 0, count )
|
|
402
|
+
},
|
|
403
|
+
takeWhile: function( list, fnCondition ) {
|
|
404
|
+
if( list === null ) return null;
|
|
405
|
+
|
|
406
|
+
let i;
|
|
407
|
+
for( i = 0; i < list.length; ++i ) {
|
|
408
|
+
if( !fnCondition( list[ i ] ) ) {
|
|
409
|
+
break
|
|
422
410
|
}
|
|
411
|
+
}
|
|
412
|
+
return list.slice( 0, i );
|
|
413
|
+
},
|
|
414
|
+
union: function( listA, listB, fnSelection ) {
|
|
415
|
+
if( listA === null && listB === null ) return null
|
|
416
|
+
if( listA === null ) return listB.slice()
|
|
417
|
+
if( listB === null ) return listA.slice()
|
|
418
|
+
|
|
419
|
+
if( !fnSelection ) {
|
|
420
|
+
return [ ...new Set( listA.concat( listB ) ) ]
|
|
421
|
+
}
|
|
423
422
|
|
|
424
|
-
|
|
425
|
-
|
|
423
|
+
const resultArray = []
|
|
424
|
+
const keys = []
|
|
426
425
|
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
}
|
|
426
|
+
for( let i = 0; i < listA.length; ++i ) {
|
|
427
|
+
const item = listA[ i ]
|
|
428
|
+
const key = fnSelection( item )
|
|
429
|
+
if( keys.indexOf( key ) === -1 ) {
|
|
430
|
+
keys.push( key )
|
|
431
|
+
resultArray.push( item )
|
|
434
432
|
}
|
|
433
|
+
}
|
|
435
434
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
}
|
|
435
|
+
for( let i = 0; i < listB.length; ++i ) {
|
|
436
|
+
const item = listB[ i ]
|
|
437
|
+
const key = fnSelection( item )
|
|
438
|
+
if( keys.indexOf( key ) === -1 ) {
|
|
439
|
+
keys.push( key )
|
|
440
|
+
resultArray.push( item )
|
|
443
441
|
}
|
|
444
|
-
|
|
445
|
-
return resultArray;
|
|
446
442
|
}
|
|
443
|
+
|
|
444
|
+
return resultArray;
|
|
447
445
|
}
|
|
448
446
|
};
|