diff --git a/Preprocessor/README.md b/Preprocessor/README.md new file mode 100644 index 00000000..cb29ab86 --- /dev/null +++ b/Preprocessor/README.md @@ -0,0 +1,92 @@ +## 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" }) %>, resultSelector: (<%= ", ".join(map(1...i) { "E\($0)" }) %>) -> Result) + -> Observable { + 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" }) %>, resultSelector: (<%= ", ".join(map(1...i) { "E\($0)" }) %>) -> R) + -> Observable { + return CombineLatest<%= i %>( + <%= ", ".join(map(1...i) { "source\($0): source\($0)" }) %>, + resultSelector: { success(resultSelector(<%= ", ".join(map(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 + (source1: Observable, source2: Observable, resultSelector: (E1, E2) -> Result) + -> Observable { + return CombineLatest2( + source1: source1, source2: source2, + resultSelector: resultSelector + ) +} + +public func combineLatest + (source1: Observable, source2: Observable, resultSelector: (E1, E2) -> R) + -> Observable { + 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.