mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 06:35:51 +00:00
Add 'submodules/SSignalKit/' from commit '359b2ee7c9f20f99f221f78e307369ef5ad0ece2'
git-subtree-dir: submodules/SSignalKit git-subtree-mainline:4459dc5b47git-subtree-split:359b2ee7c9
This commit is contained in:
46
submodules/SSignalKit/SwiftSignalKit/Signal_Loop.swift
Normal file
46
submodules/SSignalKit/SwiftSignalKit/Signal_Loop.swift
Normal file
@@ -0,0 +1,46 @@
|
||||
import Foundation
|
||||
|
||||
public enum SignalFeedbackLoopState<T> {
|
||||
case initial
|
||||
case loop(T)
|
||||
}
|
||||
|
||||
public func feedbackLoop<R1, R, E>(once: @escaping (SignalFeedbackLoopState<R1>) -> Signal<R1, E>?, reduce: @escaping (R1, R1) -> R1) -> Signal<R, E> {
|
||||
return Signal { subscriber in
|
||||
let currentDisposable = MetaDisposable()
|
||||
|
||||
let state = Atomic<R1?>(value: nil)
|
||||
|
||||
var loopAgain: (() -> Void)?
|
||||
|
||||
let loopOnce: (MetaDisposable?) -> Void = { disposable in
|
||||
if let signal = once(.initial) {
|
||||
disposable?.set(signal.start(next: { next in
|
||||
let _ = state.modify { value in
|
||||
if let value = value {
|
||||
return reduce(value, next)
|
||||
} else {
|
||||
return value
|
||||
}
|
||||
}
|
||||
}, error: { error in
|
||||
subscriber.putError(error)
|
||||
}, completed: {
|
||||
loopAgain?()
|
||||
}))
|
||||
} else {
|
||||
subscriber.putCompletion()
|
||||
}
|
||||
}
|
||||
|
||||
loopAgain = { [weak currentDisposable] in
|
||||
loopOnce(currentDisposable)
|
||||
}
|
||||
|
||||
loopOnce(currentDisposable)
|
||||
|
||||
return ActionDisposable {
|
||||
currentDisposable.dispose()
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user