Files
SwiftLint/Source/SwiftLintFramework/Extensions/NSRegularExpression+SwiftLint.swift
T
2018-05-30 14:00:17 +10:00

34 lines
1.0 KiB
Swift

import Foundation
private var regexCache = [RegexCacheKey: NSRegularExpression]()
private let regexCacheLock = NSLock()
private struct RegexCacheKey: Hashable {
let pattern: String
let options: NSRegularExpression.Options
var hashValue: Int {
return pattern.hashValue ^ options.rawValue.hashValue
}
static func == (lhs: RegexCacheKey, rhs: RegexCacheKey) -> Bool {
return lhs.options == rhs.options && lhs.pattern == rhs.pattern
}
}
extension NSRegularExpression {
internal static func cached(pattern: String, options: Options? = nil) throws -> NSRegularExpression {
let options = options ?? [.anchorsMatchLines, .dotMatchesLineSeparators]
let key = RegexCacheKey(pattern: pattern, options: options)
regexCacheLock.lock()
defer { regexCacheLock.unlock() }
if let result = regexCache[key] {
return result
}
let result = try NSRegularExpression(pattern: pattern, options: options)
regexCache[key] = result
return result
}
}