Skip to content

Instantly share code, notes, and snippets.

@maximkrouk
Last active May 30, 2020 17:06
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 maximkrouk/3eddf17a66db1aa97b828a49a530f065 to your computer and use it in GitHub Desktop.
Save maximkrouk/3eddf17a66db1aa97b828a49a530f065 to your computer and use it in GitHub Desktop.
public typealias Result<Success> = Swift.Result<Success, Error>
public protocol Executable {
func execute()
}
extension Result {
public typealias AssociatedResolver = Resolver<Success, Failure>
public struct Resolver<Success, Failure: Error>: Executable {
public typealias SuccessAction = (Success) -> Void
public typealias FailureAction = (Failure) -> Void
private var successAction: SuccessAction?
private var failureAction: FailureAction?
private var wrappedResult: Swift.Result<Success, Failure>
public init(result: Swift.Result<Success, Failure>,
onSuccess successAction: SuccessAction? = .none,
onFailure failureAction: FailureAction? = .none) {
self.wrappedResult = result
self.successAction = successAction
self.failureAction = failureAction
}
public func onSuccess(execute action: SuccessAction? = .none) -> Self {
Resolver(result: wrappedResult, onSuccess: action, onFailure: failureAction)
}
public func onFailure(execute action: FailureAction? = .none) -> Self {
Resolver(result: wrappedResult, onSuccess: successAction, onFailure: action)
}
public func execute() {
switch wrappedResult {
case let .success(value):
successAction?(value)
case let .failure(error):
failureAction?(error)
}
}
}
public func resolve(_ successAction: AssociatedResolver.SuccessAction? = .none,
_ failureAction: AssociatedResolver.FailureAction? = .none) {
resolve(success: successAction, failure: failureAction)
}
public func resolve(success successAction: AssociatedResolver.SuccessAction? = .none,
failure failureAction: AssociatedResolver.FailureAction? = .none) {
resolver
.onSuccess(execute: successAction)
.onFailure(execute: failureAction)
.execute()
}
public func resolver(success successAction: AssociatedResolver.SuccessAction? = .none,
failure failureAction: AssociatedResolver.FailureAction? = .none) -> AssociatedResolver {
resolver
.onSuccess(execute: successAction)
.onFailure(execute: failureAction)
}
public var resolver: Resolver<Success, Failure> { .init(result: self) }
}
func test(result: Result<String>) {
result.resolve(success: {
print($0)
}, failure: {
print($0.localizedDescription)
})
}
@maximkrouk
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment