From 6cc475c603ed4736789f6e46ee0c2c6299373436 Mon Sep 17 00:00:00 2001 From: Sam Warner Date: Sun, 29 Nov 2015 18:23:12 +1100 Subject: [PATCH] adding mapping over Results containing collections --- Result/ResultType.swift | 21 +++++++++++++++++++++ ResultTests/ResultTests.swift | 12 ++++++++++++ 2 files changed, 33 insertions(+) diff --git a/Result/ResultType.swift b/Result/ResultType.swift index f445a32..8db2359 100644 --- a/Result/ResultType.swift +++ b/Result/ResultType.swift @@ -64,6 +64,27 @@ public extension ResultType { } } +public extension ResultType where Value: CollectionType { + /// Returns a new Result by mapping each of `Success`es’ values using `transform`, or re-wrapping `Failure`s’ errors. + public func map(@noescape transform: Value.Generator.Element -> U) -> Result<[U], Error> { + return flatMap { .Success(transform($0)) } + } + + /// Returns the result of applying `transform` to each of `Success`es’ values, or re-wrapping `Failure`’s errors. + public func flatMap(@noescape transform: (Value.Generator.Element) -> Result) -> Result<[U], Error> { + return analysis( + ifSuccess: { + $0.map(transform).reduce(.Success([])) { (acc, result) in + guard let successes = acc.value, success = result.value else { + return acc + } + return .Success(successes + [success]) + } + }, + ifFailure: Result<[U], Error>.Failure) + } +} + // MARK: - Operators infix operator &&& { diff --git a/ResultTests/ResultTests.swift b/ResultTests/ResultTests.swift index 2f574ed..bf032de 100644 --- a/ResultTests/ResultTests.swift +++ b/ResultTests/ResultTests.swift @@ -16,6 +16,16 @@ final class ResultTests: XCTestCase { func testInitOptionalFailure() { XCTAssert(Result(nil, failWith: error) == failure) } + + // MARK: Collections + + func testCollectionMapTransformsSuccesses() { + XCTAssertEqual(successCollection.map { $0.characters.count } ?? [], [7, 14]) + } + + func testCollectionMapRewrapsFailures() { + XCTAssertEqual(failureCollection.map { $0.characters.count } ?? [], []) + } // MARK: Errors @@ -114,10 +124,12 @@ final class ResultTests: XCTestCase { // MARK: - Fixtures let success = Result.Success("success") +let successCollection = Result<[String], NSError>.Success(["success", "anotherSuccess"]) let error = NSError(domain: "com.antitypical.Result", code: 1, userInfo: nil) let error2 = NSError(domain: "com.antitypical.Result", code: 2, userInfo: nil) let failure = Result.Failure(error) let failure2 = Result.Failure(error2) +let failureCollection = Result<[String], NSError>.Failure(error) // MARK: - Helpers