Skip to content

Instantly share code, notes, and snippets.

View ncreated's full-sized avatar
💭
⚡️

Maciek Grzybowski ncreated

💭
⚡️
View GitHub Profile
@ncreated
ncreated / Toggle.swift
Last active July 27, 2017 23:09
Toggle - Rx component for saving settings
//
// Toggle.swift
// Switch
//
// Created by Maciek Grzybowski on 28.07.2017.
// Copyright © 2017 ncreated. All rights reserved.
//
import RxSwift
import RxCocoa
@ncreated
ncreated / AutocompleteTests.swift
Created July 17, 2017 21:07
Medium blogpost snippet
func testItEmitsPredictionsResult() {
let disposeBag = DisposeBag()
let provider = MockAutocompleteProvider()
let autocomplete = Autocomplete(provider: provider)
let input = SimulatedInput()
let mockPrediction = Prediction(predictedText: "Italy",
matchingRange: ("It".startIndex..<"It".endIndex))
let expectation = self.expectation(description: "will emit result")
let (result, _) = autocomplete.autocomplete(text: input.text)
@ncreated
ncreated / SearchViewController.swift
Last active July 17, 2017 21:00
Medium blogpost snippet
class SearchViewController: UITableViewController {
@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet var noResultsView: UIView!
@IBOutlet var errorView: UIView!
@IBOutlet weak var errorMessageLabel: UILabel!
private let disposeBag = DisposeBag()
private let autocomplete = Autocomplete(provider: CountryAutocompleteProvider())
@ncreated
ncreated / SearchViewController.swift
Last active July 17, 2017 20:47
Medium blogpost snippet
let autocomplete = Autocomplete(provider: CountryAutocompleteProvider())
let (results, isLoading) = autocomplete.autocomplete(text: inputText)
@ncreated
ncreated / Autocomplete.swift
Created July 17, 2017 20:34
Medium blogpost snippet
func autocomplete(text: Observable<String>) -> (result: Driver<AutocompleteResult>,
isBusy: Driver<Bool>) {
let provider = self.provider
let resultAndLoading: Driver<(result: AutocompleteResult?, loading: Bool)> = text
.flatMapLatest { query -> Observable<(result: AutocompleteResult?, loading: Bool)> in
provider
.autocomplete(text: query)
.map { (result: .predictions($0), loading: false) }
.catchError { .just((result: .error($0), loading: false)) }
@ncreated
ncreated / Autocomplete.swift
Created July 17, 2017 20:09
Medium blogpost snippet
func autocomplete(text: Observable<String>) -> (result: Driver<AutocompleteResult>, isBusy: Driver<Bool>) {
let provider = self.provider
let isLoadingSubject = PublishSubject<Bool>()
let result: Driver<AutocompleteResult> = text
.do(onNext: { _ in isLoadingSubject.onNext(true) })
.flatMapLatest { query -> Observable<AutocompleteResult> in
provider
.autocomplete(text: query)
.map { .predictions($0) }
@ncreated
ncreated / Autocomplete.swift
Last active July 17, 2017 19:58
Medium blogpost snippet
func autocomplete(text: Observable<String>) -> (result: Driver<AutocompleteResult>,
isBusy: Driver<Bool>) {
let provider = self.provider
let result: Driver<AutocompleteResult> = text
.flatMapLatest { query in
provider
.autocomplete(text: query)
.map { AutocompleteResult.predictions($0) }
.catchError { .just(AutocompleteResult.error($0)) }
@ncreated
ncreated / Autocomplete.swift
Last active July 17, 2017 19:57
Medium blogpost snippet
final class Autocomplete {
// MARK: - Properties
private let provider: AutocompleteProvider
// MARK: - Initializers
init(provider: AutocompleteProvider) {
self.provider = provider
@ncreated
ncreated / CountryAutocompleteProvider.swift
Created July 16, 2017 20:01
Medium blogpost snippet
import RxSwift
private let countries = ["Afghanistan", "Albania", /* all the countries */ "Zambia", "Zimbabwe"]
final class CountryAutocompleteProvider: AutocompleteProvider {
func autocomplete(text: String) -> Observable<[Prediction]> {
func predictionsFor(prefix: String) -> [Prediction] {
return countries
.flatMap { country in
@ncreated
ncreated / Prediction.swift
Created July 16, 2017 19:44
Medium blogpost snippet
struct Prediction {
let predictedText: String
let matchingRange: Range<String.Index>
}