mirror of
https://github.com/GayPizzaSpecifications/darwin-apk.git
synced 2025-08-03 13:31:32 +00:00
Lazy provider cache for enormous speed improvement
This commit is contained in:
@ -8,6 +8,12 @@ import Foundation
|
|||||||
public struct ApkIndex: Sendable {
|
public struct ApkIndex: Sendable {
|
||||||
public let packages: [ApkIndexPackage]
|
public let packages: [ApkIndexPackage]
|
||||||
public typealias Index = Array<ApkIndexPackage>.Index
|
public typealias Index = Array<ApkIndexPackage>.Index
|
||||||
|
|
||||||
|
lazy var providers: [(ApkIndexProvides, Index)] = {
|
||||||
|
self.packages.enumerated().flatMap { index, pkg in
|
||||||
|
[ (.specific(name: pkg.name, version: pkg.version), index) ] + pkg.provides.map { ($0, index) }
|
||||||
|
}
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension ApkIndex {
|
public extension ApkIndex {
|
||||||
@ -23,18 +29,14 @@ public extension ApkIndex {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func resolve(requirement: ApkVersionRequirement) -> ApkIndexPackage? {
|
mutating func resolve(requirement: ApkVersionRequirement) -> ApkIndexPackage? {
|
||||||
self.packages.filter { pkg in
|
self.providers.filter { prv in prv.0.satisfies(requirement) }
|
||||||
(pkg.name == requirement.name && requirement.versionSpec.satisfied(by: pkg.version))
|
.map { self.packages[$1] }.max()
|
||||||
|| pkg.provides.contains(where: { $0.satisfies(requirement) })
|
|
||||||
}.max()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func resolveIndex(requirement: ApkVersionRequirement) -> Index? {
|
mutating func resolveIndex(requirement: ApkVersionRequirement) -> Index? {
|
||||||
self.packages.enumerated().lazy.filter { index, pkg in
|
self.providers.filter { prv in prv.0.satisfies(requirement) }
|
||||||
return (pkg.name == requirement.name && requirement.versionSpec.satisfied(by: pkg.version))
|
.max { self.packages[$0.1] < self.packages[$1.1] }?.1
|
||||||
|| pkg.provides.contains(where: { $0.satisfies(requirement) })
|
|
||||||
}.max { $0.element < $1.element }?.offset
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user