Created
July 28, 2021 11:00
-
-
Save geor-kasapidi/76c5625ea7a2333f3bd38ce1562a4883 to your computer and use it in GitHub Desktop.
registry
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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