Skip to content

Instantly share code, notes, and snippets.

@geor-kasapidi
Created July 28, 2021 11:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save geor-kasapidi/76c5625ea7a2333f3bd38ce1562a4883 to your computer and use it in GitHub Desktop.
Save geor-kasapidi/76c5625ea7a2333f3bd38ce1562a4883 to your computer and use it in GitHub Desktop.
registry
import STS
final class Registry {
// MARK: Internal
func register<T: AnyObject>(_ value: T) {
self.lock.execute {
let key = ObjectIdentifier(T.self)
assert(self.objects[key] == nil)
assert(self.factories[key] == nil)
self.objects[key] = value
}
}
func register<T: AnyObject>(_ value: @escaping () -> T) {
self.lock.execute {
let key = ObjectIdentifier(T.self)
assert(self.objects[key] == nil)
assert(self.factories[key] == nil)
self.factories[key] = value
}
}
func resolve<T: AnyObject>() -> T {
self.lock.execute {
let key = ObjectIdentifier(T.self)
if let object = self.objects[key] {
return object as! T
}
if let factory = self.factories[key] {
let object = factory()
self.objects[key] = object
self.factories[key] = nil
return object as! T
}
fatalError("object of type \(key) is not registered")
}
}
// MARK: Private
private let lock = UnfairLock()
private var objects: [ObjectIdentifier: AnyObject] = [:]
private var factories: [ObjectIdentifier: () -> AnyObject] = [:]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment