0001 // Trie.swift 0002 // 0003 // The MIT License (MIT) 0004 // 0005 // Copyright (c) 2016 Dan Appel 0006 // 0007 // Permission is hereby granted, free of charge, to any person obtaining a copy 0008 // of this software and associated documentation files (the "Software"), to deal 0009 // in the Software without restriction, including without limitation the rights 0010 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 0011 // copies of the Software, and to permit persons to whom the Software is 0012 // furnished to do so, subject to the following conditions: 0013 // 0014 // The above copyright notice and this permission notice shall be included in all 0015 // copies or substantial portions of the Software. 0016 // 0017 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 0018 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 0019 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 0020 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 0021 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 0022 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 0023 // SOFTWARE. 0024 0025 public struct Trie<Element
Trie.swift:29 var children: [Trie<Element, Payload>]Trie.swift:38 init(prefix: Element, payload: Payload?, ending: Bool, children: [Trie<Element, Payload>]) {Trie.swift:47 public func ==<Element, Payload where Element: Comparable>(lhs: Trie<Element, Payload>, rhs: Trie<Element, Payload>) -> Bool {Trie.swift:47 public func ==<Element, Payload where Element: Comparable>(lhs: Trie<Element, Payload>, rhs: Trie<Element, Payload>) -> Bool {Trie.swift:51 public func <<Element, Payload where Element: Comparable>(lhs: Trie<Element, Payload>, rhs: Trie<Element, Payload>) -> Bool {Trie.swift:51 public func <<Element, Payload where Element: Comparable>(lhs: Trie<Element, Payload>, rhs: Trie<Element, Payload>) -> Bool {Trie.swift:55 extension Trie: Comparable { }Trie.swift:57 extension Trie {Trie.swift:91 extension Trie {Trie.swift:117 var new = Trie<Element, Payload>(prefix: element, payload: nil, ending: false, children: [])Trie.swift:127 extension Trie {Trie.swift:128 func findLast<Sequence: SequenceType where Sequence.Generator.Element == Element>(sequence: Sequence) -> Trie<Element, Payload>? {Trie.swift:132 func findLast<Generator: GeneratorType where Generator.Element == Element>(generator: Generator) -> Trie<Element, Payload>? {Trie.swift:167 extension Trie {Trie.swift:176 extension Trie {Trie.swift:186 extension Trie where Payload: Equatable {TrieRouteMatcher.swift:28 private var componentsTrie = Trie<Character, Int>()TrieRouteMatcher.swift:29 private var routesTrie = Trie<Int, Route>(): Comparable, Payload
Trie.swift:26 let prefix: Element?Trie.swift:29 var children: [Trie<Element, Payload>]Trie.swift:38 init(prefix: Element, payload: Payload?, ending: Bool, children: [Trie<Element, Payload>]) {Trie.swift:38 init(prefix: Element, payload: Payload?, ending: Bool, children: [Trie<Element, Payload>]) {> { 0026 let prefix
Trie.swift:27 var payload: Payload?Trie.swift:29 var children: [Trie<Element, Payload>]Trie.swift:38 init(prefix: Element, payload: Payload?, ending: Bool, children: [Trie<Element, Payload>]) {Trie.swift:38 init(prefix: Element, payload: Payload?, ending: Bool, children: [Trie<Element, Payload>]) {: Element? 0027 var payload
Trie.swift:32 self.prefix = nilTrie.swift:39 self.prefix = prefixTrie.swift:48 return lhs.prefix == rhs.prefixTrie.swift:48 return lhs.prefix == rhs.prefixTrie.swift:52 return lhs.prefix < rhs.prefixTrie.swift:52 return lhs.prefix < rhs.prefixTrie.swift:66 if let k = self.prefix {Trie.swift:109 if child.prefix == element {Trie.swift:148 guard let current = child.prefix else { continue }Trie.swift:191 if let prefix = self.prefix {Trie.swift:199 if let prefix = self.prefix {: Payload? 0028 var ending
Trie.swift:33 self.payload = nilTrie.swift:40 self.payload = payloadTrie.swift:73 if let p = self.payload {Trie.swift:101 self.payload = self.payload ?? payloadTrie.swift:101 self.payload = self.payload ?? payloadTrie.swift:172 return findLast(generator)?.payloadTrie.swift:189 if self.payload == payload {: Bool 0029 var children
Trie.swift:34 self.ending = falseTrie.swift:41 self.ending = endingTrie.swift:102 self.ending = trueTrie.swift:137 guard ending == true else { return nil }: [Trie<Element, Payload>] 0030 0031 init() { 0032 self.prefix = nil 0033 self.payload = nil 0034 self.ending = false 0035 self.children = [] 0036 } 0037 0038 init(prefix: Element, payload: Payload?, ending: Bool, children: [Trie<Element, Payload>]) { 0039 self.prefix = prefix 0040 self.payload = payload 0041 self.ending = ending 0042 self.children = children 0043 self.children.sortInPlace() 0044 } 0045 } 0046 0047 public func ==<Element, Payload where Element: Comparable>(lhs: Trie<Element, Payload>, rhs: Trie<Element, Payload>) -> Bool { 0048 return lhs.prefix == rhs.prefix 0049 } 0050 0051 public func <<Element, Payload where Element: Comparable>(lhs: Trie<Element, Payload>, rhs: Trie<Element, Payload>) -> Bool { 0052 return lhs.prefix < rhs.prefix 0053 } 0054 0055 extension Trie: Comparable { } 0056 0057 extension Trie { 0058 0059 var description
Trie.swift:35 self.children = []Trie.swift:42 self.children = childrenTrie.swift:43 self.children.sortInPlace()Trie.swift:79 let children = self.childrenTrie.swift:107 for (index, child) in children.enumerate() {Trie.swift:111 self.children[index] = childTrie.swift:112 self.children.sortInPlace()Trie.swift:121 self.children.append(new)Trie.swift:123 self.children.sortInPlace()Trie.swift:143 var higher = children.count - 1Trie.swift:147 let child = children[middle]Trie.swift:197 for child in children {: String { 0060 return pretty(depth: 0) 0061 } 0062 0063 func pretty
TrieRouteMatcher.swift:221 return componentsTrie.description + "\n" + routesTrie.description(depth depth: Int) -> String { 0064 0065 let key: String 0066 if let k = self.prefix { 0067 key = "\(k)" 0068 } else { 0069 key = "head" 0070 } 0071 0072 let payload: String 0073 if let p = self.payload { 0074 payload = ":\(p)" 0075 } else { 0076 payload = "" 0077 } 0078 0079 let children = self.children 0080 .map { $0.pretty(depth: depth + 1) } 0081 .reduce("", combine: +) 0082 0083 let pretty = "- \(key)\(payload)" + "\n" + "\(children)" 0084 0085 let indentation = (0..<depth).reduce("", combine: {$0.0 + " "}) 0086 0087 return "\(indentation)\(pretty)" 0088 } 0089 } 0090 0091 extension Trie { 0092 mutating func insert<Sequence: SequenceType where Sequence.Generator.Element == Element>(sequence: Sequence, payload: Payload? = nil) { 0093 insert(sequence.generate(), payload: payload) 0094 } 0095 0096 mutating func insert
Trie.swift:60 return pretty(depth: 0)Trie.swift:80 .map { $0.pretty(depth: depth + 1) }<Generator: GeneratorType where Generator.Element == Element>(generator: Generator, payload: Payload? = nil) { 0097 0098 var generator = generator 0099 0100 guard let element = generator.next() else { 0101 self.payload = self.payload ?? payload 0102 self.ending = true 0103 0104 return 0105 } 0106 0107 for (index, child) in children.enumerate() { 0108 var child = child 0109 if child.prefix == element { 0110 child.insert(generator, payload: payload) 0111 self.children[index] = child 0112 self.children.sortInPlace() 0113 return 0114 } 0115 } 0116 0117 var new = Trie<Element, Payload>(prefix: element, payload: nil, ending: false, children: []) 0118 0119 new.insert(generator, payload: payload) 0120 0121 self.children.append(new) 0122 0123 self.children.sortInPlace() 0124 } 0125 } 0126 0127 extension Trie { 0128 func findLast<Sequence: SequenceType where Sequence.Generator.Element == Element>(sequence: Sequence) -> Trie<Element, Payload>? { 0129 return findLast(sequence.generate()) 0130 } 0131 0132 func findLast
Trie.swift:93 insert(sequence.generate(), payload: payload)Trie.swift:110 child.insert(generator, payload: payload)Trie.swift:119 new.insert(generator, payload: payload)<Generator: GeneratorType where Generator.Element == Element>(generator: Generator) -> Trie<Element, Payload>? { 0133 0134 var generator = generator 0135 0136 guard let target = generator.next() else { 0137 guard ending == true else { return nil } 0138 return self 0139 } 0140 0141 // binary search 0142 var lower = 0 0143 var higher = children.count - 1 0144 0145 while (lower <= higher) { 0146 let middle = (lower + higher) / 2 0147 let child = children[middle] 0148 guard let current = child.prefix else { continue } 0149 0150 if (current == target) { 0151 return child.findLast(generator) 0152 } 0153 0154 if (current < target) { 0155 lower = middle + 1 0156 } 0157 0158 if (current > target) { 0159 higher = middle - 1 0160 } 0161 } 0162 0163 return nil 0164 } 0165 } 0166 0167 extension Trie { 0168 func findPayload<Sequence: SequenceType where Sequence.Generator.Element == Element>(sequence: Sequence) -> Payload? { 0169 return findPayload(sequence.generate()) 0170 } 0171 func findPayload
Trie.swift:129 return findLast(sequence.generate())Trie.swift:151 return child.findLast(generator)Trie.swift:172 return findLast(generator)?.payloadTrie.swift:182 return findLast(generator) != nil<Generator: GeneratorType where Generator.Element == Element>(generator: Generator) -> Payload? { 0172 return findLast(generator)?.payload 0173 } 0174 } 0175 0176 extension Trie { 0177 func contains<Sequence: SequenceType where Sequence.Generator.Element == Element>(sequence: Sequence) -> Bool { 0178 return contains(sequence.generate()) 0179 } 0180 0181 func contains
Trie.swift:169 return findPayload(sequence.generate())<Generator: GeneratorType where Generator.Element == Element>(generator: Generator) -> Bool { 0182 return findLast(generator) != nil 0183 } 0184 } 0185 0186 extension Trie where Payload: Equatable { 0187 func findByPayload
Trie.swift:178 return contains(sequence.generate())(payload: Payload) -> [Element]? { 0188 0189 if self.payload == payload { 0190 // not sure what to do if it doesnt have a prefix 0191 if let prefix = self.prefix { 0192 return [prefix] 0193 } 0194 return [] 0195 } 0196 0197 for child in children { 0198 if let prefixes = child.findByPayload(payload) { 0199 if let prefix = self.prefix { 0200 return [prefix] + prefixes 0201 } 0202 return prefixes 0203 } 0204 } 0205 return nil 0206 } 0207 } 0208
Trie.swift:198 if let prefixes = child.findByPayload(payload) {