Skip to content

Instantly share code, notes, and snippets.

@lizixroy
lizixroy / RxSwift-article-3.swift
Created September 4, 2016 19:46
RxSwift-article-3
@warn_unused_result(message="http://git.io/rxs.ud")
public func subscribeNext(onNext: (E) -> Void) -> Disposable {
let observer = AnonymousObserver<E> { e in
if case .Next(let value) = e {
onNext(value)
}
}
return self.subscribeSafe(observer)
}
@lizixroy
lizixroy / RxSwift-article-4.swift
Created September 4, 2016 19:47
RxSwift-article-4.swift
{ e in
if case .Next(let value) = e {
onNext(value)
}
}
@lizixroy
lizixroy / RxSwift-article-5.swift
Created September 4, 2016 19:48
RxSwift-article-5.swift
public enum Event<Element> {
/// Next element is produced.
case Next(Element)
/// Sequence terminated with an error.
case Error(ErrorType)
/// Sequence completed successfully.
case Completed
}
@lizixroy
lizixroy / RxSwift-article-6.swift
Created September 4, 2016 19:50
RxSwift-article-6.swift
class AnonymousObserver<ElementType> : ObserverBase<ElementType> {
typealias Element = ElementType
typealias EventHandler = Event<Element> -> Void
private let _eventHandler : EventHandler
init(_ eventHandler: EventHandler) {
#if TRACE_RESOURCES
AtomicIncrement(&resourceCount)
@lizixroy
lizixroy / RxSwift-article-7.swift
Created September 4, 2016 19:53
RxSwift-article-7.swift
@warn_unused_result(message="http://git.io/rxs.ud")
func subscribeSafe<O: ObserverType where O.E == E>(observer: O) -> Disposable {
return self.asObservable().subscribe(observer)
}
@lizixroy
lizixroy / RxSwift-article-8.swift
Created September 4, 2016 19:55
RxSwift-article-8.swift
public override func subscribe<O : ObserverType where O.E == Element>(observer: O) -> Disposable {
_lock.lock(); defer { _lock.unlock() }
return _synchronized_subscribe(observer)
}
func _synchronized_subscribe<O : ObserverType where O.E == E>(observer: O) -> Disposable {
if _disposed {
observer.on(.Error(RxError.Disposed(object: self)))
return NopDisposable.instance
}
@lizixroy
lizixroy / RxSwift-article-9.swift
Created September 4, 2016 19:57
RxSwift-article-9.swift
public mutating func insert(element: T) -> BagKey {
_nextKey = _nextKey &+ 1
#if DEBUG
_nextKey = _nextKey % 20
#endif
if _nextKey == 0 {
_uniqueIdentity = Identity()
}
@lizixroy
lizixroy / RxSwift-article-10.swift
Created September 4, 2016 20:00
RxSwift-article-10.swift
func on(event: Event<E>) {
switch event {
case .Next:
if _isStopped == 0 {
onCore(event)
}
case .Error, .Completed:
if !AtomicCompareAndSwap(0, 1, &_isStopped) {
return
@lizixroy
lizixroy / RxSwift-article-11.swift
Created September 4, 2016 20:02
RxSwift-article-11.swift
override func onCore(event: Event<Element>) {
return _eventHandler(event)
}
@lizixroy
lizixroy / RxSwift-article-12.swift
Created September 4, 2016 20:06
RxSwift-article-12.swift
struct SubscriptionDisposable<T: SynchronizedUnsubscribeType> : Disposable {
private let _key: T.DisposeKey
private weak var _owner: T?
init(owner: T, key: T.DisposeKey) {
_owner = owner
_key = key
}
func dispose() {