mirror of
				https://github.com/GayPizzaSpecifications/darwin-apk.git
				synced 2025-11-03 23:49:38 +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