Skip to content

Commit 3a7af6d

Browse files
committed
add missing tests; add enumerate
1 parent 83d0878 commit 3a7af6d

File tree

6 files changed

+400
-247
lines changed

6 files changed

+400
-247
lines changed

.vscode/settings.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,9 @@
55
"files.exclude": {
66
"coverage": true,
77
"yarn.lock": true
8+
},
9+
"code-runner.executorMap": {
10+
"typescript": "node --loader tsm",
11+
"javascript": "node"
812
}
913
}

package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"type": "module",
33
"name": "array-utils-ts",
4-
"version": "0.1.1",
4+
"version": "0.1.2",
55
"author": "Vlad Pronsky <[email protected]>",
66
"repository": "vladkens/array-utils-ts",
77
"description": "",
@@ -20,12 +20,12 @@
2020
},
2121
"dependencies": {},
2222
"devDependencies": {
23-
"c8": "^7.13.0",
24-
"pkgroll": "^1.10.0",
25-
"prettier": "^2.8.8",
26-
"prettier-plugin-organize-imports": "^3.2.2",
23+
"c8": "^8.0.1",
24+
"pkgroll": "^2.0.1",
25+
"prettier": "^3.1.0",
26+
"prettier-plugin-organize-imports": "^3.2.4",
2727
"tsm": "^2.3.0",
28-
"typescript": "^5.0.4",
28+
"typescript": "^5.3.2",
2929
"uvu": "^0.5.6"
3030
},
3131
"types": "./dist/main.d.cts",

readme.md

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -87,18 +87,6 @@ toggleItem([1, 2, 3], 3)
8787
// -> [1, 2]
8888
```
8989

90-
### replaceItem
91-
92-
```typescript
93-
import { replaceItem } from "array-utils-ts"
94-
95-
toggleItem([1, 2, 3], 4)
96-
// -> [1, 2, 3, 4]
97-
98-
toggleItem([1, 2, 3], 3)
99-
// -> [1, 2]
100-
```
101-
10290
### updateByKey
10391

10492
```typescript
@@ -142,40 +130,44 @@ import { toggleByKey } from "array-utils-ts"
142130
const arr1 = [{ id: 1, v: 1 }, { id: 2, v: 1 }]
143131

144132
const arr2 = toggleByKey(arr1, "id", { id: 1, v: 2 })
145-
// -> [{ id: 2, v: 1 }]
146-
// arr1 !== arr2
133+
// -> [{ id: 2, v: 1 }]; arr1 !== arr2
147134

148135
const arr3 = toggleByKey(arr2, "id", { id: 3, v: 1 })
149-
// -> [{ id: 2, v: 1 }, { id: 3, v: 1 }]
150-
// arr2 !== arr3
136+
// -> [{ id: 2, v: 1 }, { id: 3, v: 1 }]; arr2 !== arr3
151137
```
152138

153139
### isFirstByKey
154140

141+
Check if given object is first in collection by some key.
142+
155143
```typescript
156144
import { isFirstByKey } from "array-utils-ts"
157145

158-
// prettier-ignore
159-
const arr = [{ id: 1, v: 1 }, { id: 2, v: 1 }]
160-
161-
isFirstByKey(arr, "id", { id: 1, v: 2 })
162-
// -> true
163-
164-
isFirstByKey(arr, "id", { id: 2, v: 1 })
165-
// -> false
146+
const arr = [{ id: 1 }, { id: 2 }, { id: 3 }]
147+
isFirstByKey(arr, "id", { id: 1 }) // -> true
148+
isFirstByKey(arr, "id", { id: 2 }) // -> false
149+
isFirstByKey(arr, "id", { id: 3 }) // -> false
166150
```
167151

168152
### isLastByKey
169153

154+
Check if given object is last in collection by some key.
155+
170156
```typescript
171157
import { isLastByKey } from "array-utils-ts"
172158

