Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Feb 2, 2025. It is now read-only.

Commitbb23886

Browse files
author
Alex Belozierov
committed
- refactored CoFuture
1 parenta3025da commitbb23886

File tree

3 files changed

+24
-36
lines changed

3 files changed

+24
-36
lines changed

‎Sources/SwiftCoroutine/CoFuture/Core/CoFuture.swift‎

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,14 @@ private protocol _CoFutureCancellable: class {
8181
///
8282
publicclassCoFuture<Value>{
8383

84+
@usableFromInlineinternaltypealias_Result=Result<Value,Error>
85+
8486
privatevarresultState:Int
85-
privatevarnodes:CallbackStack<Result<Value,Error>>
86-
privatevar_result:Optional<Result<Value,Error>>
87-
privatevarparent:UnownedCancellable?
87+
privatevarnodes:CallbackStack<_Result>
88+
privatevar_result:Optional<_Result>
89+
privateunowned(unsafe)varparent:_CoFutureCancellable?
8890

89-
@usableFromInlineinternalinit(_result:Result<Value,Error>?){
91+
@usableFromInlineinternalinit(_result:_Result?){
9092
iflet result= _result{
9193
self._result= result
9294
resultState=1
@@ -99,14 +101,18 @@ public class CoFuture<Value> {
99101
}
100102

101103
deinit{
102-
if !nodes.isEmpty{
103-
nodes.finish(with:.failure(CoFutureError.canceled))
104-
}
104+
if nodes.isEmpty{return}
105+
nodes.finish(with:.failure(CoFutureError.canceled))
105106
}
106107

107108
}
108109

109110
extensionCoFuture:_CoFutureCancellable{
111+
112+
internalconvenienceinit<T>(parent:CoFuture<T>){
113+
self.init(_result:nil)
114+
self.parent= parent
115+
}
110116

111117
/// Starts a new coroutine and initializes future with its result.
112118
///
@@ -121,8 +127,9 @@ extension CoFuture: _CoFutureCancellable {
121127
@inlinablepublicconvenienceinit(task:@escaping()throws->Value){
122128
self.init(_result:nil)
123129
Coroutine.start{
124-
letcurrent=try?Coroutine.current()
125-
self.whenCanceled{ current?.cancel()}
130+
iflet current=try?Coroutine.current(){
131+
self.whenCanceled(current.cancel)
132+
}
126133
self.setResult(Result(catching: task))
127134
}
128135
}
@@ -140,31 +147,20 @@ extension CoFuture: _CoFutureCancellable {
140147
nodes.isClosed? _result:nil
141148
}
142149

143-
@usableFromInlineinternalfunc setResult(_ result:Result<Value,Error>){
144-
guardatomicExchange(&resultState, with:1)==0else{return}
150+
@usableFromInlineinternalfunc setResult(_ result:_Result){
151+
ifatomicExchange(&resultState, with:1)==1{return}
145152
_result= result
146153
parent=nil
147154
nodes.close()?.finish(with: result)
148155
}
149156

150157
// MARK: - Callback
151158

152-
@usableFromInlineinternaltypealiasCallback=(Result<Value,Error>)->Void
153-
154-
@usableFromInlineinternalfunc addCallback(_ callback:@escapingCallback){
159+
@usableFromInlineinternalfunc addCallback(_ callback:@escaping(_Result)->Void){
155160
if !nodes.append(callback){ _result.map(callback)}
156161
}
157162

158-
internalfunc addChild<T>(future:CoFuture<T>, callback:@escapingCallback){
159-
future.parent=.init(cancellable:self)
160-
addCallback(callback)
161-
}
162-
163163
// MARK: - cancel
164-
165-
privatestructUnownedCancellable{
166-
unowned(unsafe)letcancellable:_CoFutureCancellable
167-
}
168164

169165
/// Returns `true` when the current future is canceled.
170166
@inlinablepublicvarisCanceled:Bool{
@@ -176,11 +172,7 @@ extension CoFuture: _CoFutureCancellable {
176172

177173
/// Cancels the current future.
178174
publicfunc cancel(){
179-
iflet parent= parent{
180-
parent.cancellable.cancel()
181-
}else{
182-
setResult(.failure(CoFutureError.canceled))
183-
}
175+
parent?.cancel()??setResult(.failure(CoFutureError.canceled))
184176
}
185177

186178
}

‎Sources/SwiftCoroutine/CoFuture/Operators/CoFuture2+map.swift‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,8 @@ extension CoFuture {
3737
iflet result= result{
3838
returnCoFuture<NewValue>(result:transform(result))
3939
}
40-
letpromise=CoPromise<NewValue>()
41-
addChild(future: promise){ resultin
42-
promise.setResult(transform(result))
43-
}
40+
letpromise=CoPromise<NewValue>(parent:self)
41+
addCallback{ promise.setResult(transform($0))}
4442
return promise
4543
}
4644

‎Sources/SwiftCoroutine/CoFuture/Operators/CoFuture3+flatMap.swift‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,8 @@ extension CoFuture {
5050
iflet result= result{
5151
returncallback(result)
5252
}
53-
letpromise=CoPromise<NewValue>()
54-
addChild(future: promise){ resultin
55-
callback(result).addCallback(promise.setResult)
56-
}
53+
letpromise=CoPromise<NewValue>(parent:self)
54+
addCallback{callback($0).addCallback(promise.setResult)}
5755
return promise
5856
}
5957

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp