Tony Parker d942713680
Sink TimeZone, Locale, Calendar to Essentials (#266)
* Sink Locale, Calendar to Essentials

* Add a Calendar test, make sure that _lock is populated early for NSSwiftCalendar
2023-09-25 16:09:16 -07:00

56 lines
1.6 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2020 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
package struct FormatterCache<Format : Hashable & Sendable, FormattingType: Sendable>: Sendable {
let countLimit = 100
private let _lock: LockedState<[Format: FormattingType]>
package func formatter(for config: Format, creator: () -> FormattingType) -> FormattingType {
let existed = _lock.withLock { cache in
return cache [config]
}
if let existed {
return existed
}
// Call `creator()` outside of the cache's lock to avoid blocking
let df = creator()
_lock.withLockExtendingLifetimeOfState { cache in
if cache.count > countLimit {
cache.removeAll()
}
cache[config] = df
}
return df
}
package func removeAllObjects() {
_lock.withLockExtendingLifetimeOfState { cache in
cache.removeAll()
}
}
package subscript(key: Format) -> FormattingType? {
_lock.withLock {
$0[key]
}
}
package init() {
_lock = LockedState(initialState: [Format: FormattingType]())
}
}