Skip to content

Commit a3386ad

Browse files
authored
Merge pull request #37 from apple/sync
Add uniqueElements extension on Collection
2 parents 0b8cdd6 + b8b3463 commit a3386ad

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

Sources/TSCBasic/CollectionExtensions.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,20 @@ extension Collection {
2323
}
2424
}
2525
}
26+
27+
extension Collection where Element: Hashable {
28+
/// Returns a new list of element removing duplicate elements.
29+
///
30+
/// Note: The order of elements is preseved.
31+
/// Complexity: O(n)
32+
public func spm_uniqueElements() -> [Element] {
33+
var set = Set<Element>()
34+
var result = [Element]()
35+
for element in self {
36+
if set.insert(element).inserted {
37+
result.append(element)
38+
}
39+
}
40+
return result
41+
}
42+
}

Tests/TSCBasicTests/CollectionExtensionsTests.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,10 @@ class CollectionExtensionsTests: XCTestCase {
1717
XCTAssertEqual([42].spm_only, 42)
1818
XCTAssertEqual([42, 24].spm_only, nil)
1919
}
20+
21+
func testUniqueElements() {
22+
XCTAssertEqual([1, 2, 2, 4, 2, 1, 1, 4].spm_uniqueElements(), [1, 2, 4])
23+
XCTAssertEqual([1, 2, 2, 4, 2, 1, 1, 4, 9].spm_uniqueElements(), [1, 2, 4, 9])
24+
XCTAssertEqual([3, 2, 1].spm_uniqueElements(), [3, 2, 1])
25+
}
2026
}

Tests/TSCBasicTests/XCTestManifests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ extension CollectionExtensionsTests {
5959
// to regenerate.
6060
static let __allTests__CollectionExtensionsTests = [
6161
("testOnly", testOnly),
62+
("testUniqueElements", testUniqueElements),
6263
]
6364
}
6465

0 commit comments

Comments
 (0)