├── README
├── 1.png
├── 2.png
├── 3.png
├── 4.png
├── 5.png
└── 6.png
├── smck
├── Parser
│ ├── JSParser.swift
│ ├── CSSAST.swift
│ ├── H5AST.swift
│ ├── analyzeExtension.swift
│ ├── ParsingSecondRoundOneFile.swift
│ ├── ParsingImplementation.swift
│ ├── CSSSb.swift
│ ├── ParsingProtocol.swift
│ ├── H5Sb.swift
│ ├── ParsingObject.swift
│ ├── ParsingMacro.swift
│ ├── JSSb.swift
│ ├── ParsingProperty.swift
│ ├── ParsingImport.swift
│ ├── JSLexer.swift
│ ├── SMLangAST.swift
│ ├── CSSLexer.swift
│ ├── ParsingInterface.swift
│ ├── CSSParser.swift
│ └── ParsingMethod.swift
├── Plugin
│ ├── H5ToNativePlugin.swift
│ └── UnUseObjectPlugin.swift
├── Lib
│ └── RxSwift
│ │ ├── RecursiveLock.swift
│ │ ├── ScheduledItemType.swift
│ │ ├── Disposable.swift
│ │ ├── Disposables.swift
│ │ ├── Cancelable.swift
│ │ ├── InvocableType.swift
│ │ ├── SynchronizedUnsubscribeType.swift
│ │ ├── Never.swift
│ │ ├── Empty.swift
│ │ ├── AnonymousInvocable.swift
│ │ ├── LockOwnerType.swift
│ │ ├── DisposeBase.swift
│ │ ├── SynchronizedDisposeType.swift
│ │ ├── SynchronizedOnType.swift
│ │ ├── Error.swift
│ │ ├── InvocableScheduledItem.swift
│ │ ├── SubscriptionDisposable.swift
│ │ ├── ObservableConvertibleType.swift
│ │ ├── DispatchQueue+Extensions.swift
│ │ ├── SynchronizedSubscribeType.swift
│ │ ├── String+Rx.swift
│ │ ├── InfiniteSequence.swift
│ │ ├── RxMutableBox.swift
│ │ ├── SubjectType.swift
│ │ ├── NopDisposable.swift
│ │ ├── HistoricalScheduler.swift
│ │ ├── StartWith.swift
│ │ ├── ConnectableObservableType.swift
│ │ ├── ScheduledItem.swift
│ │ ├── AnonymousObserver.swift
│ │ ├── ObserverBase.swift
│ │ ├── Lock.swift
│ │ ├── Observable+Debug.swift
│ │ ├── BooleanDisposable.swift
│ │ ├── Observable.swift
│ │ ├── ObserverType.swift
│ │ ├── ImmediateScheduler.swift
│ │ ├── GroupedObservable.swift
│ │ ├── Repeat.swift
│ │ ├── Bag+Rx.swift
│ │ ├── AddRef.swift
│ │ ├── ToArray.swift
│ │ ├── ImmediateSchedulerType.swift
│ │ ├── DelaySubscription.swift
│ │ ├── DefaultIfEmpty.swift
│ │ ├── Errors.swift
│ │ ├── ScheduledDisposable.swift
│ │ ├── BinaryDisposable.swift
│ │ ├── Sequence.swift
│ │ ├── ObservableType.swift
│ │ ├── Deferred.swift
│ │ ├── Range.swift
│ │ ├── Filter.swift
│ │ ├── TakeLast.swift
│ │ ├── OperationQueueScheduler.swift
│ │ ├── Just.swift
│ │ ├── Rx.swift
│ │ ├── Concat.swift
│ │ ├── Reactive.swift
│ │ ├── Do.swift
│ │ ├── Sink.swift
│ │ ├── SubscribeOn.swift
│ │ ├── AnonymousDisposable.swift
│ │ ├── Scan.swift
│ │ ├── AnonymousObservable.swift
│ │ ├── Variable.swift
│ │ ├── Observable+Concurrency.swift
│ │ ├── Event.swift
│ │ ├── Optional.swift
│ │ ├── ElementAt.swift
│ │ ├── Platform.Darwin.swift
│ │ ├── AnyObserver.swift
│ │ ├── DistinctUntilChanged.swift
│ │ ├── SerialDisposable.swift
│ │ ├── SchedulerServices+Emulation.swift
│ │ ├── SingleAsync.swift
│ │ ├── Timer.swift
│ │ ├── Multicast.swift
│ │ ├── Generate.swift
│ │ ├── Using.swift
│ │ ├── MainScheduler.swift
│ │ ├── Reduce.swift
│ │ ├── SingleAssignmentDisposable.swift
│ │ ├── DisposeBag.swift
│ │ ├── HistoricalSchedulerTimeConverter.swift
│ │ ├── Observable+Aggregate.swift
│ │ ├── ObserveOnSerialDispatchQueue.swift
│ │ ├── AsyncLock.swift
│ │ ├── SwitchIfEmpty.swift
│ │ ├── RefCount.swift
│ │ ├── SchedulerType.swift
│ │ ├── Debug.swift
│ │ ├── Debounce.swift
│ │ ├── Platform.Linux.swift
│ │ ├── ShareReplay1.swift
│ │ ├── VirtualTimeConverterType.swift
│ │ ├── Producer.swift
│ │ ├── ConcurrentMainScheduler.swift
│ │ └── TakeUntil.swift
├── main.swift
├── Global
│ ├── SeekFolderFiles.swift
│ └── Sb.swift
└── Console
│ └── Console.swift
├── smck.xcodeproj
└── project.xcworkspace
│ └── contents.xcworkspacedata
├── .gitignore
└── README.md
/README/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ming1016/smck/master/README/1.png
--------------------------------------------------------------------------------
/README/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ming1016/smck/master/README/2.png
--------------------------------------------------------------------------------
/README/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ming1016/smck/master/README/3.png
--------------------------------------------------------------------------------
/README/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ming1016/smck/master/README/4.png
--------------------------------------------------------------------------------
/README/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ming1016/smck/master/README/5.png
--------------------------------------------------------------------------------
/README/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ming1016/smck/master/README/6.png
--------------------------------------------------------------------------------
/smck/Parser/JSParser.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JSParser.swift
3 | // smck
4 | //
5 | // Created by DaiMing on 2017/5/2.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
--------------------------------------------------------------------------------
/smck.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/smck/Plugin/H5ToNativePlugin.swift:
--------------------------------------------------------------------------------
1 | //
2 | // H5ToNativePlugin.swift
3 | // smck
4 | //
5 | // Created by DaiMing on 2017/7/24.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/RecursiveLock.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RecursiveLock.swift
3 | // Platform
4 | //
5 | // Created by Krunoslav Zaher on 12/18/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | typealias RecursiveLock = NSRecursiveLock
12 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/ScheduledItemType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ScheduledItemType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 11/7/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol ScheduledItemType
10 | : Cancelable
11 | , InvocableType {
12 | func invoke()
13 | }
14 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Disposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Disposable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Respresents a disposable resource.
10 | public protocol Disposable {
11 | /// Dispose resource.
12 | func dispose()
13 | }
14 |
--------------------------------------------------------------------------------
/smck/main.swift:
--------------------------------------------------------------------------------
1 | //
2 | // main.swift
3 | // smck
4 | //
5 | // Created by daiming on 2017/3/11.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | let checker = Checker()
12 | if CommandLine.argc < 2 {
13 | checker.interactiveModel()
14 | } else {
15 | checker.staticMode()
16 | }
17 |
18 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Disposables.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Disposables.swift
3 | // RxSwift
4 | //
5 | // Created by Mohsen Ramezanpoor on 01/08/2016.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// A collection of utility methods for common disposable operations.
10 | public struct Disposables {
11 | private init() {}
12 | }
13 |
14 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Cancelable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Cancelable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/12/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents disposable resource with state tracking.
10 | public protocol Cancelable : Disposable {
11 | /// Was resource disposed.
12 | var isDisposed: Bool { get }
13 | }
14 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/InvocableType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InvocableType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 11/7/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol InvocableType {
10 | func invoke()
11 | }
12 |
13 | protocol InvocableWithValueType {
14 | associatedtype Value
15 |
16 | func invoke(_ value: Value)
17 | }
18 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/SynchronizedUnsubscribeType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SynchronizedUnsubscribeType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 10/25/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol SynchronizedUnsubscribeType : class {
10 | associatedtype DisposeKey
11 |
12 | func synchronizedUnsubscribe(_ disposeKey: DisposeKey)
13 | }
14 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Never.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Never.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 8/30/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class Never : Producer {
10 | override func subscribe(_ observer: O) -> Disposable where O.E == Element {
11 | return Disposables.create()
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Empty.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Empty.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 8/30/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class Empty : Producer {
10 | override func subscribe(_ observer: O) -> Disposable where O.E == Element {
11 | observer.on(.completed)
12 | return Disposables.create()
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/AnonymousInvocable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnonymousInvocable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 11/7/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | struct AnonymousInvocable : InvocableType {
10 | private let _action: () -> ()
11 |
12 | init(_ action: @escaping () -> ()) {
13 | _action = action
14 | }
15 |
16 | func invoke() {
17 | _action()
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/LockOwnerType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LockOwnerType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 10/25/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol LockOwnerType : class, Lock {
10 | var _lock: RecursiveLock { get }
11 | }
12 |
13 | extension LockOwnerType {
14 | func lock() {
15 | _lock.lock()
16 | }
17 |
18 | func unlock() {
19 | _lock.unlock()
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/DisposeBase.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DisposeBase.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 4/4/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Base class for all disposables.
10 | public class DisposeBase {
11 | init() {
12 | #if TRACE_RESOURCES
13 | let _ = Resources.incrementTotal()
14 | #endif
15 | }
16 |
17 | deinit {
18 | #if TRACE_RESOURCES
19 | let _ = Resources.decrementTotal()
20 | #endif
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/SynchronizedDisposeType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SynchronizedDisposeType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 10/25/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol SynchronizedDisposeType : class, Disposable, Lock {
10 | func _synchronized_dispose()
11 | }
12 |
13 | extension SynchronizedDisposeType {
14 | func synchronizedDispose() {
15 | lock(); defer { unlock() }
16 | _synchronized_dispose()
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/SynchronizedOnType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SynchronizedOnType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 10/25/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol SynchronizedOnType : class, ObserverType, Lock {
10 | func _synchronized_on(_ event: Event)
11 | }
12 |
13 | extension SynchronizedOnType {
14 | func synchronizedOn(_ event: Event) {
15 | lock(); defer { unlock() }
16 | _synchronized_on(event)
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/smck/Parser/CSSAST.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CSSAST.swift
3 | // smck
4 | //
5 | // Created by DaiMing on 2017/4/19.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct CSSSelector {
12 | var selectorName:String
13 | var propertys:[String:String]
14 | }
15 |
16 | class CSSFile {
17 | private(set) var selectors = [String:CSSSelector]()
18 |
19 | func addSelector(_ selector:CSSSelector) {
20 | selectors["\(selector.selectorName)"] = selector
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/smck/Parser/H5AST.swift:
--------------------------------------------------------------------------------
1 | //
2 | // H5AST.swift
3 | // smck
4 | //
5 | // Created by DaiMing on 2017/4/17.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct H5Tag {
12 | let name: String
13 | let subs: [H5Tag]
14 | let attributes: [String:String]
15 | let value: String
16 | }
17 |
18 | class H5File {
19 | private(set) var tags = [H5Tag]()
20 | var cssFile = CSSFile()
21 |
22 | func addTag(_ tag:H5Tag) {
23 | tags.append(tag)
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/smck/Parser/analyzeExtension.swift:
--------------------------------------------------------------------------------
1 | //
2 | // analyzeExtension.swift
3 | // smck
4 | //
5 | // Created by didi on 2017/4/15.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension Character {
12 | var value: Int32 {
13 | return Int32(String(self).unicodeScalars.first!.value)
14 | }
15 | var isSpace: Bool {
16 | return isspace(value) != 0
17 | }
18 | var isAlphanumeric: Bool {
19 | return isalnum(value) != 0 || self == "_"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/smck/Parser/ParsingSecondRoundOneFile.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ParsingSecondRoundOneFile.swift
3 | // SMCheckProjectCL
4 | //
5 | // Created by didi on 2017/3/9.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class ParsingSecondRoundOneFile {
12 | class func parsing(aFile:File, allFiles:[String:File]) -> Observable {
13 | return Observable.create({ (observer) -> Disposable in
14 |
15 |
16 | return Disposables.create {}
17 | })
18 | }
19 |
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Error.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Error.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 8/30/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class Error : Producer {
10 | private let _error: Swift.Error
11 |
12 | init(error: Swift.Error) {
13 | _error = error
14 | }
15 |
16 | override func subscribe(_ observer: O) -> Disposable where O.E == Element {
17 | observer.on(.error(_error))
18 | return Disposables.create()
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/InvocableScheduledItem.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InvocableScheduledItem.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 11/7/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | struct InvocableScheduledItem : InvocableType {
10 |
11 | let _invocable: I
12 | let _state: I.Value
13 |
14 | init(invocable: I, state: I.Value) {
15 | _invocable = invocable
16 | _state = state
17 | }
18 |
19 | func invoke() {
20 | _invocable.invoke(_state)
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/smck/Parser/ParsingImplementation.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ParsingImplementation.swift
3 | // SMCheckProject
4 | //
5 | // Created by daiming on 2017/2/28.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class ParsingImplementation {
12 | class func parsing(line:String, inObject:Object) {
13 | // let aline = line.replacingOccurrences(of: Sb.atImplementation, with: "")
14 | // let tokens = ParsingBase.createOCLines(content: aline);
15 | // for tk in tokens {
16 | //
17 | // }
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/SubscriptionDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SubscriptionDisposable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 10/25/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | struct SubscriptionDisposable : Disposable {
10 | private let _key: T.DisposeKey
11 | private weak var _owner: T?
12 |
13 | init(owner: T, key: T.DisposeKey) {
14 | _owner = owner
15 | _key = key
16 | }
17 |
18 | func dispose() {
19 | _owner?.synchronizedUnsubscribe(_key)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/ObservableConvertibleType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObservableConvertibleType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 9/17/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Type that can be converted to observable sequence (`Observer`).
10 | public protocol ObservableConvertibleType {
11 | /// Type of elements in sequence.
12 | associatedtype E
13 |
14 | /// Converts `self` to `Observable` sequence.
15 | ///
16 | /// - returns: Observable sequence that represents `self`.
17 | func asObservable() -> Observable
18 | }
19 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/DispatchQueue+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DispatchQueue+Extensions.swift
3 | // Platform
4 | //
5 | // Created by Krunoslav Zaher on 10/22/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Dispatch
10 |
11 | extension DispatchQueue {
12 | private static var token: DispatchSpecificKey<()> = {
13 | let key = DispatchSpecificKey<()>()
14 | DispatchQueue.main.setSpecific(key: key, value: ())
15 | return key
16 | }()
17 |
18 | static var isMain: Bool {
19 | return DispatchQueue.getSpecific(key: token) != nil
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/smck/Parser/CSSSb.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CSSSb.swift
3 | // smck
4 | //
5 | // Created by DaiMing on 2017/4/18.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class CSSSb {
12 | //
13 | public static let braceL = "{"
14 | public static let braceR = "}"
15 | public static let pSign = "#"
16 | public static let dot = "."
17 | public static let semicolon = ";"
18 | public static let colon = ":"
19 | public static let rBktL = "("
20 | public static let rBktR = ")"
21 |
22 | public static let empty = ""
23 | public static let space = " "
24 | }
25 |
26 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/SynchronizedSubscribeType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SynchronizedSubscribeType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 10/25/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol SynchronizedSubscribeType : class, ObservableType, Lock {
10 | func _synchronized_subscribe(_ observer: O) -> Disposable where O.E == E
11 | }
12 |
13 | extension SynchronizedSubscribeType {
14 | func synchronizedSubscribe(_ observer: O) -> Disposable where O.E == E {
15 | lock(); defer { unlock() }
16 | return _synchronized_subscribe(observer)
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/String+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Rx.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 12/25/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension String {
10 | /// This is needed because on Linux Swift doesn't have `rangeOfString(..., options: .BackwardsSearch)`
11 | func lastIndexOf(_ character: Character) -> Index? {
12 | var index = endIndex
13 | while index > startIndex {
14 | index = self.index(before: index)
15 | if self[index] == character {
16 | return index
17 | }
18 | }
19 |
20 | return nil
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/smck/Parser/ParsingProtocol.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ParsingProtocol.swift
3 | // SMCheckProject
4 | //
5 | // Created by didi on 2017/2/28.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class ParsingProtocol {
12 | //获取Protocol的name
13 | class func parsingNameFrom(line:String) -> String {
14 | guard let name = self.tokensFrom(line: line).first else {
15 | return ""
16 | }
17 | return name
18 | }
19 |
20 | class func tokensFrom(line:String) -> [String] {
21 | let aLine = line.replacingOccurrences(of: Sb.atProtocol, with: "")
22 | return ParsingBase.createOCTokens(conent: aLine)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/InfiniteSequence.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InfiniteSequence.swift
3 | // Platform
4 | //
5 | // Created by Krunoslav Zaher on 6/13/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Sequence that repeats `repeatedValue` infinite number of times.
10 | struct InfiniteSequence : Sequence {
11 | typealias Element = E
12 | typealias Iterator = AnyIterator
13 |
14 | private let _repeatedValue: E
15 |
16 | init(repeatedValue: E) {
17 | _repeatedValue = repeatedValue
18 | }
19 |
20 | func makeIterator() -> Iterator {
21 | let repeatedValue = _repeatedValue
22 | return AnyIterator {
23 | return repeatedValue
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/RxMutableBox.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxMutableBox.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 5/22/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Creates mutable reference wrapper for any type.
10 | final class RxMutableBox : CustomDebugStringConvertible {
11 | /// Wrapped value
12 | var value : T
13 |
14 | /// Creates reference wrapper for `value`.
15 | ///
16 | /// - parameter value: Value to wrap.
17 | init (_ value: T) {
18 | self.value = value
19 | }
20 | }
21 |
22 | extension RxMutableBox {
23 | /// - returns: Box description.
24 | var debugDescription: String {
25 | return "MutatingBox(\(self.value))"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/SubjectType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SubjectType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/1/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents an object that is both an observable sequence as well as an observer.
10 | public protocol SubjectType : ObservableType {
11 | /// The type of the observer that represents this subject.
12 | ///
13 | /// Usually this type is type of subject itself, but it doesn't have to be.
14 | associatedtype SubjectObserverType : ObserverType
15 |
16 | /// Returns observer interface for subject.
17 | ///
18 | /// - returns: Observer interface for subject.
19 | func asObserver() -> SubjectObserverType
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/NopDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NopDisposable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/15/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents a disposable that does nothing on disposal.
10 | ///
11 | /// Nop = No Operation
12 | fileprivate struct NopDisposable : Disposable {
13 |
14 | fileprivate static let noOp: Disposable = NopDisposable()
15 |
16 | fileprivate init() {
17 |
18 | }
19 |
20 | /// Does nothing.
21 | public func dispose() {
22 | }
23 | }
24 |
25 | extension Disposables {
26 | /**
27 | Creates a disposable that does nothing on disposal.
28 | */
29 | static public func create() -> Disposable {
30 | return NopDisposable.noOp
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/smck/Parser/H5Sb.swift:
--------------------------------------------------------------------------------
1 | //
2 | // H5Sb.swift
3 | // smck
4 | //
5 | // Created by DaiMing on 2017/4/18.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class H5Sb {
12 |
13 | public static let divide = "/"
14 | public static let agBktL = "<"
15 | public static let agBktR = ">"
16 | public static let quotM = "\""
17 | public static let sQuot = "'"
18 | public static let equal = "="
19 | //css
20 |
21 | //js
22 | public static let add = "+"
23 | public static let minus = "-"
24 | public static let asterisk = "*"
25 | public static let comma = ","
26 |
27 | // public static let
28 |
29 | public static let empty = ""
30 | public static let space = " "
31 | public static let newLine = "\n"
32 | }
33 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/HistoricalScheduler.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HistoricalScheduler.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 12/27/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import struct Foundation.Date
10 |
11 | /// Provides a virtual time scheduler that uses `Date` for absolute time and `NSTimeInterval` for relative time.
12 | public class HistoricalScheduler : VirtualTimeScheduler {
13 |
14 | /**
15 | Creates a new historical scheduler with initial clock value.
16 |
17 | - parameter initialClock: Initial value for virtual clock.
18 | */
19 | public init(initialClock: RxTime = Date(timeIntervalSince1970: 0)) {
20 | super.init(initialClock: initialClock, converter: HistoricalSchedulerTimeConverter())
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/StartWith.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StartWith.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 4/6/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class StartWith: Producer {
10 | let elements: [Element]
11 | let source: Observable
12 |
13 | init(source: Observable, elements: [Element]) {
14 | self.source = source
15 | self.elements = elements
16 | super.init()
17 | }
18 |
19 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
20 | for e in elements {
21 | observer.on(.next(e))
22 | }
23 |
24 | return (sink: Disposables.create(), subscription: source.subscribe(observer))
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/ConnectableObservableType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ConnectableObservableType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/1/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /**
10 | Represents an observable sequence wrapper that can be connected and disconnected from its underlying observable sequence.
11 | */
12 | public protocol ConnectableObservableType : ObservableType {
13 | /**
14 | Connects the observable wrapper to its source. All subscribed observers will receive values from the underlying observable sequence as long as the connection is established.
15 |
16 | - returns: Disposable used to disconnect the observable wrapper from its source, causing subscribed observer to stop receiving values from the underlying observable sequence.
17 | */
18 | func connect() -> Disposable
19 | }
20 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/ScheduledItem.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ScheduledItem.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 9/2/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | struct ScheduledItem
10 | : ScheduledItemType
11 | , InvocableType {
12 | typealias Action = (T) -> Disposable
13 |
14 | private let _action: Action
15 | private let _state: T
16 |
17 | private let _disposable = SingleAssignmentDisposable()
18 |
19 | var isDisposed: Bool {
20 | return _disposable.isDisposed
21 | }
22 |
23 | init(action: @escaping Action, state: T) {
24 | _action = action
25 | _state = state
26 | }
27 |
28 | func invoke() {
29 | _disposable.setDisposable(_action(_state))
30 | }
31 |
32 | func dispose() {
33 | _disposable.dispose()
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/AnonymousObserver.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnonymousObserver.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class AnonymousObserver : ObserverBase {
10 | typealias Element = ElementType
11 |
12 | typealias EventHandler = (Event) -> Void
13 |
14 | private let _eventHandler : EventHandler
15 |
16 | init(_ eventHandler: @escaping EventHandler) {
17 | #if TRACE_RESOURCES
18 | let _ = Resources.incrementTotal()
19 | #endif
20 | _eventHandler = eventHandler
21 | }
22 |
23 | override func onCore(_ event: Event) {
24 | return _eventHandler(event)
25 | }
26 |
27 | #if TRACE_RESOURCES
28 | deinit {
29 | let _ = Resources.decrementTotal()
30 | }
31 | #endif
32 | }
33 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/ObserverBase.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObserverBase.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/15/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | class ObserverBase : Disposable, ObserverType {
10 | typealias E = ElementType
11 |
12 | private var _isStopped: AtomicInt = 0
13 |
14 | func on(_ event: Event) {
15 | switch event {
16 | case .next:
17 | if _isStopped == 0 {
18 | onCore(event)
19 | }
20 | case .error, .completed:
21 |
22 | if !AtomicCompareAndSwap(0, 1, &_isStopped) {
23 | return
24 | }
25 |
26 | onCore(event)
27 | }
28 | }
29 |
30 | func onCore(_ event: Event) {
31 | abstractMethod()
32 | }
33 |
34 | func dispose() {
35 | _ = AtomicCompareAndSwap(0, 1, &_isStopped)
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/smck/Parser/ParsingObject.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ParsingObject.swift
3 | // SMCheckProjectCL
4 | //
5 | // Created by didi on 2017/3/10.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class ParsingObject {
12 | class func parsing(tokens:[String], file:File) -> Observable {
13 | return Observable.create({ (observer) -> Disposable in
14 | for tk in tokens {
15 | //正常情况
16 | guard let obj = file.importObjects[tk] else {
17 | continue
18 | }
19 | guard let _ = file.usedObjects[tk] else {
20 | //记录使用过的类
21 | file.usedObjects[tk] = obj
22 | observer.on(.next(obj))
23 | continue
24 | }
25 | }
26 | observer.on(.completed)
27 | return Disposables.create {}
28 | })
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Lock.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Lock.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/31/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol Lock {
10 | func lock()
11 | func unlock()
12 | }
13 |
14 | // https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20151214/000321.html
15 | typealias SpinLock = RecursiveLock
16 |
17 | extension RecursiveLock : Lock {
18 | @inline(__always)
19 | final func performLocked(_ action: () -> Void) {
20 | lock(); defer { unlock() }
21 | action()
22 | }
23 |
24 | @inline(__always)
25 | final func calculateLocked(_ action: () -> T) -> T {
26 | lock(); defer { unlock() }
27 | return action()
28 | }
29 |
30 | @inline(__always)
31 | final func calculateLockedOrFail(_ action: () throws -> T) throws -> T {
32 | lock(); defer { unlock() }
33 | let result = try action()
34 | return result
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Observable+Debug.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Observable+Debug.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 5/2/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | // MARK: debug
10 |
11 | extension ObservableType {
12 |
13 | /**
14 | Prints received events for all observers on standard output.
15 |
16 | - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)
17 |
18 | - parameter identifier: Identifier that is printed together with event description to standard output.
19 | - parameter trimOutput: Should output be trimmed to max 40 characters.
20 | - returns: An observable sequence whose events are printed to standard output.
21 | */
22 | public func debug(_ identifier: String? = nil, trimOutput: Bool = false, file: String = #file, line: UInt = #line, function: String = #function)
23 | -> Observable {
24 | return Debug(source: self, identifier: identifier, trimOutput: trimOutput, file: file, line: line, function: function)
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/BooleanDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BooleanDisposable.swift
3 | // RxSwift
4 | //
5 | // Created by Junior B. on 10/29/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents a disposable resource that can be checked for disposal status.
10 | public final class BooleanDisposable : Disposable, Cancelable {
11 |
12 | internal static let BooleanDisposableTrue = BooleanDisposable(isDisposed: true)
13 | private var _isDisposed = false
14 |
15 | /// Initializes a new instance of the `BooleanDisposable` class
16 | public init() {
17 | }
18 |
19 | /// Initializes a new instance of the `BooleanDisposable` class with given value
20 | public init(isDisposed: Bool) {
21 | self._isDisposed = isDisposed
22 | }
23 |
24 | /// - returns: Was resource disposed.
25 | public var isDisposed: Bool {
26 | return _isDisposed
27 | }
28 |
29 | /// Sets the status to disposed, which can be observer through the `isDisposed` property.
30 | public func dispose() {
31 | _isDisposed = true
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/smck/Global/SeekFolderFiles.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SeekFolderFiles.swift
3 | // SMCheckProjectCL
4 | //
5 | // Created by daiming on 2017/3/7.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class SeekFolderFiles {
12 |
13 | class func seekWith(_ folderPath:String, matchingExtension:[String] = ["m","h","mm"]) -> [String] {
14 | let fileFolderPath = folderPath
15 | let fileFolderStringPath = fileFolderPath.replacingOccurrences(of: "file://", with: "")
16 | let fileManager = FileManager.default;
17 | //深度遍历
18 | let enumeratorAtPath = fileManager.enumerator(atPath: fileFolderStringPath)
19 | //过滤文件后缀
20 | let filterPath = NSArray(array: (enumeratorAtPath?.allObjects)!).pathsMatchingExtensions(matchingExtension)
21 |
22 | let rePaths = filterPath.map { (aPath) -> String in
23 | let fullPath = folderPath
24 | let nsFullPath = folderPath as NSString
25 | var slash = "/"
26 | if nsFullPath.lastPathComponent == slash {
27 | slash = ""
28 | }
29 | return "file://".appending(fullPath.appending(slash + aPath))
30 | }
31 | return rePaths
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/smck/Parser/ParsingMacro.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ParsingMacro.swift
3 | // SMCheckProject
4 | //
5 | // Created by daiming on 2017/2/22.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class ParsingMacro {
12 | class func parsing(line:String) -> Macro {
13 | var macro = Macro()
14 | let aLine = line.replacingOccurrences(of: Sb.defineStr, with: "")
15 | let tokens = ParsingBase.createOCTokens(conent: aLine)
16 | guard let name = tokens.first else {
17 | return macro
18 | }
19 | macro.name = name
20 | macro.tokens = tokens
21 | return macro
22 | }
23 | //获取宏中所需的东西
24 | class func parsing(aMac:Macro, file:File) -> Observable {
25 | return Observable.create({ (observer) -> Disposable in
26 |
27 | _ = ParsingObject.parsing(tokens: aMac.tokens, file: file).subscribe(onNext: { result in
28 | if result is Object {
29 | let obj = result as! Object
30 | observer.on(.next(obj))
31 | }
32 | })
33 | observer.on(.completed)
34 | return Disposables.create {}
35 | })
36 | }
37 | //获取宏中用到的字符串
38 | }
39 |
--------------------------------------------------------------------------------
/smck/Parser/JSSb.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JSSb.swift
3 | // smck
4 | //
5 | // Created by DaiMing on 2017/5/2.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class JSSb {
12 | public static let rBktL = "("
13 | public static let rBktR = ")"
14 | public static let bktL = "["
15 | public static let bktR = "]"
16 | public static let braceL = "{"
17 | public static let braceR = "}"
18 | public static let comma = ","
19 | public static let colon = ":"
20 | public static let dot = "."
21 | public static let add = "+"
22 | public static let minus = "-"
23 | public static let tilde = "~"
24 | public static let excMk = "!"
25 | public static let asterisk = "*"
26 | public static let percent = "%"
27 | public static let agBktL = "<"
28 | public static let agBktR = ">"
29 | public static let equal = "="
30 | public static let and = "&"
31 | public static let upArrow = "^"
32 | public static let pipe = "|"
33 | public static let qM = "?"
34 | public static let semicolon = ";"
35 |
36 | //keywords
37 | //this new delete void typeof instanceof var if else do while for in continue break return with switch case default throw try catch finally function import
38 | }
39 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Observable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Observable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// A type-erased `ObservableType`.
10 | ///
11 | /// It represents a push style sequence.
12 | public class Observable : ObservableType {
13 | /// Type of elements in sequence.
14 | public typealias E = Element
15 |
16 | init() {
17 | #if TRACE_RESOURCES
18 | let _ = Resources.incrementTotal()
19 | #endif
20 | }
21 |
22 | public func subscribe(_ observer: O) -> Disposable where O.E == E {
23 | abstractMethod()
24 | }
25 |
26 | public func asObservable() -> Observable {
27 | return self
28 | }
29 |
30 | deinit {
31 | #if TRACE_RESOURCES
32 | let _ = Resources.decrementTotal()
33 | #endif
34 | }
35 |
36 | // this is kind of ugly I know :(
37 | // Swift compiler reports "Not supported yet" when trying to override protocol extensions, so ¯\_(ツ)_/¯
38 |
39 | /// Optimizations for map operator
40 | internal func composeMap(_ selector: @escaping (Element) throws -> R) -> Observable {
41 | return Map(source: self, transform: selector)
42 | }
43 | }
44 |
45 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/ObserverType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObserverType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Supports push-style iteration over an observable sequence.
10 | public protocol ObserverType {
11 | /// The type of elements in sequence that observer can observe.
12 | associatedtype E
13 |
14 | /// Notify observer about sequence event.
15 | ///
16 | /// - parameter event: Event that occured.
17 | func on(_ event: Event)
18 | }
19 |
20 | /// Convenience API extensions to provide alternate next, error, completed events
21 | extension ObserverType {
22 |
23 | /// Convenience method equivalent to `on(.next(element: E))`
24 | ///
25 | /// - parameter element: Next element to send to observer(s)
26 | public final func onNext(_ element: E) {
27 | on(.next(element))
28 | }
29 |
30 | /// Convenience method equivalent to `on(.completed)`
31 | public final func onCompleted() {
32 | on(.completed)
33 | }
34 |
35 | /// Convenience method equivalent to `on(.error(Swift.Error))`
36 | /// - parameter error: Swift.Error to send to observer(s)
37 | public final func onError(_ error: Swift.Error) {
38 | on(.error(error))
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/ImmediateScheduler.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ImmediateScheduler.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 10/17/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents an object that schedules units of work to run immediately on the current thread.
10 | private final class ImmediateScheduler : ImmediateSchedulerType {
11 |
12 | private let _asyncLock = AsyncLock()
13 |
14 | /**
15 | Schedules an action to be executed immediatelly.
16 |
17 | In case `schedule` is called recursively from inside of `action` callback, scheduled `action` will be enqueued
18 | and executed after current `action`. (`AsyncLock` behavior)
19 |
20 | - parameter state: State passed to the action to be executed.
21 | - parameter action: Action to be executed.
22 | - returns: The disposable object used to cancel the scheduled action (best effort).
23 | */
24 | func schedule(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {
25 | let disposable = SingleAssignmentDisposable()
26 | _asyncLock.invoke(AnonymousInvocable {
27 | if disposable.isDisposed {
28 | return
29 | }
30 | disposable.setDisposable(action(state))
31 | })
32 |
33 | return disposable
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/GroupedObservable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GroupedObservable.swift
3 | // RxSwift
4 | //
5 | // Created by Tomi Koskinen on 01/12/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents an observable sequence of elements that have a common key.
10 | public struct GroupedObservable : ObservableType {
11 | public typealias E = Element
12 |
13 | /// Gets the common key.
14 | public let key: Key
15 |
16 | private let source: Observable
17 |
18 | /// Initializes grouped observable sequence with key and source observable sequence.
19 | ///
20 | /// - parameter key: Grouped observable sequence key
21 | /// - parameter source: Observable sequence that represents sequence of elements for the key
22 | /// - returns: Grouped observable sequence of elements for the specific key
23 | public init(key: Key, source: Observable) {
24 | self.key = key
25 | self.source = source
26 | }
27 |
28 | /// Subscribes `observer` to receive events for this sequence.
29 | public func subscribe(_ observer: O) -> Disposable where O.E == E {
30 | return self.source.subscribe(observer)
31 | }
32 |
33 | /// Converts `self` to `Observable` sequence.
34 | public func asObservable() -> Observable {
35 | return source
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Repeat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repeat.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 9/13/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class RepeatElement : Producer {
10 | fileprivate let _element: Element
11 | fileprivate let _scheduler: ImmediateSchedulerType
12 |
13 | init(element: Element, scheduler: ImmediateSchedulerType) {
14 | _element = element
15 | _scheduler = scheduler
16 | }
17 |
18 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
19 | let sink = RepeatElementSink(parent: self, observer: observer, cancel: cancel)
20 | let subscription = sink.run()
21 |
22 | return (sink: sink, subscription: subscription)
23 | }
24 | }
25 |
26 | final class RepeatElementSink : Sink {
27 | typealias Parent = RepeatElement
28 |
29 | private let _parent: Parent
30 |
31 | init(parent: Parent, observer: O, cancel: Cancelable) {
32 | _parent = parent
33 | super.init(observer: observer, cancel: cancel)
34 | }
35 |
36 | func run() -> Disposable {
37 | return _parent._scheduler.scheduleRecursive(_parent._element) { e, recurse in
38 | self.forwardOn(.next(e))
39 | recurse(e)
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Bag+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Bag+Rx.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 10/19/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 |
10 | // MARK: forEach
11 |
12 | @inline(__always)
13 | func dispatch(_ bag: Bag<(Event) -> ()>, _ event: Event) {
14 | if bag._onlyFastPath {
15 | bag._value0?(event)
16 | return
17 | }
18 |
19 | let value0 = bag._value0
20 | let dictionary = bag._dictionary
21 |
22 | if let value0 = value0 {
23 | value0(event)
24 | }
25 |
26 | let pairs = bag._pairs
27 | for i in 0 ..< pairs.count {
28 | pairs[i].value(event)
29 | }
30 |
31 | if let dictionary = dictionary {
32 | for element in dictionary.values {
33 | element(event)
34 | }
35 | }
36 | }
37 |
38 | /// Dispatches `dispose` to all disposables contained inside bag.
39 | func disposeAll(in bag: Bag) {
40 | if bag._onlyFastPath {
41 | bag._value0?.dispose()
42 | return
43 | }
44 |
45 | let value0 = bag._value0
46 | let dictionary = bag._dictionary
47 |
48 | if let value0 = value0 {
49 | value0.dispose()
50 | }
51 |
52 | let pairs = bag._pairs
53 | for i in 0 ..< pairs.count {
54 | pairs[i].value.dispose()
55 | }
56 |
57 | if let dictionary = dictionary {
58 | for element in dictionary.values {
59 | element.dispose()
60 | }
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/AddRef.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AddRef.swift
3 | // RxSwift
4 | //
5 | // Created by Junior B. on 30/10/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class AddRefSink : Sink, ObserverType {
10 | typealias Element = O.E
11 |
12 | override init(observer: O, cancel: Cancelable) {
13 | super.init(observer: observer, cancel: cancel)
14 | }
15 |
16 | func on(_ event: Event) {
17 | switch event {
18 | case .next(_):
19 | forwardOn(event)
20 | case .completed, .error(_):
21 | forwardOn(event)
22 | dispose()
23 | }
24 | }
25 | }
26 |
27 | final class AddRef : Producer {
28 | typealias EventHandler = (Event) throws -> Void
29 |
30 | private let _source: Observable
31 | private let _refCount: RefCountDisposable
32 |
33 | init(source: Observable, refCount: RefCountDisposable) {
34 | _source = source
35 | _refCount = refCount
36 | }
37 |
38 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
39 | let releaseDisposable = _refCount.retain()
40 | let sink = AddRefSink(observer: observer, cancel: cancel)
41 | let subscription = Disposables.create(releaseDisposable, _source.subscribe(sink))
42 |
43 | return (sink: sink, subscription: subscription)
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/ToArray.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ToArray.swift
3 | // RxSwift
4 | //
5 | // Created by Junior B. on 20/10/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class ToArraySink : Sink, ObserverType where O.E == [SourceType] {
10 | typealias Parent = ToArray
11 |
12 | let _parent: Parent
13 | var _list = Array()
14 |
15 | init(parent: Parent, observer: O, cancel: Cancelable) {
16 | _parent = parent
17 |
18 | super.init(observer: observer, cancel: cancel)
19 | }
20 |
21 | func on(_ event: Event) {
22 | switch event {
23 | case .next(let value):
24 | self._list.append(value)
25 | case .error(let e):
26 | forwardOn(.error(e))
27 | self.dispose()
28 | case .completed:
29 | forwardOn(.next(_list))
30 | forwardOn(.completed)
31 | self.dispose()
32 | }
33 | }
34 | }
35 |
36 | final class ToArray : Producer<[SourceType]> {
37 | let _source: Observable
38 |
39 | init(source: Observable) {
40 | _source = source
41 | }
42 |
43 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == [SourceType] {
44 | let sink = ToArraySink(parent: self, observer: observer, cancel: cancel)
45 | let subscription = _source.subscribe(sink)
46 | return (sink: sink, subscription: subscription)
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/ImmediateSchedulerType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ImmediateSchedulerType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 5/31/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents an object that immediately schedules units of work.
10 | public protocol ImmediateSchedulerType {
11 | /**
12 | Schedules an action to be executed immediatelly.
13 |
14 | - parameter state: State passed to the action to be executed.
15 | - parameter action: Action to be executed.
16 | - returns: The disposable object used to cancel the scheduled action (best effort).
17 | */
18 | func schedule(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable
19 | }
20 |
21 | extension ImmediateSchedulerType {
22 | /**
23 | Schedules an action to be executed recursively.
24 |
25 | - parameter state: State passed to the action to be executed.
26 | - parameter action: Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.
27 | - returns: The disposable object used to cancel the scheduled action (best effort).
28 | */
29 | public func scheduleRecursive(_ state: State, action: @escaping (_ state: State, _ recurse: (State) -> ()) -> ()) -> Disposable {
30 | let recursiveScheduler = RecursiveImmediateScheduler(action: action, scheduler: self)
31 |
32 | recursiveScheduler.schedule(state)
33 |
34 | return Disposables.create(with: recursiveScheduler.dispose)
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/DelaySubscription.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DelaySubscription.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 6/14/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class DelaySubscriptionSink
10 | : Sink, ObserverType {
11 | typealias E = O.E
12 | typealias Parent = DelaySubscription
13 |
14 | private let _parent: Parent
15 |
16 | init(parent: Parent, observer: O, cancel: Cancelable) {
17 | _parent = parent
18 | super.init(observer: observer, cancel: cancel)
19 | }
20 |
21 | func on(_ event: Event) {
22 | forwardOn(event)
23 | if event.isStopEvent {
24 | dispose()
25 | }
26 | }
27 |
28 | }
29 |
30 | final class DelaySubscription: Producer {
31 | private let _source: Observable
32 | private let _dueTime: RxTimeInterval
33 | private let _scheduler: SchedulerType
34 |
35 | init(source: Observable, dueTime: RxTimeInterval, scheduler: SchedulerType) {
36 | _source = source
37 | _dueTime = dueTime
38 | _scheduler = scheduler
39 | }
40 |
41 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
42 | let sink = DelaySubscriptionSink(parent: self, observer: observer, cancel: cancel)
43 | let subscription = _scheduler.scheduleRelative((), dueTime: _dueTime) { _ in
44 | return self._source.subscribe(sink)
45 | }
46 |
47 | return (sink: sink, subscription: subscription)
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## Build generated
6 | build/
7 | DerivedData/
8 |
9 | ## Various settings
10 | *.pbxuser
11 | !default.pbxuser
12 | *.mode1v3
13 | !default.mode1v3
14 | *.mode2v3
15 | !default.mode2v3
16 | *.perspectivev3
17 | !default.perspectivev3
18 | xcuserdata/
19 |
20 | ## Other
21 | *.moved-aside
22 | *.xcuserstate
23 |
24 | ## Obj-C/Swift specific
25 | *.hmap
26 | *.ipa
27 | *.dSYM.zip
28 | *.dSYM
29 |
30 | ## Playgrounds
31 | timeline.xctimeline
32 | playground.xcworkspace
33 |
34 | # Swift Package Manager
35 | #
36 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
37 | # Packages/
38 | .build/
39 |
40 | # CocoaPods
41 | #
42 | # We recommend against adding the Pods directory to your .gitignore. However
43 | # you should judge for yourself, the pros and cons are mentioned at:
44 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
45 | #
46 | # Pods/
47 |
48 | # Carthage
49 | #
50 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
51 | # Carthage/Checkouts
52 |
53 | Carthage/Build
54 |
55 | # fastlane
56 | #
57 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
58 | # screenshots whenever they are needed.
59 | # For more information about the recommended setup visit:
60 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md
61 |
62 | fastlane/report.xml
63 | fastlane/Preview.html
64 | fastlane/screenshots
65 | fastlane/test_output
66 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/DefaultIfEmpty.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DefaultIfEmpty.swift
3 | // RxSwift
4 | //
5 | // Created by sergdort on 23/12/2016.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class DefaultIfEmptySink: Sink, ObserverType {
10 | typealias E = O.E
11 | private let _default: E
12 | private var _isEmpty = true
13 |
14 | init(default: E, observer: O, cancel: Cancelable) {
15 | _default = `default`
16 | super.init(observer: observer, cancel: cancel)
17 | }
18 |
19 | func on(_ event: Event) {
20 | switch event {
21 | case .next(_):
22 | _isEmpty = false
23 | forwardOn(event)
24 | case .error(_):
25 | forwardOn(event)
26 | dispose()
27 | case .completed:
28 | if _isEmpty {
29 | forwardOn(.next(_default))
30 | }
31 | forwardOn(.completed)
32 | dispose()
33 | }
34 | }
35 | }
36 |
37 | final class DefaultIfEmpty: Producer {
38 | private let _source: Observable
39 | private let _default: SourceType
40 |
41 | init(source: Observable, `default`: SourceType) {
42 | _source = source
43 | _default = `default`
44 | }
45 |
46 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceType {
47 | let sink = DefaultIfEmptySink(default: _default, observer: observer, cancel: cancel)
48 | let subscription = _source.subscribe(sink)
49 | return (sink: sink, subscription: subscription)
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/smck/Global/Sb.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Sb.swift
3 | // SMCheckProject
4 | //
5 | // Created by daiming on 2016/10/25.
6 | // Copyright © 2016年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class Sb {
12 | public static let add = "+"
13 | public static let minus = "-"
14 | public static let rBktL = "("
15 | public static let rBktR = ")"
16 | public static let asterisk = "*"
17 | public static let colon = ":"
18 | public static let comma = ","
19 | public static let semicolon = ";"
20 | public static let divide = "/"
21 | public static let agBktL = "<"
22 | public static let agBktR = ">"
23 | public static let quotM = "\""
24 | public static let pSign = "#"
25 | public static let braceL = "{"
26 | public static let braceR = "}"
27 | public static let bktL = "["
28 | public static let bktR = "]"
29 | public static let qM = "?"
30 | public static let upArrow = "^"
31 | public static let at = "@"
32 |
33 | public static let atInteface = "@interface"
34 | public static let atImplementation = "@implementation"
35 | public static let atEnd = "@end"
36 | public static let atProtocol = "@protocol"
37 | public static let atOptional = "@optional"
38 | public static let atRequired = "@required"
39 |
40 | public static let atSelector = "@selector"
41 | public static let atProperty = "@property"
42 |
43 | public static let defineStr = "#define"
44 | public static let importStr = "#import"
45 |
46 | public static let implementationStr = "implementation"
47 | public static let endStr = "end"
48 |
49 |
50 | public static let space = " "
51 | public static let newLine = "\n"
52 | }
53 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Errors.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Errors.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/28/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | let RxErrorDomain = "RxErrorDomain"
10 | let RxCompositeFailures = "RxCompositeFailures"
11 |
12 | /// Generic Rx error codes.
13 | public enum RxError
14 | : Swift.Error
15 | , CustomDebugStringConvertible {
16 | /// Unknown error occured.
17 | case unknown
18 | /// Performing an action on disposed object.
19 | case disposed(object: AnyObject)
20 | /// Aritmetic overflow error.
21 | case overflow
22 | /// Argument out of range error.
23 | case argumentOutOfRange
24 | /// Sequence doesn't contain any elements.
25 | case noElements
26 | /// Sequence contains more than one element.
27 | case moreThanOneElement
28 | /// Timeout error.
29 | case timeout
30 | }
31 |
32 | extension RxError {
33 | /// A textual representation of `self`, suitable for debugging.
34 | public var debugDescription: String {
35 | switch self {
36 | case .unknown:
37 | return "Unknown error occured."
38 | case .disposed(let object):
39 | return "Object `\(object)` was already disposed."
40 | case .overflow:
41 | return "Arithmetic overflow occured."
42 | case .argumentOutOfRange:
43 | return "Argument out of range."
44 | case .noElements:
45 | return "Sequence doesn't contain any elements."
46 | case .moreThanOneElement:
47 | return "Sequence contains more than one element."
48 | case .timeout:
49 | return "Sequence timeout."
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/ScheduledDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ScheduledDisposable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 6/13/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | private let disposeScheduledDisposable: (ScheduledDisposable) -> Disposable = { sd in
10 | sd.disposeInner()
11 | return Disposables.create()
12 | }
13 |
14 | /// Represents a disposable resource whose disposal invocation will be scheduled on the specified scheduler.
15 | public final class ScheduledDisposable : Cancelable {
16 | public let scheduler: ImmediateSchedulerType
17 |
18 | private var _isDisposed: AtomicInt = 0
19 |
20 | // state
21 | private var _disposable: Disposable?
22 |
23 | /// - returns: Was resource disposed.
24 | public var isDisposed: Bool {
25 | return _isDisposed == 1
26 | }
27 |
28 | /**
29 | Initializes a new instance of the `ScheduledDisposable` that uses a `scheduler` on which to dispose the `disposable`.
30 |
31 | - parameter scheduler: Scheduler where the disposable resource will be disposed on.
32 | - parameter disposable: Disposable resource to dispose on the given scheduler.
33 | */
34 | public init(scheduler: ImmediateSchedulerType, disposable: Disposable) {
35 | self.scheduler = scheduler
36 | _disposable = disposable
37 | }
38 |
39 | /// Disposes the wrapped disposable on the provided scheduler.
40 | public func dispose() {
41 | let _ = scheduler.schedule(self, action: disposeScheduledDisposable)
42 | }
43 |
44 | func disposeInner() {
45 | if AtomicCompareAndSwap(0, 1, &_isDisposed) {
46 | _disposable!.dispose()
47 | _disposable = nil
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/smck/Parser/ParsingProperty.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ParsingProperty.swift
3 | // SMCheckProject
4 | //
5 | // Created by daiming on 2017/2/23.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class ParsingProperty {
12 | class func parsing(tokens:Array) -> Property {
13 | var aProperty = Property()
14 | var inBktTf = false
15 | var inTypeTf = false
16 | var inNameTf = false
17 | var setName = ""
18 |
19 | for tk in tokens {
20 | //处理设置set
21 | if tk == Sb.rBktL && !inBktTf {
22 | inBktTf = true
23 | } else if tk == Sb.comma && inBktTf {
24 | aProperty.sets.append(setName)
25 | } else if tk == Sb.rBktR && inBktTf {
26 | aProperty.sets.append(setName)
27 | inBktTf = false
28 | setName = ""
29 | inTypeTf = true
30 | continue
31 | } else if inBktTf {
32 | setName = tk
33 | }
34 | //处理类型和属性名
35 | if inTypeTf && !inNameTf && (tk != Sb.agBktL || tk != Sb.agBktR) {
36 | aProperty.type = tk
37 | inNameTf = true
38 | continue
39 | }
40 | if inTypeTf && tk == Sb.agBktL {
41 | inNameTf = false
42 | }
43 | if inTypeTf && tk == Sb.agBktR {
44 | inNameTf = true
45 | continue
46 | }
47 | if inNameTf && tk != Sb.asterisk && tk != Sb.semicolon{
48 | aProperty.name = tk
49 | }
50 |
51 | }
52 |
53 | return aProperty
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/smck/Parser/ParsingImport.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ParsingImport.swift
3 | // SMCheckProject
4 | //
5 | // Created by daiming on 2017/2/22.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class ParsingImport {
12 | class func parsing(tokens:Array) -> Import {
13 | var aImport = Import()
14 | //处理#import "file.h"
15 | var inQuot = false
16 | var fileName = ""
17 |
18 | //处理#import
19 | var inBkt = false
20 | var getLibNameTf = false
21 | var libName = ""
22 |
23 | for tk in tokens {
24 | //引号
25 | if tk == Sb.quotM && !inQuot {
26 | inQuot = true
27 | } else if tk == Sb.quotM && inQuot {
28 | inQuot = false
29 | aImport.fileName = fileName
30 | } else if inQuot {
31 | fileName += tk
32 | }
33 | //中括号
34 | if tk == Sb.agBktL && !inBkt {
35 | inBkt = true
36 | } else if tk == Sb.divide && inBkt && !getLibNameTf {
37 | aImport.libName = libName
38 | getLibNameTf = true
39 | } else if tk == Sb.agBktR && getLibNameTf {
40 | aImport.fileName = fileName
41 | //clean
42 | inBkt = false
43 | getLibNameTf = false
44 | fileName = ""
45 | libName = ""
46 | } else if inBkt && getLibNameTf {
47 | fileName += tk
48 | } else if inBkt && !getLibNameTf {
49 | libName += tk
50 | }
51 |
52 | }
53 |
54 | return aImport
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/BinaryDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BinaryDisposable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 6/12/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents two disposable resources that are disposed together.
10 | private final class BinaryDisposable : DisposeBase, Cancelable {
11 |
12 | private var _isDisposed: AtomicInt = 0
13 |
14 | // state
15 | private var _disposable1: Disposable?
16 | private var _disposable2: Disposable?
17 |
18 | /// - returns: Was resource disposed.
19 | var isDisposed: Bool {
20 | return _isDisposed > 0
21 | }
22 |
23 | /// Constructs new binary disposable from two disposables.
24 | ///
25 | /// - parameter disposable1: First disposable
26 | /// - parameter disposable2: Second disposable
27 | init(_ disposable1: Disposable, _ disposable2: Disposable) {
28 | _disposable1 = disposable1
29 | _disposable2 = disposable2
30 | super.init()
31 | }
32 |
33 | /// Calls the disposal action if and only if the current instance hasn't been disposed yet.
34 | ///
35 | /// After invoking disposal action, disposal action will be dereferenced.
36 | func dispose() {
37 | if AtomicCompareAndSwap(0, 1, &_isDisposed) {
38 | _disposable1?.dispose()
39 | _disposable2?.dispose()
40 | _disposable1 = nil
41 | _disposable2 = nil
42 | }
43 | }
44 | }
45 |
46 | extension Disposables {
47 |
48 | /// Creates a disposable with the given disposables.
49 | public static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Cancelable {
50 | return BinaryDisposable(disposable1, disposable2)
51 | }
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Sequence.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Sequence.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 11/14/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class ObservableSequenceSink : Sink where S.Iterator.Element == O.E {
10 | typealias Parent = ObservableSequence
11 |
12 | private let _parent: Parent
13 |
14 | init(parent: Parent, observer: O, cancel: Cancelable) {
15 | _parent = parent
16 | super.init(observer: observer, cancel: cancel)
17 | }
18 |
19 | func run() -> Disposable {
20 | return _parent._scheduler.scheduleRecursive((_parent._elements.makeIterator(), _parent._elements)) { (iterator, recurse) in
21 | var mutableIterator = iterator
22 | if let next = mutableIterator.0.next() {
23 | self.forwardOn(.next(next))
24 | recurse(mutableIterator)
25 | }
26 | else {
27 | self.forwardOn(.completed)
28 | self.dispose()
29 | }
30 | }
31 | }
32 | }
33 |
34 | final class ObservableSequence : Producer {
35 | fileprivate let _elements: S
36 | fileprivate let _scheduler: ImmediateSchedulerType
37 |
38 | init(elements: S, scheduler: ImmediateSchedulerType) {
39 | _elements = elements
40 | _scheduler = scheduler
41 | }
42 |
43 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
44 | let sink = ObservableSequenceSink(parent: self, observer: observer, cancel: cancel)
45 | let subscription = sink.run()
46 | return (sink: sink, subscription: subscription)
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/ObservableType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObservableType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 8/8/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents a push style sequence.
10 | public protocol ObservableType : ObservableConvertibleType {
11 | /// Type of elements in sequence.
12 | associatedtype E
13 |
14 | /**
15 | Subscribes `observer` to receive events for this sequence.
16 |
17 | ### Grammar
18 |
19 | **Next\* (Error | Completed)?**
20 |
21 | * sequences can produce zero or more elements so zero or more `Next` events can be sent to `observer`
22 | * once an `Error` or `Completed` event is sent, the sequence terminates and can't produce any other elements
23 |
24 | It is possible that events are sent from different threads, but no two events can be sent concurrently to
25 | `observer`.
26 |
27 | ### Resource Management
28 |
29 | When sequence sends `Complete` or `Error` event all internal resources that compute sequence elements
30 | will be freed.
31 |
32 | To cancel production of sequence elements and free resources immediatelly, call `dispose` on returned
33 | subscription.
34 |
35 | - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources.
36 | */
37 | func subscribe(_ observer: O) -> Disposable where O.E == E
38 | }
39 |
40 | extension ObservableType {
41 |
42 | /// Default implementation of converting `ObservableType` to `Observable`.
43 | public func asObservable() -> Observable {
44 | // temporary workaround
45 | //return Observable.create(subscribe: self.subscribe)
46 | return Observable.create { o in
47 | return self.subscribe(o)
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Deferred.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Deferred.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 4/19/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class DeferredSink : Sink, ObserverType where S.E == O.E {
10 | typealias E = O.E
11 |
12 | private let _observableFactory: () throws -> S
13 |
14 | init(observableFactory: @escaping () throws -> S, observer: O, cancel: Cancelable) {
15 | _observableFactory = observableFactory
16 | super.init(observer: observer, cancel: cancel)
17 | }
18 |
19 | func run() -> Disposable {
20 | do {
21 | let result = try _observableFactory()
22 | return result.subscribe(self)
23 | }
24 | catch let e {
25 | forwardOn(.error(e))
26 | dispose()
27 | return Disposables.create()
28 | }
29 | }
30 |
31 | func on(_ event: Event) {
32 | forwardOn(event)
33 |
34 | switch event {
35 | case .next:
36 | break
37 | case .error:
38 | dispose()
39 | case .completed:
40 | dispose()
41 | }
42 | }
43 | }
44 |
45 | final class Deferred : Producer {
46 | typealias Factory = () throws -> S
47 |
48 | private let _observableFactory : Factory
49 |
50 | init(observableFactory: @escaping Factory) {
51 | _observableFactory = observableFactory
52 | }
53 |
54 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E {
55 | let sink = DeferredSink(observableFactory: _observableFactory, observer: observer, cancel: cancel)
56 | let subscription = sink.run()
57 | return (sink: sink, subscription: subscription)
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Range.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Range.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 9/13/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class RangeProducer : Producer {
10 | fileprivate let _start: E
11 | fileprivate let _count: E
12 | fileprivate let _scheduler: ImmediateSchedulerType
13 |
14 | init(start: E, count: E, scheduler: ImmediateSchedulerType) {
15 | if count < 0 {
16 | rxFatalError("count can't be negative")
17 | }
18 |
19 | if start &+ (count - 1) < start {
20 | rxFatalError("overflow of count")
21 | }
22 |
23 | _start = start
24 | _count = count
25 | _scheduler = scheduler
26 | }
27 |
28 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
29 | let sink = RangeSink(parent: self, observer: observer, cancel: cancel)
30 | let subscription = sink.run()
31 | return (sink: sink, subscription: subscription)
32 | }
33 | }
34 |
35 | final class RangeSink : Sink where O.E: SignedInteger {
36 | typealias Parent = RangeProducer
37 |
38 | private let _parent: Parent
39 |
40 | init(parent: Parent, observer: O, cancel: Cancelable) {
41 | _parent = parent
42 | super.init(observer: observer, cancel: cancel)
43 | }
44 |
45 | func run() -> Disposable {
46 | return _parent._scheduler.scheduleRecursive(0 as O.E) { i, recurse in
47 | if i < self._parent._count {
48 | self.forwardOn(.next(self._parent._start + i))
49 | recurse(i + 1)
50 | }
51 | else {
52 | self.forwardOn(.completed)
53 | self.dispose()
54 | }
55 | }
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Filter.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Filter.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/17/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class FilterSink: Sink, ObserverType {
10 | typealias Predicate = (Element) throws -> Bool
11 | typealias Element = O.E
12 |
13 | private let _predicate: Predicate
14 |
15 | init(predicate: @escaping Predicate, observer: O, cancel: Cancelable) {
16 | _predicate = predicate
17 | super.init(observer: observer, cancel: cancel)
18 | }
19 |
20 | func on(_ event: Event) {
21 | switch event {
22 | case .next(let value):
23 | do {
24 | let satisfies = try _predicate(value)
25 | if satisfies {
26 | forwardOn(.next(value))
27 | }
28 | }
29 | catch let e {
30 | forwardOn(.error(e))
31 | dispose()
32 | }
33 | case .completed, .error:
34 | forwardOn(event)
35 | dispose()
36 | }
37 | }
38 | }
39 |
40 | final class Filter : Producer {
41 | typealias Predicate = (Element) throws -> Bool
42 |
43 | private let _source: Observable
44 | private let _predicate: Predicate
45 |
46 | init(source: Observable, predicate: @escaping Predicate) {
47 | _source = source
48 | _predicate = predicate
49 | }
50 |
51 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
52 | let sink = FilterSink(predicate: _predicate, observer: observer, cancel: cancel)
53 | let subscription = _source.subscribe(sink)
54 | return (sink: sink, subscription: subscription)
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/TakeLast.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TakeLast.swift
3 | // RxSwift
4 | //
5 | // Created by Tomi Koskinen on 25/10/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class TakeLastSink : Sink, ObserverType {
10 | typealias E = O.E
11 | typealias Parent = TakeLast
12 |
13 | private let _parent: Parent
14 |
15 | private var _elements: Queue
16 |
17 | init(parent: Parent, observer: O, cancel: Cancelable) {
18 | _parent = parent
19 | _elements = Queue(capacity: parent._count + 1)
20 | super.init(observer: observer, cancel: cancel)
21 | }
22 |
23 | func on(_ event: Event) {
24 | switch event {
25 | case .next(let value):
26 | _elements.enqueue(value)
27 | if _elements.count > self._parent._count {
28 | let _ = _elements.dequeue()
29 | }
30 | case .error:
31 | forwardOn(event)
32 | dispose()
33 | case .completed:
34 | for e in _elements {
35 | forwardOn(.next(e))
36 | }
37 | forwardOn(.completed)
38 | dispose()
39 | }
40 | }
41 | }
42 |
43 | final class TakeLast: Producer {
44 | fileprivate let _source: Observable
45 | fileprivate let _count: Int
46 |
47 | init(source: Observable, count: Int) {
48 | if count < 0 {
49 | rxFatalError("count can't be negative")
50 | }
51 | _source = source
52 | _count = count
53 | }
54 |
55 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
56 | let sink = TakeLastSink(parent: self, observer: observer, cancel: cancel)
57 | let subscription = _source.subscribe(sink)
58 | return (sink: sink, subscription: subscription)
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/OperationQueueScheduler.swift:
--------------------------------------------------------------------------------
1 | //
2 | // OperationQueueScheduler.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 4/4/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import class Foundation.OperationQueue
10 | import class Foundation.BlockOperation
11 | import Dispatch
12 |
13 | /// Abstracts the work that needs to be performed on a specific `NSOperationQueue`.
14 | ///
15 | /// This scheduler is suitable for cases when there is some bigger chunk of work that needs to be performed in background and you want to fine tune concurrent processing using `maxConcurrentOperationCount`.
16 | public class OperationQueueScheduler: ImmediateSchedulerType {
17 | public let operationQueue: OperationQueue
18 |
19 | /// Constructs new instance of `OperationQueueScheduler` that performs work on `operationQueue`.
20 | ///
21 | /// - parameter operationQueue: Operation queue targeted to perform work on.
22 | public init(operationQueue: OperationQueue) {
23 | self.operationQueue = operationQueue
24 | }
25 |
26 | /**
27 | Schedules an action to be executed recursively.
28 |
29 | - parameter state: State passed to the action to be executed.
30 | - parameter action: Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.
31 | - returns: The disposable object used to cancel the scheduled action (best effort).
32 | */
33 | public func schedule(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {
34 | let cancel = SingleAssignmentDisposable()
35 |
36 | let operation = BlockOperation {
37 | if cancel.isDisposed {
38 | return
39 | }
40 |
41 |
42 | cancel.setDisposable(action(state))
43 | }
44 |
45 | self.operationQueue.addOperation(operation)
46 |
47 | return cancel
48 | }
49 |
50 | }
51 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Just.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Just.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 8/30/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class JustScheduledSink : Sink {
10 | typealias Parent = JustScheduled
11 |
12 | private let _parent: Parent
13 |
14 | init(parent: Parent, observer: O, cancel: Cancelable) {
15 | _parent = parent
16 | super.init(observer: observer, cancel: cancel)
17 | }
18 |
19 | func run() -> Disposable {
20 | let scheduler = _parent._scheduler
21 | return scheduler.schedule(_parent._element) { element in
22 | self.forwardOn(.next(element))
23 | return scheduler.schedule(()) { _ in
24 | self.forwardOn(.completed)
25 | self.dispose()
26 | return Disposables.create()
27 | }
28 | }
29 | }
30 | }
31 |
32 | final class JustScheduled : Producer {
33 | fileprivate let _scheduler: ImmediateSchedulerType
34 | fileprivate let _element: Element
35 |
36 | init(element: Element, scheduler: ImmediateSchedulerType) {
37 | _scheduler = scheduler
38 | _element = element
39 | }
40 |
41 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
42 | let sink = JustScheduledSink(parent: self, observer: observer, cancel: cancel)
43 | let subscription = sink.run()
44 | return (sink: sink, subscription: subscription)
45 | }
46 | }
47 |
48 | final class Just : Producer {
49 | private let _element: Element
50 |
51 | init(element: Element) {
52 | _element = element
53 | }
54 |
55 | override func subscribe(_ observer: O) -> Disposable where O.E == Element {
56 | observer.on(.next(_element))
57 | observer.on(.completed)
58 | return Disposables.create()
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/smck/Parser/JSLexer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // JSLexer.swift
3 | // smck
4 | //
5 | // Created by DaiMing on 2017/5/2.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class JSLexer {
12 | let input: String
13 | var index: String.Index
14 |
15 | init(input: String) {
16 | //
17 | self.input = input
18 | self.index = input.startIndex
19 | }
20 |
21 | public func lex() -> [String] {
22 | var tks = [String]()
23 | while let tk = advanceToNextToken() {
24 | if tk == " " || tk == "" {
25 | } else {
26 | tks.append(tk)
27 | }
28 | }
29 | return tks
30 | }
31 |
32 | func advanceToNextToken() -> String? {
33 | //末尾检测
34 | guard currentChar != nil else {
35 | return nil
36 | }
37 | let keyMap = [JSSb.rBktL,JSSb.rBktR,JSSb.bktL,JSSb.bktR,JSSb.braceL,JSSb.braceR,JSSb.comma,JSSb.colon,JSSb.dot,JSSb.add,JSSb.minus,JSSb.tilde,JSSb.excMk,JSSb.asterisk,JSSb.percent,JSSb.agBktL,JSSb.equal,JSSb.and,JSSb.upArrow,JSSb.pipe,JSSb.qM,JSSb.semicolon," "]
38 | let currentStr = currentChar?.description
39 | var str = ""
40 | var quite = false
41 |
42 | if keyMap.contains(currentStr!) {
43 | advanceIndex()
44 | return currentStr!
45 | } else {
46 | while let char = currentChar, !quite {
47 | let charStr = char.description
48 | if keyMap.contains(charStr) {
49 | quite = true
50 | } else {
51 | str.characters.append(char)
52 | advanceIndex()
53 | }
54 | }
55 | return str
56 | }
57 | }
58 |
59 | /*-----------*/
60 | var currentChar: Character? {
61 | return index < input.endIndex ? input[index] : nil
62 | }
63 | func advanceIndex() {
64 | input.characters.formIndex(after: &index)
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Rx.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/14/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if TRACE_RESOURCES
10 | fileprivate var resourceCount: AtomicInt = 0
11 |
12 | /// Resource utilization information
13 | public struct Resources {
14 | /// Counts internal Rx resource allocations (Observables, Observers, Disposables, etc.). This provides a simple way to detect leaks during development.
15 | public static var total: Int32 {
16 | return resourceCount.valueSnapshot()
17 | }
18 |
19 | /// Increments `Resources.total` resource count.
20 | ///
21 | /// - returns: New resource count
22 | public static func incrementTotal() -> Int32 {
23 | return AtomicIncrement(&resourceCount)
24 | }
25 |
26 | /// Decrements `Resources.total` resource count
27 | ///
28 | /// - returns: New resource count
29 | public static func decrementTotal() -> Int32 {
30 | return AtomicDecrement(&resourceCount)
31 | }
32 | }
33 | #endif
34 |
35 | /// Swift does not implement abstract methods. This method is used as a runtime check to ensure that methods which intended to be abstract (i.e., they should be implemented in subclasses) are not called directly on the superclass.
36 | func abstractMethod() -> Swift.Never {
37 | rxFatalError("Abstract method")
38 | }
39 |
40 | func rxFatalError(_ lastMessage: String) -> Swift.Never {
41 | // The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours.
42 | fatalError(lastMessage)
43 | }
44 |
45 | func incrementChecked(_ i: inout Int) throws -> Int {
46 | if i == Int.max {
47 | throw RxError.overflow
48 | }
49 | defer { i += 1 }
50 | return i
51 | }
52 |
53 | func decrementChecked(_ i: inout Int) throws -> Int {
54 | if i == Int.min {
55 | throw RxError.overflow
56 | }
57 | defer { i -= 1 }
58 | return i
59 | }
60 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Concat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Concat.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/21/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 |
10 | final class ConcatSink
11 | : TailRecursiveSink
12 | , ObserverType where S.Iterator.Element : ObservableConvertibleType, S.Iterator.Element.E == O.E {
13 | typealias Element = O.E
14 |
15 | override init(observer: O, cancel: Cancelable) {
16 | super.init(observer: observer, cancel: cancel)
17 | }
18 |
19 | func on(_ event: Event){
20 | switch event {
21 | case .next:
22 | forwardOn(event)
23 | case .error:
24 | forwardOn(event)
25 | dispose()
26 | case .completed:
27 | schedule(.moveNext)
28 | }
29 | }
30 |
31 | override func subscribeToNext(_ source: Observable) -> Disposable {
32 | return source.subscribe(self)
33 | }
34 |
35 | override func extract(_ observable: Observable) -> SequenceGenerator? {
36 | if let source = observable as? Concat {
37 | return (source._sources.makeIterator(), source._count)
38 | }
39 | else {
40 | return nil
41 | }
42 | }
43 | }
44 |
45 | final class Concat : Producer where S.Iterator.Element : ObservableConvertibleType {
46 | typealias Element = S.Iterator.Element.E
47 |
48 | fileprivate let _sources: S
49 | fileprivate let _count: IntMax?
50 |
51 | init(sources: S, count: IntMax?) {
52 | _sources = sources
53 | _count = count
54 | }
55 |
56 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
57 | let sink = ConcatSink(observer: observer, cancel: cancel)
58 | let subscription = sink.run((_sources.makeIterator(), _count))
59 | return (sink: sink, subscription: subscription)
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Reactive.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Reactive.swift
3 | // RxSwift
4 | //
5 | // Created by Yury Korolev on 5/2/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /**
10 | Use `Reactive` proxy as customization point for constrained protocol extensions.
11 |
12 | General pattern would be:
13 |
14 | // 1. Extend Reactive protocol with constrain on Base
15 | // Read as: Reactive Extension where Base is a SomeType
16 | extension Reactive where Base: SomeType {
17 | // 2. Put any specific reactive extension for SomeType here
18 | }
19 |
20 | With this approach we can have more specialized methods and properties using
21 | `Base` and not just specialized on common base type.
22 |
23 | */
24 |
25 | public struct Reactive {
26 | /// Base object to extend.
27 | public let base: Base
28 |
29 | /// Creates extensions with base object.
30 | ///
31 | /// - parameter base: Base object.
32 | public init(_ base: Base) {
33 | self.base = base
34 | }
35 | }
36 |
37 | /// A type that has reactive extensions.
38 | public protocol ReactiveCompatible {
39 | /// Extended type
40 | associatedtype CompatibleType
41 |
42 | /// Reactive extensions.
43 | static var rx: Reactive.Type { get set }
44 |
45 | /// Reactive extensions.
46 | var rx: Reactive { get set }
47 | }
48 |
49 | extension ReactiveCompatible {
50 | /// Reactive extensions.
51 | public static var rx: Reactive.Type {
52 | get {
53 | return Reactive.self
54 | }
55 | set {
56 | // this enables using Reactive to "mutate" base type
57 | }
58 | }
59 |
60 | /// Reactive extensions.
61 | public var rx: Reactive {
62 | get {
63 | return Reactive(self)
64 | }
65 | set {
66 | // this enables using Reactive to "mutate" base object
67 | }
68 | }
69 | }
70 |
71 | import class Foundation.NSObject
72 |
73 | /// Extend NSObject with `rx` proxy.
74 | extension NSObject: ReactiveCompatible { }
75 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Do.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Do.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/21/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class DoSink : Sink, ObserverType {
10 | typealias Element = O.E
11 | typealias Parent = Do
12 |
13 | private let _parent: Parent
14 |
15 | init(parent: Parent, observer: O, cancel: Cancelable) {
16 | _parent = parent
17 | super.init(observer: observer, cancel: cancel)
18 | }
19 |
20 | func on(_ event: Event) {
21 | do {
22 | try _parent._eventHandler(event)
23 | forwardOn(event)
24 | if event.isStopEvent {
25 | dispose()
26 | }
27 | }
28 | catch let error {
29 | forwardOn(.error(error))
30 | dispose()
31 | }
32 | }
33 | }
34 |
35 | final class Do : Producer {
36 | typealias EventHandler = (Event) throws -> Void
37 |
38 | fileprivate let _source: Observable
39 | fileprivate let _eventHandler: EventHandler
40 | fileprivate let _onSubscribe: (() -> ())?
41 | fileprivate let _onDispose: (() -> ())?
42 |
43 | init(source: Observable, eventHandler: @escaping EventHandler, onSubscribe: (() -> ())?, onDispose: (() -> ())?) {
44 | _source = source
45 | _eventHandler = eventHandler
46 | _onSubscribe = onSubscribe
47 | _onDispose = onDispose
48 | }
49 |
50 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
51 | _onSubscribe?()
52 | let sink = DoSink(parent: self, observer: observer, cancel: cancel)
53 | let subscription = _source.subscribe(sink)
54 | let onDispose = _onDispose
55 | let allSubscriptions = Disposables.create {
56 | subscription.dispose()
57 | onDispose?()
58 | }
59 | return (sink: sink, subscription: allSubscriptions)
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Sink.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Sink.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/19/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | class Sink : Disposable {
10 | fileprivate let _observer: O
11 | fileprivate let _cancel: Cancelable
12 | fileprivate var _disposed: Bool
13 |
14 | #if DEBUG
15 | fileprivate var _numberOfConcurrentCalls: AtomicInt = 0
16 | #endif
17 |
18 | init(observer: O, cancel: Cancelable) {
19 | #if TRACE_RESOURCES
20 | let _ = Resources.incrementTotal()
21 | #endif
22 | _observer = observer
23 | _cancel = cancel
24 | _disposed = false
25 | }
26 |
27 | final func forwardOn(_ event: Event) {
28 | #if DEBUG
29 | if AtomicIncrement(&_numberOfConcurrentCalls) > 1 {
30 | rxFatalError("Warning: Recursive call or synchronization error!")
31 | }
32 |
33 | defer {
34 | _ = AtomicDecrement(&_numberOfConcurrentCalls)
35 | }
36 | #endif
37 | if _disposed {
38 | return
39 | }
40 | _observer.on(event)
41 | }
42 |
43 | final func forwarder() -> SinkForward {
44 | return SinkForward(forward: self)
45 | }
46 |
47 | final var disposed: Bool {
48 | return _disposed
49 | }
50 |
51 | func dispose() {
52 | _disposed = true
53 | _cancel.dispose()
54 | }
55 |
56 | deinit {
57 | #if TRACE_RESOURCES
58 | let _ = Resources.decrementTotal()
59 | #endif
60 | }
61 | }
62 |
63 | final class SinkForward: ObserverType {
64 | typealias E = O.E
65 |
66 | private let _forward: Sink
67 |
68 | init(forward: Sink) {
69 | _forward = forward
70 | }
71 |
72 | final func on(_ event: Event) {
73 | switch event {
74 | case .next:
75 | _forward._observer.on(event)
76 | case .error, .completed:
77 | _forward._observer.on(event)
78 | _forward._cancel.dispose()
79 | }
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/SubscribeOn.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SubscribeOn.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 6/14/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class SubscribeOnSink : Sink, ObserverType where Ob.E == O.E {
10 | typealias Element = O.E
11 | typealias Parent = SubscribeOn
12 |
13 | let parent: Parent
14 |
15 | init(parent: Parent, observer: O, cancel: Cancelable) {
16 | self.parent = parent
17 | super.init(observer: observer, cancel: cancel)
18 | }
19 |
20 | func on(_ event: Event) {
21 | forwardOn(event)
22 |
23 | if event.isStopEvent {
24 | self.dispose()
25 | }
26 | }
27 |
28 | func run() -> Disposable {
29 | let disposeEverything = SerialDisposable()
30 | let cancelSchedule = SingleAssignmentDisposable()
31 |
32 | disposeEverything.disposable = cancelSchedule
33 |
34 | let disposeSchedule = parent.scheduler.schedule(()) { (_) -> Disposable in
35 | let subscription = self.parent.source.subscribe(self)
36 | disposeEverything.disposable = ScheduledDisposable(scheduler: self.parent.scheduler, disposable: subscription)
37 | return Disposables.create()
38 | }
39 |
40 | cancelSchedule.setDisposable(disposeSchedule)
41 |
42 | return disposeEverything
43 | }
44 | }
45 |
46 | final class SubscribeOn : Producer {
47 | let source: Ob
48 | let scheduler: ImmediateSchedulerType
49 |
50 | init(source: Ob, scheduler: ImmediateSchedulerType) {
51 | self.source = source
52 | self.scheduler = scheduler
53 | }
54 |
55 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Ob.E {
56 | let sink = SubscribeOnSink(parent: self, observer: observer, cancel: cancel)
57 | let subscription = sink.run()
58 | return (sink: sink, subscription: subscription)
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/AnonymousDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnonymousDisposable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/15/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents an Action-based disposable.
10 | ///
11 | /// When dispose method is called, disposal action will be dereferenced.
12 | fileprivate final class AnonymousDisposable : DisposeBase, Cancelable {
13 | public typealias DisposeAction = () -> Void
14 |
15 | private var _isDisposed: AtomicInt = 0
16 | private var _disposeAction: DisposeAction?
17 |
18 | /// - returns: Was resource disposed.
19 | public var isDisposed: Bool {
20 | return _isDisposed == 1
21 | }
22 |
23 | /// Constructs a new disposable with the given action used for disposal.
24 | ///
25 | /// - parameter disposeAction: Disposal action which will be run upon calling `dispose`.
26 | fileprivate init(_ disposeAction: @escaping DisposeAction) {
27 | _disposeAction = disposeAction
28 | super.init()
29 | }
30 |
31 | // Non-deprecated version of the constructor, used by `Disposables.create(with:)`
32 | fileprivate init(disposeAction: @escaping DisposeAction) {
33 | _disposeAction = disposeAction
34 | super.init()
35 | }
36 |
37 | /// Calls the disposal action if and only if the current instance hasn't been disposed yet.
38 | ///
39 | /// After invoking disposal action, disposal action will be dereferenced.
40 | fileprivate func dispose() {
41 | if AtomicCompareAndSwap(0, 1, &_isDisposed) {
42 | assert(_isDisposed == 1)
43 |
44 | if let action = _disposeAction {
45 | _disposeAction = nil
46 | action()
47 | }
48 | }
49 | }
50 | }
51 |
52 | extension Disposables {
53 |
54 | /// Constructs a new disposable with the given action used for disposal.
55 | ///
56 | /// - parameter dispose: Disposal action which will be run upon calling `dispose`.
57 | public static func create(with dispose: @escaping () -> ()) -> Cancelable {
58 | return AnonymousDisposable(disposeAction: dispose)
59 | }
60 |
61 | }
62 |
--------------------------------------------------------------------------------
/smck/Parser/SMLangAST.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HtmlAST.swift
3 | // smck
4 | //
5 | // Created by Daiming on 2017/4/13.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | /*
12 | grammer Backus–Naur form(BNF) https://en.wikipedia.org/wiki/Backus-Naur_form
13 | ::= "(" ")"
14 | ::= | ,
15 | ::= "def" ";"
16 | ::= "extern" ";"
17 | ::= "+" | "-" | "*" | "/" | "%"
18 | ::= | | | | | "(" ")"
19 | ::=
20 | ::= "(" ")"
21 | ::= "if" "then" "else"
22 | ::= | ","
23 | */
24 |
25 | struct SMLangPrototype {
26 | let name: String
27 | let params: [String]
28 | }
29 |
30 | indirect enum SMLangExpr {
31 | case number(Double)
32 | case variable(String)
33 | case binary(SMLangExpr, SMLangBinaryOperator, SMLangExpr)
34 | case call(String, [SMLangExpr])
35 | case ifelse(SMLangExpr, SMLangExpr, SMLangExpr)
36 | }
37 |
38 | struct SMLangDefinition {
39 | let prototype: SMLangPrototype
40 | let expr: SMLangExpr
41 | }
42 |
43 | class SMLangFile {
44 | private(set) var externs = [SMLangPrototype]()
45 | private(set) var definitions = [SMLangDefinition]()
46 | private(set) var expressions = [SMLangExpr]()
47 | private(set) var prototypeMap = [String: SMLangPrototype]()
48 |
49 | func prototype(name:String) -> SMLangPrototype? {
50 | return prototypeMap[name]
51 | }
52 |
53 | func addExpression(_ expression:SMLangExpr) {
54 | expressions.append(expression)
55 | }
56 |
57 | func addExtern(_ prototype:SMLangPrototype) {
58 | externs.append(prototype)
59 | prototypeMap[prototype.name] = prototype
60 | }
61 |
62 | func addDefinition(_ definition:SMLangDefinition) {
63 | definitions.append(definition)
64 | prototypeMap[definition.prototype.name] = definition.prototype
65 | }
66 |
67 | }
68 |
69 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Scan.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Scan.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 6/14/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class ScanSink : Sink, ObserverType {
10 | typealias Accumulate = O.E
11 | typealias Parent = Scan
12 | typealias E = ElementType
13 |
14 | fileprivate let _parent: Parent
15 | fileprivate var _accumulate: Accumulate
16 |
17 | init(parent: Parent, observer: O, cancel: Cancelable) {
18 | _parent = parent
19 | _accumulate = parent._seed
20 | super.init(observer: observer, cancel: cancel)
21 | }
22 |
23 | func on(_ event: Event) {
24 | switch event {
25 | case .next(let element):
26 | do {
27 | _accumulate = try _parent._accumulator(_accumulate, element)
28 | forwardOn(.next(_accumulate))
29 | }
30 | catch let error {
31 | forwardOn(.error(error))
32 | dispose()
33 | }
34 | case .error(let error):
35 | forwardOn(.error(error))
36 | dispose()
37 | case .completed:
38 | forwardOn(.completed)
39 | dispose()
40 | }
41 | }
42 |
43 | }
44 |
45 | final class Scan: Producer {
46 | typealias Accumulator = (Accumulate, Element) throws -> Accumulate
47 |
48 | fileprivate let _source: Observable
49 | fileprivate let _seed: Accumulate
50 | fileprivate let _accumulator: Accumulator
51 |
52 | init(source: Observable, seed: Accumulate, accumulator: @escaping Accumulator) {
53 | _source = source
54 | _seed = seed
55 | _accumulator = accumulator
56 | }
57 |
58 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Accumulate {
59 | let sink = ScanSink(parent: self, observer: observer, cancel: cancel)
60 | let subscription = _source.subscribe(sink)
61 | return (sink: sink, subscription: subscription)
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/AnonymousObservable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnonymousObservable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class AnonymousObservableSink : Sink, ObserverType {
10 | typealias E = O.E
11 | typealias Parent = AnonymousObservable
12 |
13 | // state
14 | private var _isStopped: AtomicInt = 0
15 |
16 | #if DEBUG
17 | fileprivate var _numberOfConcurrentCalls: AtomicInt = 0
18 | #endif
19 |
20 | override init(observer: O, cancel: Cancelable) {
21 | super.init(observer: observer, cancel: cancel)
22 | }
23 |
24 | func on(_ event: Event) {
25 | #if DEBUG
26 | if AtomicIncrement(&_numberOfConcurrentCalls) > 1 {
27 | rxFatalError("Warning: Recursive call or synchronization error!")
28 | }
29 |
30 | defer {
31 | _ = AtomicDecrement(&_numberOfConcurrentCalls)
32 | }
33 | #endif
34 | switch event {
35 | case .next:
36 | if _isStopped == 1 {
37 | return
38 | }
39 | forwardOn(event)
40 | case .error, .completed:
41 | if AtomicCompareAndSwap(0, 1, &_isStopped) {
42 | forwardOn(event)
43 | dispose()
44 | }
45 | }
46 | }
47 |
48 | func run(_ parent: Parent) -> Disposable {
49 | return parent._subscribeHandler(AnyObserver(self))
50 | }
51 | }
52 |
53 | final class AnonymousObservable : Producer {
54 | typealias SubscribeHandler = (AnyObserver) -> Disposable
55 |
56 | let _subscribeHandler: SubscribeHandler
57 |
58 | init(_ subscribeHandler: @escaping SubscribeHandler) {
59 | _subscribeHandler = subscribeHandler
60 | }
61 |
62 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
63 | let sink = AnonymousObservableSink(observer: observer, cancel: cancel)
64 | let subscription = sink.run(self)
65 | return (sink: sink, subscription: subscription)
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/smck/Console/Console.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ConsoleIO.swift
3 | // SMCheckProjectCL
4 | //
5 | // Created by daiming on 2017/3/6.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | enum OutputType {
12 | case error
13 | case standard
14 | case description
15 | }
16 |
17 | enum OptionType: String {
18 | case seekFile = "s" //列出文件夹下的所有文件
19 | case unUseMethods = "m" //列出文件夹下没有用到的函数
20 | case unUseObject = "o" //列出无用类
21 | case h5ToSwift = "h2s" //将h5转swift
22 | case help = "h" //查看帮助
23 | case quit = "q" //退出互动操作
24 | case unknown
25 |
26 | init(value: String) {
27 | switch value {
28 | case "s":
29 | self = .seekFile
30 | case "m":
31 | self = .unUseMethods
32 | case "o":
33 | self = .unUseObject
34 | case "h2s":
35 | self = .h5ToSwift
36 | case "h":
37 | self = .help
38 | case "q":
39 | self = .quit
40 | default:
41 | self = .unknown
42 | }
43 | }
44 | }
45 |
46 | class Console {
47 | class func printUsage() {
48 | let exName = (CommandLine.arguments[0] as NSString).lastPathComponent
49 |
50 | print("Usage:")
51 | print("\(exName) -f filePath like /")
52 | print("\(exName) -h more infomation")
53 | }
54 |
55 | class func getInput() -> String {
56 | let keyboard = FileHandle.standardInput
57 | let inputData = keyboard.availableData
58 | let strData = String(data:inputData, encoding:String.Encoding.utf8)!
59 | return strData.trimmingCharacters(in: CharacterSet.newlines)
60 | }
61 |
62 | class func outPrint(_ message: String, to: OutputType = .standard) {
63 | switch to {
64 | case .standard:
65 | print("\(message)")
66 | case .description:
67 | print("😈 \(message)")
68 | case .error:
69 | print("😱 \(message)\n", stderr)
70 | }
71 | }
72 |
73 | class func getOption(_ option: String) -> (option:OptionType, value:String) {
74 | return (OptionType(value:option),option)
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Variable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Variable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/28/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Variable is a wrapper for `BehaviorSubject`.
10 | ///
11 | /// Unlike `BehaviorSubject` it can't terminate with error, and when variable is deallocated
12 | /// it will complete it's observable sequence (`asObservable`).
13 | public final class Variable {
14 |
15 | public typealias E = Element
16 |
17 | private let _subject: BehaviorSubject
18 |
19 | private var _lock = SpinLock()
20 |
21 | // state
22 | private var _value: E
23 |
24 | #if DEBUG
25 | fileprivate var _numberOfConcurrentCalls: AtomicInt = 0
26 | #endif
27 |
28 | /// Gets or sets current value of variable.
29 | ///
30 | /// Whenever a new value is set, all the observers are notified of the change.
31 | ///
32 | /// Even if the newly set value is same as the old value, observers are still notified for change.
33 | public var value: E {
34 | get {
35 | _lock.lock(); defer { _lock.unlock() }
36 | return _value
37 | }
38 | set(newValue) {
39 | #if DEBUG
40 | if AtomicIncrement(&_numberOfConcurrentCalls) > 1 {
41 | rxFatalError("Warning: Recursive call or synchronization error!")
42 | }
43 |
44 | defer {
45 | _ = AtomicDecrement(&_numberOfConcurrentCalls)
46 | }
47 | #endif
48 | _lock.lock()
49 | _value = newValue
50 | _lock.unlock()
51 |
52 | _subject.on(.next(newValue))
53 | }
54 | }
55 |
56 | /// Initializes variable with initial value.
57 | ///
58 | /// - parameter value: Initial variable value.
59 | public init(_ value: Element) {
60 | _value = value
61 | _subject = BehaviorSubject(value: value)
62 | }
63 |
64 | /// - returns: Canonical interface for push style sequence
65 | public func asObservable() -> Observable {
66 | return _subject
67 | }
68 |
69 | deinit {
70 | _subject.on(.completed)
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/smck/Parser/CSSLexer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CSSLexer.swift
3 | // smck
4 | //
5 | // Created by DaiMing on 2017/4/19.
6 | // Copyright © 2017年 Starming. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class CSSLexer {
12 | let input: String
13 | var index: String.Index
14 |
15 | init(input:String) {
16 | var newStr = ""
17 | let annotationBlockPattern = "/\\*[\\s\\S]*?\\*/" //匹配/*...*/这样的注释
18 | let regexBlock = try! NSRegularExpression(pattern: annotationBlockPattern, options: NSRegularExpression.Options(rawValue:0))
19 | newStr = regexBlock.stringByReplacingMatches(in: input, options: NSRegularExpression.MatchingOptions(rawValue:0), range: NSMakeRange(0, input.characters.count), withTemplate: Sb.space)
20 | self.input = newStr
21 | self.index = newStr.startIndex
22 | }
23 |
24 | public func lex() -> [String] {
25 | var tks = [String]()
26 | while let tk = advanceToNextToken() {
27 | if tk == CSSSb.space || tk == CSSSb.empty {
28 | } else {
29 | tks.append(tk)
30 | }
31 | }
32 | return tks
33 | }
34 |
35 | func advanceToNextToken() -> String? {
36 | //检测尾
37 | guard currentChar != nil else {
38 | return nil
39 | }
40 | let keyMap = [CSSSb.braceL, CSSSb.braceR, CSSSb.pSign, CSSSb.dot, CSSSb.semicolon, CSSSb.colon, CSSSb.rBktL, CSSSb.rBktR, CSSSb.space]
41 | let currentStr = currentChar?.description
42 | var str = ""
43 | if keyMap.contains(currentStr!) {
44 | advanceIndex()
45 | return currentStr
46 | } else {
47 | while let charStr = currentChar?.description, !keyMap.contains(charStr) {
48 | str.append(charStr)
49 | advanceIndex()
50 | }
51 | return str
52 | }
53 |
54 |
55 | }
56 |
57 | /*---------------*/
58 | var currentChar: Character? {
59 | return index < input.endIndex ? input[index] : nil
60 | }
61 | func advanceIndex() {
62 | input.characters.formIndex(after: &index)
63 | }
64 | func advanceSpace() {
65 | while let char = currentChar, char.isSpace {
66 | advanceIndex()
67 | }
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Observable+Concurrency.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Observable+Concurrency.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/15/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | // MARK: observeOn
10 |
11 | extension ObservableType {
12 |
13 | /**
14 | Wraps the source sequence in order to run its observer callbacks on the specified scheduler.
15 |
16 | This only invokes observer callbacks on a `scheduler`. In case the subscription and/or unsubscription
17 | actions have side-effects that require to be run on a scheduler, use `subscribeOn`.
18 |
19 | - seealso: [observeOn operator on reactivex.io](http://reactivex.io/documentation/operators/observeon.html)
20 |
21 | - parameter scheduler: Scheduler to notify observers on.
22 | - returns: The source sequence whose observations happen on the specified scheduler.
23 | */
24 | public func observeOn(_ scheduler: ImmediateSchedulerType)
25 | -> Observable {
26 | if let scheduler = scheduler as? SerialDispatchQueueScheduler {
27 | return ObserveOnSerialDispatchQueue(source: self.asObservable(), scheduler: scheduler)
28 | }
29 | else {
30 | return ObserveOn(source: self.asObservable(), scheduler: scheduler)
31 | }
32 | }
33 | }
34 |
35 | // MARK: subscribeOn
36 |
37 | extension ObservableType {
38 |
39 | /**
40 | Wraps the source sequence in order to run its subscription and unsubscription logic on the specified
41 | scheduler.
42 |
43 | This operation is not commonly used.
44 |
45 | This only performs the side-effects of subscription and unsubscription on the specified scheduler.
46 |
47 | In order to invoke observer callbacks on a `scheduler`, use `observeOn`.
48 |
49 | - seealso: [subscribeOn operator on reactivex.io](http://reactivex.io/documentation/operators/subscribeon.html)
50 |
51 | - parameter scheduler: Scheduler to perform subscription and unsubscription actions on.
52 | - returns: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.
53 | */
54 | public func subscribeOn(_ scheduler: ImmediateSchedulerType)
55 | -> Observable {
56 | return SubscribeOn(source: self, scheduler: scheduler)
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Event.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Event.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents a sequence event.
10 | ///
11 | /// Sequence grammar:
12 | /// **next\* (error | completed)**
13 | public enum Event {
14 | /// Next element is produced.
15 | case next(Element)
16 |
17 | /// Sequence terminated with an error.
18 | case error(Swift.Error)
19 |
20 | /// Sequence completed successfully.
21 | case completed
22 | }
23 |
24 | extension Event : CustomDebugStringConvertible {
25 | /// - returns: Description of event.
26 | public var debugDescription: String {
27 | switch self {
28 | case .next(let value):
29 | return "next(\(value))"
30 | case .error(let error):
31 | return "error(\(error))"
32 | case .completed:
33 | return "completed"
34 | }
35 | }
36 | }
37 |
38 | extension Event {
39 | /// Is `Completed` or `Error` event.
40 | public var isStopEvent: Bool {
41 | switch self {
42 | case .next: return false
43 | case .error, .completed: return true
44 | }
45 | }
46 |
47 | /// If `Next` event, returns element value.
48 | public var element: Element? {
49 | if case .next(let value) = self {
50 | return value
51 | }
52 | return nil
53 | }
54 |
55 | /// If `Error` event, returns error.
56 | public var error: Swift.Error? {
57 | if case .error(let error) = self {
58 | return error
59 | }
60 | return nil
61 | }
62 | }
63 |
64 | extension Event {
65 | /// Maps sequence elements using transform. If error happens during the transform .error
66 | /// will be returned as value
67 | public func map(_ transform: (Element) throws -> Result) -> Event {
68 | do {
69 | switch self {
70 | case let .next(element):
71 | return .next(try transform(element))
72 | case let .error(error):
73 | return .error(error)
74 | case .completed:
75 | return .completed
76 | }
77 | }
78 | catch let e {
79 | return .error(e)
80 | }
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/smck/Lib/RxSwift/Optional.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Optional.swift
3 | // RxSwift
4 | //
5 | // Created by tarunon on 2016/12/13.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class ObservableOptionalScheduledSink : Sink {
10 | typealias E = O.E
11 | typealias Parent = ObservableOptionalScheduled
12 |
13 | private let _parent: Parent
14 |
15 | init(parent: Parent, observer: O, cancel: Cancelable) {
16 | _parent = parent
17 | super.init(observer: observer, cancel: cancel)
18 | }
19 |
20 | func run() -> Disposable {
21 | return _parent._scheduler.schedule(_parent._optional) { (optional: E?) -> Disposable in
22 | if let next = optional {
23 | self.forwardOn(.next(next))
24 | return self._parent._scheduler.schedule(()) { _ in
25 | self.forwardOn(.completed)
26 | self.dispose()
27 | return Disposables.create()
28 | }
29 | } else {
30 | self.forwardOn(.completed)
31 | self.dispose()
32 | return Disposables.create()
33 | }
34 | }
35 | }
36 | }
37 |
38 | final class ObservableOptionalScheduled