173-
// prettier-ignore
174-
const arr = [{ id: 1, v: 1 }, { id: 2, v: 1 }]
159+
const arr = [{ id: 1 }, { id: 2 }, { id: 3 }]
160+
isLastByKey(arr, "id", { id: 1 }) // -> false
161+
isLastByKey(arr, "id", { id: 2 }) // -> false
162+
isLastByKey(arr, "id", { id: 3 }) // -> true
163+
```
175164

176-
isLastByKey(arr, "id", { id: 1, v: 1 })
177-
// -> false
165+
### enumerate
178166

179-
isLastByKey(arr, "id", { id: 2, v: 1 })
180-
// -> true
167+
```typescript
168+
import { enumerate } from "array-utils-ts"
169+
170+
const arr = ["a", "b", "c"]
171+
enumerate(arr) // -> [[0, "a"], [1, "b"], [2, "c"]]
172+
enumerate(arr, 1) // -> [[1, "a"], [2, "b"], [3, "c"]]
181173
```

src/main.test.ts

Lines changed: 111 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,18 @@
11
import { test } from "uvu"
2-
import { equal } from "uvu/assert"
3-
import { filterEmpty, filterNullable, hasEmpty, isUniq } from "./main"
2+
import { equal, not } from "uvu/assert"
3+
import {
4+
enumerate,
5+
filterEmpty,
6+
filterNullable,
7+
hasEmpty,
8+
isFirstByKey,
9+
isLastByKey,
10+
isUniq,
11+
toggleByKey,
12+
toggleItem,
13+
updateByKey,
14+
upsertByKey,
15+
} from "./main"
416

517
test("filterNullable", () => {
618
equal(filterNullable([1, 2, 3]), [1, 2, 3])
@@ -70,4 +82,101 @@ test("hasEmpty", () => {
7082
equal(hasEmpty(["a", "b", undefined]), true)
7183
})
7284

85+
test("toggleItem", () => {
86+
const arr1 = [1, 2, 3]
87+
88+
const arr2 = toggleItem(arr1, 4)
89+
equal(arr2.length, 4)
90+
equal(arr2, [1, 2, 3, 4])
91+
not.equal(arr2, arr1)
92+
93+
const arr3 = toggleItem(arr1, 3)
94+
equal(arr3.length, 2)
95+
equal(arr3, [1, 2])
96+
not.equal(arr3, arr1)
97+
98+
const arrobj1 = [{ id: 1 }, { id: 2 }, { id: 3 }]
99+
100+
// new ref so always add
101+
const arrobj2 = toggleItem(arrobj1, { id: 1 })
102+
equal(arrobj2.length, 4)
103+
// prettier-ignore
104+
equal(arrobj2.map(x => x.id), [1, 2, 3, 1])
105+
106+
// existing ref so remove
107+
const arrobj3 = toggleItem(arrobj2, arrobj2[0])
108+
equal(arrobj3.length, 3)
109+
// prettier-ignore
110+
equal(arrobj3.map(x => x.id), [2, 3, 1])
111+
})
112+
113+
test("updateByKey", () => {
114+
// prettier-ignore
115+
const arr1 = [{ id: 1, v: 1 }, { id: 2, v: 1 }]
116+
117+
const arr2 = updateByKey(arr1, "id", { id: 1, v: 2 })
118+
equal(arr2.length, 2)
119+
// prettier-ignore
120+
equal(arr2, [{ id: 1, v: 2 }, { id: 2, v: 1 }])
121+
not.equal(arr2, arr1)
122+
123+
const arr3 = updateByKey(arr2, "id", { id: 3, v: 1 })
124+
equal(arr3.length, 2)
125+
// prettier-ignore
126+
equal(arr3, [{ id: 1, v: 2 }, { id: 2, v: 1 }])
127+
equal(arr2, arr3)
128+
})
129+
130+
test("upsertByKey", () => {
131+
// prettier-ignore
132+
const arr1 = [{ id: 1, v: 1 }, { id: 2, v: 1 }]
133+
134+
const arr2 = upsertByKey(arr1, "id", { id: 1, v: 2 })
135+
equal(arr2.length, 2)
136+
// prettier-ignore
137+
equal(arr2, [{ id: 1, v: 2 }, { id: 2, v: 1 }])
138+
not.equal(arr2, arr1)
139+
140+
const arr3 = upsertByKey(arr2, "id", { id: 3, v: 1 })
141+
equal(arr3.length, 3)
142+
// prettier-ignore
143+
equal(arr3, [{ id: 1, v: 2 }, { id: 2, v: 1 }, { id: 3, v: 1 }])
144+
not.equal(arr3, arr2)
145+
})
146+
147+
test("toggleByKey", () => {
148+
const arr1 = [{ id: 1 }, { id: 2 }, { id: 3 }]
149+
150+
const arr2 = toggleByKey(arr1, "id", { id: 1 })
151+
equal(arr2.length, 2)
152+
equal(arr2, [{ id: 2 }, { id: 3 }])
153+
not.equal(arr2, arr1)
154+
155+
const arr3 = toggleByKey(arr2, "id", { id: 1 })
156+
equal(arr3.length, 3)
157+
equal(arr3, [{ id: 2 }, { id: 3 }, { id: 1 }])
158+
not.equal(arr3, arr2)
159+
})
160+
161+
test("isFirstByKey", () => {
162+
const arr = [{ id: 1 }, { id: 2 }, { id: 3 }]
163+
equal(isFirstByKey(arr, "id", { id: 1 }), true)
164+
equal(isFirstByKey(arr, "id", { id: 2 }), false)
165+
equal(isFirstByKey(arr, "id", { id: 3 }), false)
166+
})
167+
168+
test("isLastByKey", () => {
169+
const arr = [{ id: 1 }, { id: 2 }, { id: 3 }]
170+
equal(isLastByKey(arr, "id", { id: 1 }), false)
171+
equal(isLastByKey(arr, "id", { id: 2 }), false)
172+
equal(isLastByKey(arr, "id", { id: 3 }), true)
173+
})
174+
175+
test("enumerate", () => {
176+
// prettier-ignore
177+
equal(enumerate(["a", "b", "c"]), [[0, "a"], [1, "b"], [2, "c"]])
178+
// prettier-ignore
179+
equal(enumerate(["a", "b", "c"], 1), [[1, "a"], [2, "b"], [3, "c"]])
180+
})
181+
73182
test.run()

src/main.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,7 @@ export const isFirstByKey = <T extends Dict>(arr: T[], key: keyof T, obj: T): bo
5252
export const isLastByKey = <T extends Dict>(arr: T[], key: keyof T, obj: T): boolean => {
5353
return arr.findIndex((x) => x[key] === obj[key]) === arr.length - 1
5454
}
55+
56+
export const enumerate = <T>(arr: T[], start = 0): [number, T][] => {
57+
return arr.map((x, i) => [i + start, x])
58+
}

0 commit comments

Comments
 (0)