From 29d39fe1cffc876565ef1c5a98223b618653b8a3 Mon Sep 17 00:00:00 2001 From: Aleksei Kolchanov Date: Mon, 19 Sep 2016 15:46:31 +0300 Subject: [PATCH 1/2] added func element(equalTo element:Element) -> Element? --- Sources/OrderedSet+Set.swift | 8 ++++++++ Tests/OrderedSetTests.swift | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/Sources/OrderedSet+Set.swift b/Sources/OrderedSet+Set.swift index ecee591..47fe137 100644 --- a/Sources/OrderedSet+Set.swift +++ b/Sources/OrderedSet+Set.swift @@ -20,6 +20,14 @@ extension OrderedSet { return set.contains(member) } + /// Returns Element equal to input one + public func element(equalTo element:Element) -> Element? { + if let indexOfElement = set.indexOf(element) { + return set[indexOfElement] + } + return nil + } + /// Remove the member from the ordered set and return it if it was present. public mutating func remove(member: Element) -> Element? { guard let index = array.indexOf(member) else { return nil } diff --git a/Tests/OrderedSetTests.swift b/Tests/OrderedSetTests.swift index fe50096..1a42c43 100644 --- a/Tests/OrderedSetTests.swift +++ b/Tests/OrderedSetTests.swift @@ -37,6 +37,12 @@ class OrderedSetTests: XCTestCase { XCTAssert(orderedSet == ["Brad", "Lorraine", "Natalie", "Sarah", "Scott"]) } + func testElementEqualTo() { + let orderedSet: OrderedSet = ["Brad", "Lorraine", "Brad", "Sarah"] + XCTAssertNotNil(orderedSet.element(equalTo: "Lorraine")) + XCTAssertNil(orderedSet.element(equalTo: "Aleksei")) + } + } func ==(lhs: OrderedSet, rhs: Array) -> Bool { From 89a7a2772e98c1e853822e0e221b512ad306e582 Mon Sep 17 00:00:00 2001 From: Aleksei Kolchanov Date: Wed, 28 Sep 2016 11:18:20 +0300 Subject: [PATCH 2/2] keeping of internal array order on replaceRange function execution --- Sources/OrderedSet+Array.swift | 6 ++++-- Tests/OrderedSetTests.swift | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Sources/OrderedSet+Array.swift b/Sources/OrderedSet+Array.swift index 244cb59..b03fa31 100644 --- a/Sources/OrderedSet+Array.swift +++ b/Sources/OrderedSet+Array.swift @@ -28,12 +28,14 @@ extension OrderedSet : ArrayLiteralConvertible, RangeReplaceableCollectionType { public mutating func replaceRange.Element>(subRange: Range, with newElements: C) { let oldArray = array[subRange] let oldSet = Set(oldArray) - let (newArray, newSet) = collapse(newElements) + var (newArray, newSet) = collapse(newElements) let deletions = oldSet.subtract(newSet) set.subtractInPlace(deletions) + newArray = newArray.filter { (element) -> Bool in + return !set.contains(element) + } set.unionInPlace(newSet) array.replaceRange(subRange, with: newArray) - array = array.enumerate().filter { (index, element) in return subRange.contains(index) || subRange.startIndex == index || !newSet.contains(element) }.map { $0.element } } public var capacity: Int { diff --git a/Tests/OrderedSetTests.swift b/Tests/OrderedSetTests.swift index 1a42c43..d0137f5 100644 --- a/Tests/OrderedSetTests.swift +++ b/Tests/OrderedSetTests.swift @@ -43,6 +43,18 @@ class OrderedSetTests: XCTestCase { XCTAssertNil(orderedSet.element(equalTo: "Aleksei")) } + func testOrderPreservance() { + var orderedSet1: OrderedSet = [3,2,1] + let orderedSet2: OrderedSet = [3,5,1] + + orderedSet1.unionInPlace(orderedSet2) + + print("orderedSet1.array: ", orderedSet1.array) + + XCTAssert(orderedSet1.array == [3,2,1,5]) + + + } } func ==(lhs: OrderedSet, rhs: Array) -> Bool {