Skip to content

Commit 7778d06

Browse files
committed
unique
1 parent 77734da commit 7778d06

3 files changed

Lines changed: 61 additions & 2 deletions

File tree

vecxt/src/doublearray.scala

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,47 @@ package vecxt
22

33
import narr.*
44
import vecxt.JsNativeDoubleArrays.*
5-
65
import arrays.*
76

87
object DoubleArrays:
9-
// extension (vec: NArray[Double])
8+
extension (vec: NArray[Double])
9+
inline def unique: NArray[Double] =
10+
if (vec.size == 0) {
11+
NArray.empty[Double]
12+
} else {
13+
14+
val data = narr.copy[Double](vec)
15+
narr.sort(data)()
16+
var elementCount = 1
17+
var lastElement = data(0)
18+
19+
var i = 0
20+
while (i < data.length) {
21+
val di = data(i)
22+
if (di != lastElement) {
23+
elementCount += 1
24+
lastElement = di
25+
}
26+
i += 1
27+
}
28+
29+
val result = NArray.ofSize[Double](elementCount)
30+
result(0) = data(0)
31+
lastElement = data(0)
32+
var idx = 1
33+
i = 0
34+
while (i < data.length) {
35+
val di = data(i)
36+
if (di != lastElement) {
37+
result(idx) = di
38+
lastElement = di
39+
idx += 1
40+
}
41+
i += 1
42+
}
43+
44+
result
45+
}
1046

1147
// inline def lt(num: Double): NArray[Boolean] = vec < num
1248

vecxt/test/src/array.test.scala

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,29 @@ class ArrayExtensionSuite extends munit.FunSuite:
3333
assert(out.contains("5"))
3434
}
3535

36+
test("unique") {
37+
val v1 = NArray[Double](1, 2, 3, 2, 1, 4)
38+
val unique = v1.unique
39+
assertEquals(unique.length, 4)
40+
assertEquals(unique(0), 1.0)
41+
assertEquals(unique(1), 2.0)
42+
assertEquals(unique(2), 3.0)
43+
assertEquals(unique(3), 4.0)
44+
45+
val v2 = NArray[Double](1, 1, 1, 1, 1)
46+
val unique2 = v2.unique
47+
assertEquals(unique2.length, 1)
48+
49+
val v3 = NArray[Double]()
50+
val unique3 = v3.unique
51+
assertEquals(unique3.length, 0)
52+
53+
val v4 = NArray[Double](1, 2, 3, 4, 5)
54+
val unique4 = v4.unique
55+
assertEquals(unique4.length, 5)
56+
57+
}
58+
3659
test("Array horizontal sum") {
3760
val v1 = NArray[Double](1.0, 2.0, 3.0)
3861
val v2 = v1 * 2.0

vecxtensions/src/groupedOps.scala

Whitespace-only changes.

0 commit comments

Comments
 (0)