Skip to content

Commit 8accfeb

Browse files
committed
impement Result by myself.
1 parent 92e4495 commit 8accfeb

3 files changed

Lines changed: 124 additions & 1 deletion

File tree

SwiftFilePath.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
CC7833131A610299005E77C3 /* Entity.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC7833101A610299005E77C3 /* Entity.swift */; };
1515
CC7833141A610299005E77C3 /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC7833111A610299005E77C3 /* File.swift */; };
1616
CC78331C1A618186005E77C3 /* Either.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC78331A1A61816B005E77C3 /* Either.swift */; };
17+
CC78331E1A6186B7005E77C3 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC78331D1A6186B7005E77C3 /* Result.swift */; };
1718
/* End PBXBuildFile section */
1819

1920
/* Begin PBXContainerItemProxy section */
@@ -37,6 +38,7 @@
3738
CC7833101A610299005E77C3 /* Entity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Entity.swift; sourceTree = "<group>"; };
3839
CC7833111A610299005E77C3 /* File.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = File.swift; sourceTree = "<group>"; };
3940
CC78331A1A61816B005E77C3 /* Either.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Either.swift; sourceTree = "<group>"; };
41+
CC78331D1A6186B7005E77C3 /* Result.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = "<group>"; };
4042
/* End PBXFileReference section */
4143

4244
/* Begin PBXFrameworksBuildPhase section */
@@ -85,6 +87,7 @@
8587
CC7833111A610299005E77C3 /* File.swift */,
8688
CC7832F11A610124005E77C3 /* SwiftFilePath.h */,
8789
CC7832EF1A610124005E77C3 /* Supporting Files */,
90+
CC78331D1A6186B7005E77C3 /* Result.swift */,
8891
);
8992
path = SwiftFilePath;
9093
sourceTree = "<group>";
@@ -238,6 +241,7 @@
238241
buildActionMask = 2147483647;
239242
files = (
240243
CC78331C1A618186005E77C3 /* Either.swift in Sources */,
244+
CC78331E1A6186B7005E77C3 /* Result.swift in Sources */,
241245
CC7833141A610299005E77C3 /* File.swift in Sources */,
242246
CC7833121A610299005E77C3 /* Dir.swift in Sources */,
243247
CC7833131A610299005E77C3 /* Entity.swift in Sources */,

SwiftFilePath/Result.swift

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
//
2+
// Result.swift
3+
// SwiftFilePath
4+
//
5+
// Created by nori0620 on 2015/01/11.
6+
// Copyright (c) 2015年 Norihiro Sakamoto. All rights reserved.
7+
//
8+
9+
public enum Result<S,F> {
10+
11+
case Success(ResultContainer<S>)
12+
case Failure(ResultContainer<F>)
13+
14+
public init(success:S){
15+
self = .Success( ResultContainer(success) )
16+
}
17+
18+
public init(failure:F){
19+
self = .Failure( ResultContainer(failure) )
20+
}
21+
22+
public var isSuccess:Bool {
23+
switch self {
24+
case .Success: return true
25+
case .Failure: return false
26+
}
27+
28+
}
29+
30+
public var isFailure:Bool {
31+
switch self {
32+
case .Success: return false
33+
case .Failure: return true
34+
}
35+
}
36+
37+
public var value:S? {
38+
switch self {
39+
case .Success(let container):
40+
return container.content
41+
case .Failure(let container):
42+
return .None
43+
}
44+
}
45+
46+
public var error:F? {
47+
switch self {
48+
case .Success(let container):
49+
return .None
50+
case .Failure(let container):
51+
return container.content
52+
}
53+
}
54+
55+
public func onFailure(handler:(F) -> Void ) -> Result<S,F> {
56+
switch self {
57+
case .Success(let container):
58+
return self
59+
case .Failure(let container):
60+
handler( container.content )
61+
return self
62+
}
63+
}
64+
65+
public func onSuccess(handler:(S) -> Void ) -> Result<S,F> {
66+
switch self {
67+
case .Success(let container):
68+
handler( container.content )
69+
return self
70+
case .Failure(let container):
71+
return self
72+
}
73+
}
74+
75+
}
76+
77+
public class ResultContainer<T> {
78+
let content:T
79+
init(_ content:T){
80+
self.content = content
81+
}
82+
}

SwiftFilePathTests/SwiftFilePathTests.swift

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,44 @@ class SwiftFilePathTests: XCTestCase {
392392
XCTAssertFalse( srcFile.exists )
393393
XCTAssertTrue( destFile.exists )
394394

395+
}
396+
397+
// MARK:
398+
399+
func testSuccessResult() {
400+
var callOnFailure = false
401+
var callOnSuccess = false
402+
let result = Result<Int,String>(success:200)
403+
.onSuccess({ (value:Int) in
404+
callOnSuccess = true
405+
XCTAssertEqual(value,200)
406+
})
407+
.onFailure({ (error:String) in
408+
callOnFailure = true
409+
})
395410

396-
411+
XCTAssertTrue( result.isSuccess )
412+
XCTAssertEqual( result.value!, 200 )
413+
XCTAssertFalse( callOnFailure )
414+
XCTAssertTrue( callOnSuccess )
415+
}
416+
417+
func testFailureResult() {
418+
var callOnFailure = false
419+
var callOnSuccess = false
420+
let result = Result<Int,String>(failure:"NG!")
421+
.onSuccess({ (value:Int) in
422+
callOnSuccess = true
423+
})
424+
.onFailure({ (error:String) in
425+
callOnFailure = true
426+
XCTAssertEqual(error,"NG!")
427+
})
428+
429+
XCTAssertTrue( result.isFailure )
430+
XCTAssertEqual( result.error!, "NG!" )
431+
XCTAssertTrue( callOnFailure )
432+
XCTAssertFalse( callOnSuccess )
397433
}
434+
398435
}

0 commit comments

Comments
 (0)