Skip to content

Instantly share code, notes, and snippets.

@danielctull
Created April 19, 2020 09:10
Show Gist options
  • Save danielctull/424a3b11d93855e5fb5132c30a95473b to your computer and use it in GitHub Desktop.
Save danielctull/424a3b11d93855e5fb5132c30a95473b to your computer and use it in GitHub Desktop.
A multimap implementation.
struct Multimap<Key: Hashable, Value: Hashable> {
fileprivate struct _Element: Hashable {
let key: Key
let value: Value
}
private var elements: Set<_Element> = []
mutating func add(_ value: Value, for key: Key) {
let element = _Element(key: key, value: value)
elements.insert(element)
}
}
extension Multimap: Sequence {
func makeIterator() -> Iterator {
Iterator(iterator: elements.makeIterator())
}
struct Iterator: IteratorProtocol {
fileprivate var iterator: Set<_Element>.Iterator
mutating func next() -> (key: Key, value: Value)? {
guard let element = iterator.next() else { return nil }
return (key: element.key, value: element.value)
}
}
}
var multimap = Multimap<Int, String>()
multimap.add("Daniel", for: 0)
multimap.add("Mike", for: 0)
multimap.add("Foo", for: 2)
multimap.add("Mike", for: 0)
print(Array(multimap))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment