import Foundation public struct SimpleDictionary: Sequence { private var items: [(K, V)] = [] public var count: Int { return self.items.count } public var isEmpty: Bool { return self.items.isEmpty } public init() { } public init(_ dict: [K: V]) { for (k, v) in dict { self.items.append((k, v)) } } private init(items: [(K, V)] = []) { self.items = items } public func filteredOut(keysIn: Set) -> SimpleDictionary? { var hasUpdates = false for (key, _) in self.items { if keysIn.contains(key) { hasUpdates = true break } } if hasUpdates { var updatedItems: [(K, V)] = [] for (key, value) in self.items { if !keysIn.contains(key) { updatedItems.append((key, value)) break } } return SimpleDictionary(items: updatedItems) } else { return nil } } public subscript(key: K) -> V? { get { for (k, value) in self.items { if k == key { return value } } return nil } set(value) { var index = 0 for (k, _) in self.items { if k == key { if let value = value { self.items[index] = (k, value) } else { self.items.remove(at: index) } return } index += 1 } if let value = value { self.items.append((key, value)) } } } public func makeIterator() -> AnyIterator<(K, V)> { var index = 0 return AnyIterator { () -> (K, V)? in if index < self.items.count { let currentIndex = index index += 1 return self.items[currentIndex] } return nil } } public func isEqual(other: SimpleDictionary, with f: (V, V) -> Bool) -> Bool { if self.items.count != other.items.count { return false } for i in 0 ..< self.items.count { if self.items[i].0 != other.items[i].0 { return false } if !f(self.items[i].1, other.items[i].1) { return false } } return true } }