diff --git a/Sources/URLNavigator/Navigator.swift b/Sources/URLNavigator/Navigator.swift index fe6de9e..338caa9 100644 --- a/Sources/URLNavigator/Navigator.swift +++ b/Sources/URLNavigator/Navigator.swift @@ -10,7 +10,7 @@ open class Navigator: NavigatorType { open weak var delegate: NavigatorDelegate? private var viewControllerFactories = [URLPattern: ViewControllerFactory]() - private var handlerFactories = [URLPattern: URLOpenHandlerFactory]() + private var handlerFactories = OrderedDictionary() public init() { // ⛵ I'm a Navigator! diff --git a/Sources/URLNavigator/OrderedDictionary.swift b/Sources/URLNavigator/OrderedDictionary.swift new file mode 100644 index 0000000..1f6d340 --- /dev/null +++ b/Sources/URLNavigator/OrderedDictionary.swift @@ -0,0 +1,79 @@ +// +// OrderedDictionary.swift +// URLNavigator +// +// Created by Jerome Pasquier on 28/01/2019. +// + +import Foundation + +struct OrderedDictionary { + var keys = [Key]() + var values = [Key: Value]() + + var count: Int { + return self.keys.count + } + + subscript(index: Int) -> Value? { + get { + let key = self.keys[index] + return self.values[key] + } + set(newValue) { + let key = self.keys[index] + if newValue != nil { + self.values[key] = newValue + } else { + self.values.removeValue(forKey: key) + self.keys.remove(at: index) + } + } + } + + subscript(key: Key) -> Value? { + get { + return self.values[key] + } + set(newValue) { + if let newVal = newValue { + let oldValue = self.values.updateValue(newVal, forKey: key) + if oldValue == nil { + self.keys.append(key) + } + } else { + self.values.removeValue(forKey: key) + self.keys = self.keys.filter {$0 != key} + } + } + } + +} + +extension OrderedDictionary: CustomStringConvertible { + var description: String { + let isString = type(of: self.keys[0]) == String.self + var result = "[" + for key in keys { + result += isString ? "\"\(key)\"" : "\(key)" + result += ": \(self[key]!), " + } + result = String(result.dropLast(2)) + result += "]" + return result + } +} + +extension OrderedDictionary: Sequence { + func makeIterator() -> AnyIterator { + var counter = 0 + return AnyIterator { + guard counter