Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
..
Failed to load latest commit information.
Preprocessor.xcodeproj
Preprocessor
README.md

README.md

RxSwift KISS code generator.

RxSwift code is partially machine generated. It converts *.tt files into generated *.swift files.

There are multiple reasons why that is the case.

  • Performance
  • Consistency
  • Removes burden from developers (me :)
  • It's fun

To see how it in action, take a look at

CombineLatest+arity.tt CombineLatest+arity.swift

//
//  CombineLatest.tt.swift
//  RxSwift
//
//  Created by Krunoslav Zaher on 4/22/15.
//  Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
//

import Foundation

<% for i in 2 ... 10 { %>

// <%= i %>

public func combineLatestOrDie<<%= ", ".join(map(1...i) { "E\($0)" }) %>, R>
    (<%= ", ".join(map(1...i) { "source\($0): Observable<E\($0)>" }) %>, resultSelector: (<%= ", ".join(map(1...i) { "E\($0)" }) %>) -> Result<R>)
        -> Observable<R> {
    return CombineLatest<%= i %>(
        <%= ", ".join(map(1...i) { "source\($0): source\($0)" }) %>,
        resultSelector: resultSelector
    )
}

public func combineLatest<<%= ", ".join(map(1...i) { "E\($0)" }) %>, R>
    (<%= ", ".join(map(1...i) { "source\($0): Observable<E\($0)>" }) %>, resultSelector: (<%= ", ".join(map(1...i) { "E\($0)" }) %>) -> R)
        -> Observable<R> {
    return CombineLatest<%= i %>(
        <%= ", ".join(map(1...i) { "source\($0): source\($0)" }) %>,
        resultSelector: { success(resultSelector(<%= ", ".join(map(0..<i) { "$\($0)" }) %>)) }
    )
}

to

// This file is autogenerated.
// Take a look at `Preprocessor` target in RxSwift project 
//
//  CombineLatest.tt.swift
//  RxSwift
//
//  Created by Krunoslav Zaher on 4/22/15.
//  Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
//

import Foundation



// 2

public func combineLatestOrDie<E1, E2, R>
    (source1: Observable<E1>, source2: Observable<E2>, resultSelector: (E1, E2) -> Result<R>)
        -> Observable<R> {
    return CombineLatest2(
        source1: source1, source2: source2,
        resultSelector: resultSelector
    )
}

public func combineLatest<E1, E2, R>
    (source1: Observable<E1>, source2: Observable<E2>, resultSelector: (E1, E2) -> R)
        -> Observable<R> {
    return CombineLatest2(
        source1: source1, source2: source2,
        resultSelector: { success(resultSelector($0, $1)) }
    )
}

It's pretty generic, I'm thinking of extracting it as a separate project.