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.
Files changed (52) hide show
  1. package/.editorconfig +12 -0
  2. package/.eslintignore +1 -0
  3. package/.eslintrc.json +34 -0
  4. package/.prettierrc +19 -0
  5. package/LICENSE +201 -0
  6. package/README.md +1 -0
  7. package/build/collections.d.ts +204 -0
  8. package/build/collections.js +545 -0
  9. package/build/datetime.d.ts +1 -0
  10. package/build/datetime.js +1 -0
  11. package/build/functools.d.ts +36 -0
  12. package/build/functools.js +79 -0
  13. package/build/globals.d.ts +175 -0
  14. package/build/globals.js +332 -0
  15. package/build/index.d.ts +7 -0
  16. package/build/index.js +7 -0
  17. package/build/itertools.d.ts +16 -0
  18. package/build/itertools.js +102 -0
  19. package/build/math.d.ts +16 -0
  20. package/build/math.js +67 -0
  21. package/build/objects.d.ts +0 -0
  22. package/build/objects.js +1 -0
  23. package/build/operators.d.ts +29 -0
  24. package/build/operators.js +128 -0
  25. package/build/random.d.ts +5 -0
  26. package/build/random.js +28 -0
  27. package/build/strings.d.ts +0 -0
  28. package/build/strings.js +1 -0
  29. package/build/util.d.ts +0 -0
  30. package/build/util.js +1 -0
  31. package/jasmine.json +14 -0
  32. package/package.json +71 -0
  33. package/src/collections.ts +614 -0
  34. package/src/datetime.ts +1 -0
  35. package/src/functools.ts +89 -0
  36. package/src/globals.d.ts +5 -0
  37. package/src/globals.ts +377 -0
  38. package/src/index.ts +7 -0
  39. package/src/itertools.ts +113 -0
  40. package/src/math.ts +73 -0
  41. package/src/objects.ts +0 -0
  42. package/src/operators.ts +126 -0
  43. package/src/random.ts +29 -0
  44. package/src/strings.ts +0 -0
  45. package/src/util.ts +0 -0
  46. package/tests/collections.spec.ts +199 -0
  47. package/tests/globals.spec.ts +232 -0
  48. package/tests/itertools.spec.ts +87 -0
  49. package/tests/operators.spec.ts +62 -0
  50. package/tsconfig.json +103 -0
  51. package/tsconfig.node.json +18 -0
  52. 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
+ })