From a25856a9196939a839c395a609a16742ce7cb6ed Mon Sep 17 00:00:00 2001 From: Declan <5962877+dec1@users.noreply.github.com> Date: Thu, 15 Jul 2021 20:17:01 +0200 Subject: [PATCH 1/4] extend OrderedSet with convenience methods ensure_at_front/end, useful eg in implementing a list of "recent documents" --- Ordered Set/OrderedSet.swift | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Ordered Set/OrderedSet.swift b/Ordered Set/OrderedSet.swift index 8b6df7d3e..275d9278f 100644 --- a/Ordered Set/OrderedSet.swift +++ b/Ordered Set/OrderedSet.swift @@ -73,5 +73,38 @@ public class OrderedSet { public func all() -> [T] { return objects } + + // convenience checker - minimize need for client's knowledge of internals + public func contains(_ object: T) ->Bool { + return indexOfKey[object] != nil + } + + // O(1) + // append object (removing any existing other occurence) + public func ensure_at_end(_ object: T) { + if contains(object) { + remove(object) + } + add(object) + } + + // O(n) + // prepend object (removing any existing other occurence) + public func ensure_at_front(_ object: T) { + if contains(object) { + remove(object) // could make this more efficient (at the expense of maintenance complexity) by not delegating to remove() and insert() + // but instead doing manually, and running for loop just once at end + } + insert(object, at:0) + + } + + func debug_str() -> String // useful for printing/debugging + { + var str = "OrderedSet: \n" + str += objects.map{"\($0)"}.joined(separator: ",") + + return str + } } From de96a060c664b92cb7780bfdddfbedc552c707d2 Mon Sep 17 00:00:00 2001 From: Declan <5962877+dec1@users.noreply.github.com> Date: Thu, 15 Jul 2021 20:26:16 +0200 Subject: [PATCH 2/4] fix typo --- Ordered Set/OrderedSet.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ordered Set/OrderedSet.swift b/Ordered Set/OrderedSet.swift index 275d9278f..65483f8a2 100644 --- a/Ordered Set/OrderedSet.swift +++ b/Ordered Set/OrderedSet.swift @@ -80,7 +80,7 @@ public class OrderedSet { } // O(1) - // append object (removing any existing other occurence) + // append object (removing any existing other occurrence) public func ensure_at_end(_ object: T) { if contains(object) { remove(object) @@ -89,7 +89,7 @@ public class OrderedSet { } // O(n) - // prepend object (removing any existing other occurence) + // prepend object (removing any existing other occurrence) public func ensure_at_front(_ object: T) { if contains(object) { remove(object) // could make this more efficient (at the expense of maintenance complexity) by not delegating to remove() and insert() From 6cdbfedf03596408203c23bb375ac726deb2d504 Mon Sep 17 00:00:00 2001 From: Declan <5962877+dec1@users.noreply.github.com> Date: Thu, 15 Jul 2021 20:28:38 +0200 Subject: [PATCH 3/4] maintain consistent formatting --- Ordered Set/OrderedSet.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Ordered Set/OrderedSet.swift b/Ordered Set/OrderedSet.swift index 65483f8a2..69fb56efd 100644 --- a/Ordered Set/OrderedSet.swift +++ b/Ordered Set/OrderedSet.swift @@ -96,14 +96,12 @@ public class OrderedSet { // but instead doing manually, and running for loop just once at end } insert(object, at:0) - } - func debug_str() -> String // useful for printing/debugging - { + // string representation, useful for printing/debugging + public func debug_str() -> String { var str = "OrderedSet: \n" str += objects.map{"\($0)"}.joined(separator: ",") - return str } } From aae2e071b0d0e6c87939502eede528e663532ffa Mon Sep 17 00:00:00 2001 From: Declan <5962877+dec1@users.noreply.github.com> Date: Fri, 16 Jul 2021 08:58:36 +0200 Subject: [PATCH 4/4] bugfix: inserting at index 0 in empty container fails --- Ordered Set/OrderedSet.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ordered Set/OrderedSet.swift b/Ordered Set/OrderedSet.swift index 69fb56efd..850050098 100644 --- a/Ordered Set/OrderedSet.swift +++ b/Ordered Set/OrderedSet.swift @@ -16,7 +16,7 @@ public class OrderedSet { // O(n) public func insert(_ object: T, at index: Int) { - assert(index < objects.count, "Index should be smaller than object count") + assert(index <= objects.count, "Index should be smaller than object count") assert(index >= 0, "Index should be bigger than 0") guard indexOfKey[object] == nil else {