From 66c107f0c3985e56e62fc8eadaa28ee6cba3badf Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 29 Jul 2015 18:03:41 +0300 Subject: [PATCH] no message --- SSignalKit.xcodeproj/project.pbxproj | 3 +++ SwiftSignalKit/Signal_Catch.swift | 30 ++++++++++++++++++++++++++++ SwiftSignalKit/Signal_Dispatch.swift | 15 ++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/SSignalKit.xcodeproj/project.pbxproj b/SSignalKit.xcodeproj/project.pbxproj index e314ebb740..1fd3e0de6e 100644 --- a/SSignalKit.xcodeproj/project.pbxproj +++ b/SSignalKit.xcodeproj/project.pbxproj @@ -731,6 +731,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; }; name = Release; }; @@ -791,6 +792,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; @@ -836,6 +838,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; diff --git a/SwiftSignalKit/Signal_Catch.swift b/SwiftSignalKit/Signal_Catch.swift index c59b40eab4..f84789e844 100644 --- a/SwiftSignalKit/Signal_Catch.swift +++ b/SwiftSignalKit/Signal_Catch.swift @@ -60,6 +60,36 @@ public func restart(signal: Signal) -> Signal { } } +public func recurse(latestValue: T?)(signal: Signal) -> Signal { + return Signal { subscriber in + let shouldRestart = Atomic(value: true) + let currentDisposable = MetaDisposable() + + let start = recursiveFunction { recurse in + let currentShouldRestart = shouldRestart.with { value in + return value + } + if currentShouldRestart { + let disposable = signal.start(next: { next in + subscriber.putNext(next) + }, error: { error in + subscriber.putError(error) + }, completed: { + recurse() + }) + currentDisposable.set(disposable) + } + } + + start() + + return ActionDisposable { + currentDisposable.dispose() + shouldRestart.swap(false) + } + } +} + public func retry(exponentialDecay: Double, onQueue queue: Queue)(signal: Signal) -> Signal { return Signal { subscriber in let shouldRetry = Atomic(value: true) diff --git a/SwiftSignalKit/Signal_Dispatch.swift b/SwiftSignalKit/Signal_Dispatch.swift index 7934e3eeab..f25cb7761d 100644 --- a/SwiftSignalKit/Signal_Dispatch.swift +++ b/SwiftSignalKit/Signal_Dispatch.swift @@ -75,3 +75,18 @@ public func runOn(threadPool: ThreadPool)(signal: Signal) -> Signal< return disposable } } + +public func bufferOn(queue: Queue, timeout: Double)(signal: Signal) -> Signal<[T], E> { + return Signal { subscriber in + let timer = Timer(timeout: timeout, `repeat`: false, completion: { + + }, queue: queue) + return signal.start(next: { next in + + }, error: { error in + subscriber.putError(error) + }, completed: { + + }) + } +}