[AltStoreCore] Adds Managed.perform() to match AsyncManaged

This commit is contained in:
Riley Testut
2023-05-11 14:45:09 -05:00
parent 499b44206e
commit 731d382af8

View File

@@ -32,41 +32,66 @@ public struct Managed<ManagedObject>
self.wrappedValue = wrappedValue self.wrappedValue = wrappedValue
self.managedObjectContext = self.managedObject?.managedObjectContext self.managedObjectContext = self.managedObject?.managedObjectContext
} }
}
public subscript<T>(dynamicMember keyPath: KeyPath<ManagedObject, T>) -> T
/// Run on managedObjectContext's queue.
public extension Managed
{
// Non-throwing
func perform<T>(_ closure: @escaping (ManagedObject) -> T) -> T
{ {
var result: T! var result: T!
if let context = self.managedObjectContext if let context = self.managedObjectContext
{ {
context.performAndWait { context.performAndWait {
result = self.wrappedValue[keyPath: keyPath] result = closure(self.wrappedValue)
} }
} }
else else
{ {
result = self.wrappedValue[keyPath: keyPath] result = closure(self.wrappedValue)
} }
return result return result
} }
// Optionals // Throwing
public subscript<Wrapped, T>(dynamicMember keyPath: KeyPath<Wrapped, T>) -> T? where ManagedObject == Optional<Wrapped> func perform<T>(_ closure: @escaping (ManagedObject) throws -> T) throws -> T
{ {
var result: T? var result: Result<T, Error>!
if let context = self.managedObjectContext if let context = self.managedObjectContext
{ {
context.performAndWait { context.performAndWait {
result = self.wrappedValue?[keyPath: keyPath] as? T result = Result { try closure(self.wrappedValue) }
} }
} }
else else
{ {
result = self.wrappedValue?[keyPath: keyPath] as? T result = Result { try closure(self.wrappedValue) }
} }
let value = try result.get()
return value
}
}
/// @dynamicMemberLookup
public extension Managed
{
subscript<T>(dynamicMember keyPath: KeyPath<ManagedObject, T>) -> T
{
let result = self.perform { $0[keyPath: keyPath] }
return result
}
// Optionals
subscript<Wrapped, T>(dynamicMember keyPath: KeyPath<Wrapped, T>) -> T? where ManagedObject == Optional<Wrapped>
{
guard let wrappedValue else { return nil }
let result = self.perform { _ in wrappedValue[keyPath: keyPath] }
return result return result
} }
} }