atomic-fns 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/.editorconfig +12 -0
- package/.eslintignore +1 -0
- package/.eslintrc.json +34 -0
- package/.prettierrc +19 -0
- package/LICENSE +201 -0
- package/README.md +1 -0
- package/build/collections.d.ts +204 -0
- package/build/collections.js +545 -0
- package/build/datetime.d.ts +1 -0
- package/build/datetime.js +1 -0
- package/build/functools.d.ts +36 -0
- package/build/functools.js +79 -0
- package/build/globals.d.ts +175 -0
- package/build/globals.js +332 -0
- package/build/index.d.ts +7 -0
- package/build/index.js +7 -0
- package/build/itertools.d.ts +16 -0
- package/build/itertools.js +102 -0
- package/build/math.d.ts +16 -0
- package/build/math.js +67 -0
- package/build/objects.d.ts +0 -0
- package/build/objects.js +1 -0
- package/build/operators.d.ts +29 -0
- package/build/operators.js +128 -0
- package/build/random.d.ts +5 -0
- package/build/random.js +28 -0
- package/build/strings.d.ts +0 -0
- package/build/strings.js +1 -0
- package/build/util.d.ts +0 -0
- package/build/util.js +1 -0
- package/jasmine.json +14 -0
- package/package.json +71 -0
- package/src/collections.ts +614 -0
- package/src/datetime.ts +1 -0
- package/src/functools.ts +89 -0
- package/src/globals.d.ts +5 -0
- package/src/globals.ts +377 -0
- package/src/index.ts +7 -0
- package/src/itertools.ts +113 -0
- package/src/math.ts +73 -0
- package/src/objects.ts +0 -0
- package/src/operators.ts +126 -0
- package/src/random.ts +29 -0
- package/src/strings.ts +0 -0
- package/src/util.ts +0 -0
- package/tests/collections.spec.ts +199 -0
- package/tests/globals.spec.ts +232 -0
- package/tests/itertools.spec.ts +87 -0
- package/tests/operators.spec.ts +62 -0
- package/tsconfig.json +103 -0
- package/tsconfig.node.json +18 -0
- package/tsconfig.xo.json +9 -0
package/src/random.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { isObject, round } from './globals'
|
|
2
|
+
|
|
3
|
+
export const random = (min = 0, max = 1) => Math.random() * (max - min) + min
|
|
4
|
+
|
|
5
|
+
export const randomInt = (min = 0, max = 1) => round(random(min, max), 0)
|
|
6
|
+
|
|
7
|
+
export const choice = (arr: any[]) => {
|
|
8
|
+
if (!arr?.length) return
|
|
9
|
+
const index = randomInt(0, arr.length - 1)
|
|
10
|
+
return arr[index]
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function sample(arr: any[], k: number) {
|
|
14
|
+
if (!arr?.length) return
|
|
15
|
+
const result: any[] = []
|
|
16
|
+
while (k--) result.push(choice(arr))
|
|
17
|
+
return result
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function shuffle(arr) {
|
|
21
|
+
if (isObject(arr)) arr = Object.values(arr)
|
|
22
|
+
const n = arr.length - 1
|
|
23
|
+
for (let i = n; i > 0; i--) {
|
|
24
|
+
const j = randomInt(0, i)
|
|
25
|
+
const temp = arr[j]
|
|
26
|
+
arr[j] = arr[i]
|
|
27
|
+
arr[i] = temp
|
|
28
|
+
}
|
|
29
|
+
}
|
package/src/strings.ts
ADDED
|
File without changes
|
package/src/util.ts
ADDED
|
File without changes
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import assert from 'assert'
|
|
2
|
+
import {
|
|
3
|
+
filter,
|
|
4
|
+
find,
|
|
5
|
+
forEach,
|
|
6
|
+
findRight,
|
|
7
|
+
flatten,
|
|
8
|
+
map,
|
|
9
|
+
contains,
|
|
10
|
+
flattenObj,
|
|
11
|
+
clone,
|
|
12
|
+
pick,
|
|
13
|
+
omit,
|
|
14
|
+
uniq,
|
|
15
|
+
sortedUniq,
|
|
16
|
+
merge,
|
|
17
|
+
difference,
|
|
18
|
+
intersection,
|
|
19
|
+
union
|
|
20
|
+
} from '../src/collections.js'
|
|
21
|
+
|
|
22
|
+
describe('collections', () => {
|
|
23
|
+
it('contains', () => {
|
|
24
|
+
assert(contains([4, 7, 1, 9], 1))
|
|
25
|
+
assert(!contains([4, 7, 1, 9], NaN))
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
it('clone', () => {
|
|
29
|
+
let arr = [4, 7, 1, 9]
|
|
30
|
+
assert.deepEqual(clone(arr), arr)
|
|
31
|
+
let target = { user: 'fred', age: 40, active: false }
|
|
32
|
+
assert.deepEqual(clone(target), target)
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('difference', () => {
|
|
36
|
+
let a = [1, 2, 5]
|
|
37
|
+
let b = [3, 4, 5]
|
|
38
|
+
assert.deepEqual(sortedUniq(difference(a, b)), [1, 2, 3, 4])
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('intersection', () => {
|
|
42
|
+
let a = [1, 2, 5]
|
|
43
|
+
let b = [3, 4, 5]
|
|
44
|
+
assert.deepEqual([...intersection(a, b)], [5])
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it('union', () => {
|
|
48
|
+
let a = [1, 2, 5]
|
|
49
|
+
let b = [3, 4, 5]
|
|
50
|
+
assert.deepEqual(sortedUniq(union(a, b)), [1, 2, 3, 4, 5])
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it('filter', () => {
|
|
54
|
+
assert(filter(null) == undefined)
|
|
55
|
+
let users = [
|
|
56
|
+
{ user: 'barney', age: 36, active: true },
|
|
57
|
+
{ user: 'fred', age: 40, active: false }
|
|
58
|
+
]
|
|
59
|
+
assert.deepEqual(filter(users, { age: 36 }), [users[0]])
|
|
60
|
+
assert.deepEqual(
|
|
61
|
+
filter(users, (o) => o.active),
|
|
62
|
+
[users[0]]
|
|
63
|
+
)
|
|
64
|
+
assert.deepEqual(filter(users, 'active'), [users[0]])
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it('find', () => {
|
|
68
|
+
let users = [
|
|
69
|
+
{ user: 'barney', age: 36, active: true },
|
|
70
|
+
{ user: 'fred', age: 40, active: false }
|
|
71
|
+
]
|
|
72
|
+
assert(find(users, { age: 36 }) === users[0])
|
|
73
|
+
assert(find(users, (o) => o.active) === users[0])
|
|
74
|
+
assert(find(users, 'active') === users[0])
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
it('findRight', () => {
|
|
78
|
+
let users = [
|
|
79
|
+
{ user: 'barney', age: 36, active: true },
|
|
80
|
+
{ user: 'fred', age: 40, active: false },
|
|
81
|
+
{ user: 'barney', age: 36, active: true }
|
|
82
|
+
]
|
|
83
|
+
assert(findRight(users, { age: 36 }) === users[2])
|
|
84
|
+
assert(findRight(users, (o) => o.active) === users[2])
|
|
85
|
+
assert(findRight(users, 'active') === users[2])
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
it('forEach', () => {
|
|
89
|
+
let users = [
|
|
90
|
+
{ user: 'barney', age: 36, active: true },
|
|
91
|
+
{ user: 'fred', age: 40, active: false }
|
|
92
|
+
]
|
|
93
|
+
let result = [] as any[]
|
|
94
|
+
forEach(users, (value, key) => result.push([key, value]))
|
|
95
|
+
assert.deepEqual(
|
|
96
|
+
result,
|
|
97
|
+
users.map((x, i) => [i, x])
|
|
98
|
+
)
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
it('forEach object key', () => {
|
|
102
|
+
let target = { user: 'fred', age: 40, active: false }
|
|
103
|
+
let objs = [] as any[]
|
|
104
|
+
forEach(target, (value, key) => objs.push([key, value]))
|
|
105
|
+
assert.deepEqual(objs, Object.entries(target))
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
it('flattenArray', () => {
|
|
109
|
+
let data = flatten([1, 2, [3, 4], 5])
|
|
110
|
+
assert.deepEqual(data, [1, 2, 3, 4, 5])
|
|
111
|
+
data = flatten([1, 2, [3, [4]], [5]], true)
|
|
112
|
+
assert.deepEqual(data, [1, 2, 3, 4, 5])
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
it('flattenObj', () => {
|
|
116
|
+
const data = {
|
|
117
|
+
dates: {
|
|
118
|
+
expiry_date: '30 sep 2018',
|
|
119
|
+
available: '30 sep 2017',
|
|
120
|
+
min_contract_period: [
|
|
121
|
+
{
|
|
122
|
+
id: 1,
|
|
123
|
+
name: '1 month'
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
},
|
|
127
|
+
price: {
|
|
128
|
+
currency: 'RM',
|
|
129
|
+
value: 1500
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
assert.deepEqual(flattenObj(data), {
|
|
133
|
+
'dates.expiry_date': '30 sep 2018',
|
|
134
|
+
'dates.available': '30 sep 2017',
|
|
135
|
+
'dates.min_contract_period[0].id': 1,
|
|
136
|
+
'dates.min_contract_period[0].name': '1 month',
|
|
137
|
+
'price.currency': 'RM',
|
|
138
|
+
'price.value': 1500
|
|
139
|
+
})
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
it('map', () => {
|
|
143
|
+
let target = { user: 'fred', age: 40, active: false }
|
|
144
|
+
let getEntries = (value, key) => [key, value]
|
|
145
|
+
assert.deepEqual(map(target, getEntries), Object.entries(target))
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
it('merge', () => {
|
|
149
|
+
let object = {
|
|
150
|
+
a: [{ b: 2 }, { d: 4 }]
|
|
151
|
+
}
|
|
152
|
+
let other = {
|
|
153
|
+
a: [{ c: 3 }, { e: 5 }],
|
|
154
|
+
foo: null,
|
|
155
|
+
bar: true,
|
|
156
|
+
noop: undefined
|
|
157
|
+
}
|
|
158
|
+
assert.deepEqual(merge(object, other), {
|
|
159
|
+
a: [
|
|
160
|
+
{ b: 2, c: 3 },
|
|
161
|
+
{ d: 4, e: 5 }
|
|
162
|
+
],
|
|
163
|
+
foo: null,
|
|
164
|
+
bar: true
|
|
165
|
+
})
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
it('pick', () => {
|
|
169
|
+
let target = { user: 'fred', age: 40, active: false }
|
|
170
|
+
assert.deepEqual(pick(target, ['user']), { user: 'fred' })
|
|
171
|
+
assert.deepEqual(
|
|
172
|
+
pick(target, (x) => x >= 40),
|
|
173
|
+
{ age: 40 }
|
|
174
|
+
)
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
it('omit', () => {
|
|
178
|
+
let target = { user: 'fred', age: 40, active: false }
|
|
179
|
+
assert.deepEqual(omit(target, ['age', 'active']), { user: 'fred' })
|
|
180
|
+
assert.deepEqual(
|
|
181
|
+
omit(target, (x) => !x),
|
|
182
|
+
{ user: 'fred', age: 40 }
|
|
183
|
+
)
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
it('sortedUniq', () => {
|
|
187
|
+
let arr = [4, 7, 1, 9, 1, 7, 4]
|
|
188
|
+
let sort = sortedUniq(arr)
|
|
189
|
+
assert.deepEqual(sort, [1, 4, 7, 9])
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
it('uniq', () => {
|
|
193
|
+
let arr = [4, 7, 1, 1, 9, 4, 7]
|
|
194
|
+
let distinct = uniq(arr)
|
|
195
|
+
assert.deepEqual(distinct, [4, 7, 1, 9])
|
|
196
|
+
distinct = uniq(arr, (x) => x * 2)
|
|
197
|
+
assert.deepEqual(distinct, [8, 14, 2, 18])
|
|
198
|
+
})
|
|
199
|
+
})
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import assert from 'assert'
|
|
2
|
+
import {
|
|
3
|
+
True,
|
|
4
|
+
False,
|
|
5
|
+
CustomError,
|
|
6
|
+
type,
|
|
7
|
+
str,
|
|
8
|
+
isBool,
|
|
9
|
+
isObject,
|
|
10
|
+
isString,
|
|
11
|
+
isArray,
|
|
12
|
+
isArrayLike,
|
|
13
|
+
isNumber,
|
|
14
|
+
isNaN,
|
|
15
|
+
isNull,
|
|
16
|
+
isBigint,
|
|
17
|
+
isFunc,
|
|
18
|
+
isPromise,
|
|
19
|
+
isSymbol,
|
|
20
|
+
isAsync,
|
|
21
|
+
uniqueId,
|
|
22
|
+
call,
|
|
23
|
+
chr,
|
|
24
|
+
ord,
|
|
25
|
+
keys,
|
|
26
|
+
values,
|
|
27
|
+
round,
|
|
28
|
+
enumerate,
|
|
29
|
+
isGenerator,
|
|
30
|
+
hash,
|
|
31
|
+
hashCode,
|
|
32
|
+
HASH_KEY,
|
|
33
|
+
bin,
|
|
34
|
+
hex,
|
|
35
|
+
oct,
|
|
36
|
+
list,
|
|
37
|
+
next,
|
|
38
|
+
get
|
|
39
|
+
} from '../build/globals.js'
|
|
40
|
+
import { isEmpty } from '../src/globals.js'
|
|
41
|
+
|
|
42
|
+
function cb() {}
|
|
43
|
+
|
|
44
|
+
describe('globals', () => {
|
|
45
|
+
it('CustomError', () => {
|
|
46
|
+
let err = new CustomError('custom')
|
|
47
|
+
assert.equal(err.message, 'custom')
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
it('type', () => {
|
|
51
|
+
assert(True())
|
|
52
|
+
assert(!False())
|
|
53
|
+
assert(type(null) === 'null')
|
|
54
|
+
assert(type(undefined) === 'undefined')
|
|
55
|
+
assert(type(true) === 'boolean')
|
|
56
|
+
assert(type(Boolean()) === 'boolean')
|
|
57
|
+
assert(type(True()) === 'boolean')
|
|
58
|
+
assert(type(False()) === 'boolean')
|
|
59
|
+
assert(type('') === 'string')
|
|
60
|
+
assert(type(String('')) === 'string')
|
|
61
|
+
assert(type(NaN) === 'NaN')
|
|
62
|
+
assert(type(42) === 'number')
|
|
63
|
+
assert(type(Number(42)) === 'number')
|
|
64
|
+
assert(type(Number('42')) === 'number')
|
|
65
|
+
assert(type(parseFloat('42.0')) === 'number')
|
|
66
|
+
assert(type(42n) === 'bigint')
|
|
67
|
+
assert(type(BigInt('42')) === 'bigint')
|
|
68
|
+
assert(type([]) === 'array')
|
|
69
|
+
assert(type({}) === 'object')
|
|
70
|
+
assert(type(type) === 'function')
|
|
71
|
+
assert(type(Symbol()) === 'symbol')
|
|
72
|
+
assert(type(new Promise(cb)) === 'promise')
|
|
73
|
+
assert(isBool(true))
|
|
74
|
+
assert(isBool(Boolean()))
|
|
75
|
+
assert(!isBool(''))
|
|
76
|
+
assert(!isBool({}))
|
|
77
|
+
assert(!isBool(undefined))
|
|
78
|
+
assert(isObject({}))
|
|
79
|
+
assert(!isObject(''))
|
|
80
|
+
assert(!isObject([]))
|
|
81
|
+
assert(isString(''))
|
|
82
|
+
assert(!isString([]))
|
|
83
|
+
assert(isArray([]))
|
|
84
|
+
assert(isArrayLike([]))
|
|
85
|
+
assert(!isArray(''))
|
|
86
|
+
assert(!isArrayLike(''))
|
|
87
|
+
assert(isFunc(cb))
|
|
88
|
+
assert(!isFunc([]))
|
|
89
|
+
assert(isAsync(async function () {}))
|
|
90
|
+
assert(isAsync(async () => {}))
|
|
91
|
+
assert(!isAsync(cb))
|
|
92
|
+
assert(isNaN(NaN))
|
|
93
|
+
assert(!isNumber(NaN))
|
|
94
|
+
assert(isNumber(42))
|
|
95
|
+
assert(isNumber(Number(42)))
|
|
96
|
+
assert(isNumber(Number('42')))
|
|
97
|
+
assert(isNumber(parseFloat('42.0')))
|
|
98
|
+
assert(isBigint(42n))
|
|
99
|
+
assert(isBigint(BigInt('42')))
|
|
100
|
+
assert(isPromise(new Promise(cb)))
|
|
101
|
+
assert(isSymbol(Symbol()))
|
|
102
|
+
assert(isNull(null))
|
|
103
|
+
assert(isNull(undefined))
|
|
104
|
+
assert(!isNull(''))
|
|
105
|
+
assert(!isNull([]))
|
|
106
|
+
assert(!isNull({}))
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
it('str', () => {
|
|
110
|
+
assert(str(undefined) === '')
|
|
111
|
+
assert(str(null) === '')
|
|
112
|
+
assert(str(NaN) === 'NaN')
|
|
113
|
+
assert(str(42) === '42')
|
|
114
|
+
assert(str([]) === '')
|
|
115
|
+
assert(str([1, 2, 3]) === '1,2,3')
|
|
116
|
+
assert(str({}) === '[object Object]')
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
it('uniqueId', () => {
|
|
120
|
+
const uid = uniqueId()
|
|
121
|
+
assert(isNumber(uid))
|
|
122
|
+
assert.match(uniqueId('contact_'), /^contact_\d+/)
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
it('call', () => {
|
|
126
|
+
const obj = {
|
|
127
|
+
foo() {
|
|
128
|
+
return 42
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
assert(call(obj, 'foo') === 42)
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
it('chr', () => {
|
|
135
|
+
assert(chr(97) === 'a')
|
|
136
|
+
assert(chr(8364) === '€')
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
it('ord', () => {
|
|
140
|
+
assert(ord('a') === 97)
|
|
141
|
+
assert(ord('€') === 8364)
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
it('keys', () => {
|
|
145
|
+
let obj = { a: 1, b: 2 }
|
|
146
|
+
assert.deepEqual(keys(obj), Object.keys(obj))
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
it('values', () => {
|
|
150
|
+
let obj = { a: 1, b: 2 }
|
|
151
|
+
assert.deepEqual(values(obj), Object.values(obj))
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
it('round', () => {
|
|
155
|
+
assert(round(0.5) === 1)
|
|
156
|
+
assert(round(-0.5) === 0)
|
|
157
|
+
assert(round(1.5) === 2)
|
|
158
|
+
assert(round(1.54, 2) === 1.54)
|
|
159
|
+
assert(round(1.545, 3) === 1.545)
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
it('enumerate', () => {
|
|
163
|
+
let iter = enumerate(['foo', 'bar', 'baz'])
|
|
164
|
+
assert(isGenerator(iter))
|
|
165
|
+
let values = [...iter]
|
|
166
|
+
assert.deepEqual(values, [
|
|
167
|
+
[0, 'foo'],
|
|
168
|
+
[1, 'bar'],
|
|
169
|
+
[2, 'baz']
|
|
170
|
+
])
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
it('next', () => {
|
|
174
|
+
const iter = enumerate([1, 2, 3])
|
|
175
|
+
assert.deepEqual(next(iter), [0, 1])
|
|
176
|
+
assert.deepEqual(next(iter), [1, 2])
|
|
177
|
+
assert.deepEqual(next(iter), [2, 3])
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
it('hash', () => {
|
|
181
|
+
let obj = { a: 1, b: 2 }
|
|
182
|
+
let h = hash(obj)
|
|
183
|
+
assert(h === hash(obj))
|
|
184
|
+
assert(obj[HASH_KEY] === h)
|
|
185
|
+
})
|
|
186
|
+
|
|
187
|
+
it('hashCode', () => {
|
|
188
|
+
let obj = '{ a: 1, b: 2 }'
|
|
189
|
+
assert(hash(obj) === hashCode(obj))
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
it('bin', () => {
|
|
193
|
+
assert(bin(42) === (42).toString(2))
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
it('hex', () => {
|
|
197
|
+
assert(hex(42) === (42).toString(16))
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
it('oct', () => {
|
|
201
|
+
assert(oct(42) === (42).toString(8))
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
it('list', () => {
|
|
205
|
+
const arr = [1, 2, 3]
|
|
206
|
+
assert.deepEqual(list(arr), arr)
|
|
207
|
+
assert.deepEqual(list(), [])
|
|
208
|
+
})
|
|
209
|
+
|
|
210
|
+
it('get', () => {
|
|
211
|
+
const arr = [1, 2, 3]
|
|
212
|
+
assert(get(arr, '2') === 3)
|
|
213
|
+
assert(get(arr, '3', false) === false)
|
|
214
|
+
assert(get(arr, '3', false) === false)
|
|
215
|
+
let obj = { foo: { bar: true } }
|
|
216
|
+
let h = hash(obj)
|
|
217
|
+
assert(get(obj, 'foo.bar'))
|
|
218
|
+
assert(get(obj, ['foo', 'bar']))
|
|
219
|
+
assert(get(obj, HASH_KEY) === h)
|
|
220
|
+
assert(get(obj, [HASH_KEY]) === h)
|
|
221
|
+
})
|
|
222
|
+
|
|
223
|
+
it('isEmpty', () => {
|
|
224
|
+
assert(isEmpty(null))
|
|
225
|
+
assert(isEmpty(undefined))
|
|
226
|
+
assert(isEmpty([]))
|
|
227
|
+
assert(isEmpty(''))
|
|
228
|
+
assert(isEmpty({}))
|
|
229
|
+
assert(isEmpty(0))
|
|
230
|
+
assert(!isEmpty(1))
|
|
231
|
+
})
|
|
232
|
+
})
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import assert from 'assert'
|
|
2
|
+
import { list } from '../src/globals.js'
|
|
3
|
+
import { reversed, sort, sorted, times, zip } from '../src/itertools.js'
|
|
4
|
+
|
|
5
|
+
function cb() {}
|
|
6
|
+
|
|
7
|
+
describe('operators', () => {
|
|
8
|
+
it('reversed', () => {
|
|
9
|
+
let arr = [3, 2, 1]
|
|
10
|
+
let reverse = reversed(arr)
|
|
11
|
+
arr.reverse()
|
|
12
|
+
assert.deepEqual(arr, reverse)
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
it('sort', () => {
|
|
16
|
+
let arr = [3, 2, 1]
|
|
17
|
+
assert.deepEqual(sort(arr), [1, 2, 3])
|
|
18
|
+
arr = [3, 1, 2]
|
|
19
|
+
assert.deepEqual(sort(arr, true), [3, 2, 1])
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
it('sorted', () => {
|
|
23
|
+
let arr = [3, 2, 1]
|
|
24
|
+
let sort = sorted(arr)
|
|
25
|
+
arr.sort()
|
|
26
|
+
assert.deepEqual(sort, arr)
|
|
27
|
+
// reversed order
|
|
28
|
+
assert.deepEqual(sorted([3, 1, 2], true), [3, 2, 1])
|
|
29
|
+
let users = [
|
|
30
|
+
{ user: 'fred', age: 40 },
|
|
31
|
+
{ user: 'barney', age: 36 }
|
|
32
|
+
]
|
|
33
|
+
// compare by age key
|
|
34
|
+
assert.deepEqual(
|
|
35
|
+
sorted(users, (u) => u.age),
|
|
36
|
+
[
|
|
37
|
+
{ user: 'barney', age: 36 },
|
|
38
|
+
{ user: 'fred', age: 40 }
|
|
39
|
+
]
|
|
40
|
+
)
|
|
41
|
+
// using key and reverse
|
|
42
|
+
assert.deepEqual(
|
|
43
|
+
sorted(users, (u) => u.age, true),
|
|
44
|
+
[
|
|
45
|
+
{ user: 'fred', age: 40 },
|
|
46
|
+
{ user: 'barney', age: 36 }
|
|
47
|
+
]
|
|
48
|
+
)
|
|
49
|
+
// using custom compare
|
|
50
|
+
assert.deepEqual(
|
|
51
|
+
sorted(users, false, (x, y) => (x.user <= y.user ? -1 : 1)),
|
|
52
|
+
[
|
|
53
|
+
{ user: 'barney', age: 36 },
|
|
54
|
+
{ user: 'fred', age: 40 }
|
|
55
|
+
]
|
|
56
|
+
)
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('times', () => {
|
|
60
|
+
let arr = list(times(5, (x) => x))
|
|
61
|
+
assert.deepEqual(arr, [0, 1, 2, 3, 4])
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
it('zip', () => {
|
|
65
|
+
let users1 = [
|
|
66
|
+
{ user: 'barney', age: 36 },
|
|
67
|
+
{ user: 'fred', age: 40 }
|
|
68
|
+
]
|
|
69
|
+
let users2 = [
|
|
70
|
+
{ user: 'fred', age: 40 },
|
|
71
|
+
{ user: 'barney', age: 36 }
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
let results = [] as any
|
|
75
|
+
for (const t of zip(users1, users2)) {
|
|
76
|
+
results.push(t)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
let [first1, first2] = results[0]
|
|
80
|
+
assert(first1 === users1[0])
|
|
81
|
+
assert(first2 === users2[0])
|
|
82
|
+
|
|
83
|
+
let [second1, second2] = results[1]
|
|
84
|
+
assert(second1 === users1[1])
|
|
85
|
+
assert(second2 === users2[1])
|
|
86
|
+
})
|
|
87
|
+
})
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import assert from 'assert'
|
|
2
|
+
import { isEmpty } from '../src/globals.js'
|
|
3
|
+
import { bool, id, isinstance, not, all, any, comp, shallowEqual } from '../src/operators.js'
|
|
4
|
+
|
|
5
|
+
describe('operators', () => {
|
|
6
|
+
it('all', () => {
|
|
7
|
+
assert(all([1, true, [], 'test', {}]))
|
|
8
|
+
assert(!all([[], {}, '']))
|
|
9
|
+
assert(all([[], {}, ''], isEmpty))
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
it('any', () => {
|
|
13
|
+
assert(any([1, true, [], 'test', {}]))
|
|
14
|
+
assert(!any([0, false, '']))
|
|
15
|
+
assert(any([0, false, ''], (x) => !x))
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it('bool', () => {
|
|
19
|
+
assert(bool(1))
|
|
20
|
+
assert(bool(true))
|
|
21
|
+
assert(bool(false) === false)
|
|
22
|
+
assert(not(false))
|
|
23
|
+
assert(not(''))
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it('comp', () => {
|
|
27
|
+
assert(comp(1, 1) === 0)
|
|
28
|
+
assert(comp(2, 3) === -1)
|
|
29
|
+
assert(comp(4, 3) === 1)
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it('id', () => {
|
|
33
|
+
let x = Math.random()
|
|
34
|
+
assert(id(x) === x)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('isinstance', () => {
|
|
38
|
+
assert(isinstance([], Array))
|
|
39
|
+
assert(isinstance(Array(), Array))
|
|
40
|
+
assert(isinstance(Object(), Object))
|
|
41
|
+
assert(isinstance(new Set(), Set))
|
|
42
|
+
assert(isinstance(new Map(), Map))
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('shallowEqual', () => {
|
|
46
|
+
assert(shallowEqual({}, {}))
|
|
47
|
+
assert(shallowEqual([], []))
|
|
48
|
+
assert(shallowEqual({ test: true }, { test: true }))
|
|
49
|
+
assert(
|
|
50
|
+
shallowEqual(
|
|
51
|
+
{
|
|
52
|
+
value: 42,
|
|
53
|
+
// custom equals implementation will be used
|
|
54
|
+
eq(other) {
|
|
55
|
+
return this.value === other.value
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
{ value: 42 }
|
|
59
|
+
)
|
|
60
|
+
)
|
|
61
|
+
})
|
|
62
|
+
})
|