Skip to content

Instantly share code, notes, and snippets.

@killev
Created December 7, 2018 13:49
Show Gist options
  • Save killev/6ea48dc8fdfd661472d50af42e4f9df2 to your computer and use it in GitHub Desktop.
Save killev/6ea48dc8fdfd661472d50af42e4f9df2 to your computer and use it in GitHub Desktop.
Implementation of with function
//
// SignalStream+With1.swift
// CCRestIntegration
//
// Created by Peter Ovchinnikov on 9/7/18.
//
// swiftlint:disable large_tuple function_parameter_count
//line_length
import ReactiveKit
public class Value<T> {
var value: T? {
return nil
}
}
class WeakValue<T: AnyObject>: Value<T> {
weak var val: T?
init(_ value: T) {
self.val = value
}
override var value: T? {
return val
}
}
class StrongValue<T>: Value<T> {
let val: T
init(_ value: T) {
self.val = value
}
override var value: T? {
return val
}
}
class PropValue<U: PropertyProtocol>: Value<U.ProperyElement> {
let val: U
init(_ value: U) {
self.val = value
}
override var value: U.ProperyElement? {
return val.value
}
}
class LatestValue<T>: Value<T> {
var val: T?
let bag = DisposeBag()
init<U: SignalProtocol>(_ signal: U) where U.Element == T {
super.init()
signal.observeNext { [weak self] value in
self?.val = value
}.dispose(in: bag)
}
override var value: T? {
return val
}
}
public extension Value where T: AnyObject {
static func weak(_ value: T)->Value<T> {
return WeakValue<T>(value)
}
}
public extension Value {
static func strong(_ value: T)->Value<T> {
return StrongValue<T>(value)
}
static func latest<U: SignalProtocol>(_ signal: U)->Value<T> where U.Element == T {
return LatestValue<T>(signal)
}
static func prop<U: PropertyProtocol>(_ prop: U)->Value<U.ProperyElement> {
return PropValue(prop)
}
static func val<U: PropertyProtocol>(_ prop: U)->Value<U.ProperyElement> {
return PropValue(prop)
}
}
public extension SignalProtocol {
public func with<U>(_ value: Value<U>) -> Signal<(Element, U), Error> {
return Signal { observer in
return self.observe { event in
switch event {
case .next(let element):
if let val = value.value {
observer.next ( (element, val) )
}
case .failed(let error):
observer.failed(error)
case .completed:
observer.completed()
}
}
}
}
public func with<U1, U2>(_ value1: Value<U1>, _ value2: Value<U2>) -> Signal<(Element, U1, U2), Error> {
return Signal { observer in
return self.observe { event in
switch event {
case .next(let element):
if let val1 = value1.value, let val2 = value2.value {
observer.next ( (element, val1, val2) )
}
case .failed(let error):
observer.failed(error)
case .completed:
observer.completed()
}
}
}
}
public func with<U1, U2, U3>(_ value1: Value<U1>,
_ value2: Value<U2>,
_ value3: Value<U3>) -> Signal<(Element, U1, U2, U3), Error> {
return Signal { observer in
return self.observe { event in
switch event {
case .next(let element):
if let val1 = value1.value,
let val2 = value2.value,
let val3 = value3.value {
observer.next ( (element, val1, val2, val3) )
}
case .failed(let error):
observer.failed(error)
case .completed:
observer.completed()
}
}
}
}
public func with<U1, U2, U3, U4>(_ value1: Value<U1>,
_ value2: Value<U2>,
_ value3: Value<U3>,
_ value4: Value<U4>) -> Signal<(Element, U1, U2, U3, U4), Error> {
return Signal { observer in
return self.observe { event in
switch event {
case .next(let element):
if let val1 = value1.value,
let val2 = value2.value,
let val3 = value3.value,
let val4 = value4.value {
observer.next ( (element, val1, val2, val3, val4) )
}
case .failed(let error):
observer.failed(error)
case .completed:
observer.completed()
}
}
}
}
public func with1<U1, U2, U3, U4, U5>(_ value1: Value<U1>,
_ value2: Value<U2>,
_ value3: Value<U3>,
_ value4: Value<U4>,
_ value5: Value<U5>) -> Signal<(Element, U1, U2, U3, U4, U5), Error> {
return Signal { observer in
return self.observe { event in
switch event {
case .next(let element):
if let val1 = value1.value,
let val2 = value2.value,
let val3 = value3.value,
let val4 = value4.value,
let val5 = value5.value {
observer.next ( (element, val1, val2, val3, val4, val5) )
}
case .failed(let error):
observer.failed(error)
case .completed:
observer.completed()
}
}
}
}
}
public extension SignalProtocol where Element == Void {
public func with<U>(_ value: Value<U>) -> Signal<(U), Error> {
return Signal { observer in
return self.observe { event in
switch event {
case .next:
if let val = value.value {
observer.next ( (val) )
}
case .failed(let error):
observer.failed(error)
case .completed:
observer.completed()
}
}
}
}
public func with<U1, U2>(_ value1: Value<U1>, _ value2: Value<U2>) -> Signal<(U1, U2), Error> {
return Signal { observer in
return self.observe { event in
switch event {
case .next:
if let val1 = value1.value, let val2 = value2.value {
observer.next ( (val1, val2) )
}
case .failed(let error):
observer.failed(error)
case .completed:
observer.completed()
}
}
}
}
public func with1<U1, U2, U3>(_ value1: Value<U1>,
_ value2: Value<U2>,
_ value3: Value<U3>) -> Signal<(U1, U2, U3), Error> {
return Signal { observer in
return self.observe { event in
switch event {
case .next:
if let val1 = value1.value,
let val2 = value2.value,
let val3 = value3.value {
observer.next ( (val1, val2, val3) )
}
case .failed(let error):
observer.failed(error)
case .completed:
observer.completed()
}
}
}
}
public func with<U1, U2, U3, U4>(_ value1: Value<U1>,
_ value2: Value<U2>,
_ value3: Value<U3>,
_ value4: Value<U4>) -> Signal<(U1, U2, U3, U4), Error> {
return Signal { observer in
return self.observe { event in
switch event {
case .next:
if let val1 = value1.value,
let val2 = value2.value,
let val3 = value3.value,
let val4 = value4.value {
observer.next ( (val1, val2, val3, val4) )
}
case .failed(let error):
observer.failed(error)
case .completed:
observer.completed()
}
}
}
}
public func with<U1, U2, U3, U4, U5>(_ value1: Value<U1>,
_ value2: Value<U2>,
_ value3: Value<U3>,
_ value4: Value<U4>,
_ value5: Value<U5>) -> Signal<(U1, U2, U3, U4, U5), Error> {
return Signal { observer in
return self.observe { event in
switch event {
case .next:
if let val1 = value1.value,
let val2 = value2.value,
let val3 = value3.value,
let val4 = value4.value,
let val5 = value5.value {
observer.next ( (val1, val2, val3, val4, val5) )
}
case .failed(let error):
observer.failed(error)
case .completed:
observer.completed()
}
}
}
}
public func with1<U1, U2, U3, U4, U5, U6, U7>(_ value1: Value<U1>,
_ value2: Value<U2>,
_ value3: Value<U3>,
_ value4: Value<U4>,
_ value5: Value<U5>,
_ value6: Value<U6>,
_ value7: Value<U7>) -> Signal<(U1, U2, U3, U4, U5, U6, U7), Error> {
return Signal { observer in
return self.observe { event in
switch event {
case .next:
if let val1 = value1.value,
let val2 = value2.value,
let val3 = value3.value,
let val4 = value4.value,
let val5 = value5.value,
let val6 = value6.value,
let val7 = value7.value {
observer.next ( (val1, val2, val3, val4, val5, val6, val7) )
}
case .failed(let error):
observer.failed(error)
case .completed:
observer.completed()
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment