mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
53 lines
1.7 KiB
Swift
53 lines
1.7 KiB
Swift
// RUN: not %target-swift-frontend %s -emit-ir
|
|
|
|
public struct Trie<Key: Hashable, Value> {
|
|
|
|
internal var root: TrieNode<Key, Value>
|
|
|
|
public init() {
|
|
self.root = TrieNode<Key, Value>()
|
|
}
|
|
|
|
public mutating func removeValue<C: Collection>(forCollection collection: C) -> Value? where C.Iterator.Element == Key {
|
|
return self.root.removeValue(forIterator: collection.makeIterator())
|
|
}
|
|
|
|
public mutating func updateValue<C: Collection>(_ value: Value, forCollection collection: C) -> Value? where C.Iterator.Element == Key {
|
|
return self.root.updateValue(value, forIterator: collection.makeIterator())
|
|
}
|
|
|
|
public func value<C: Collection>(forCollection collection: C) -> Value? where C.Iterator.Element == Key {
|
|
return self.root.value(forIterator: collection.makeIterator())
|
|
}
|
|
}
|
|
|
|
internal struct TrieNode<Key: Hashable, Value> {
|
|
|
|
internal let children: Dictionary<Key, TrieNode<Key, Value>>
|
|
|
|
internal let value: Value?
|
|
|
|
internal init(value: Value?=nil) {
|
|
self.children = Dictionary<Key, TrieNode<Key, Value>>()
|
|
self.value = value
|
|
}
|
|
|
|
internal mutating func removeValue<I: IteratorProtocol>(forIterator iterator: inout I) -> Value? where I.Element == Key {
|
|
return nil
|
|
}
|
|
|
|
internal mutating func updateValue<I: IteratorProtocol>(_ value: Value, forIterator iterator: inout I) -> Value? where I.Element == Key {
|
|
return nil
|
|
}
|
|
|
|
internal func value<I: IteratorProtocol>(forIterator iterator: inout I) -> Value? where I.Element == Key {
|
|
guard let key = iterator.next() else {
|
|
return value
|
|
}
|
|
|
|
return self.children[key]?.value(forIterator: iterator)
|
|
}
|
|
}
|
|
|
|
|