Skip to content

Instantly share code, notes, and snippets.

View laiso's full-sized avatar
☀️

laiso laiso

☀️
View GitHub Profile
@laiso
laiso / Rx+APIHimotoKit.swift
Created April 14, 2017 07:01
RxSwift(RxCocoa)+APIKit+Himotoki
import RxSwift
import RxCocoa
import APIKit
extension Reactive where Base: URLSession {
func response<T: Request>(_ request: T) -> Observable<T.Response> {
var req: URLRequest
do {
req = try request.buildURLRequest()
} catch {
@laiso
laiso / ViewController.swift
Last active April 10, 2017 09:56
Data Binding for a progress HUD in Swift
viewModel.showLoadingHUD.asDriver(onErrorJustReturn: false)
.drive(onNext: { show in
if show {
HUD.show(.progress)
} else {
HUD.hide()
}
})
.addDisposableTo(disposeBag)
@laiso
laiso / ViewController.swift
Last active April 6, 2017 12:15
Error Handling in RxSwift
// MARK: Submit Button - action
viewModel.loggedIn.asObservable()
.observeOn(MainScheduler.instance)
.retryWhen { errorObservable -> Observable<Error> in
errorObservable.map { [weak self] error in
let alert = ErrorAlertBuilder(error: error).build()
self?.present(alert, animated: true, completion: nil)
return error
}
@laiso
laiso / CodePiece.swift
Created April 6, 2017 10:28
Himotoki便利感が発揮された #CodePiece
// Implementation
import Himotoki
// https://pay.jp/docs/api/#error
struct APIError: Decodable {
let code: APIErrorCode
let message: String
let statusCode: Int
let type: APIErrorType
@laiso
laiso / CodePiece.swift
Last active March 21, 2017 04:28
完了してもキャンセルしてもtearDownをdriveするんだというのを表現したい https://twitter.com/laiso/status/844021792750555137 #CodePiece
let tearDown = Driver.combineLatest(cancelButton.rx.tap.asDriver(),
viewModel.completetion.asDriver(onErrorJustReturn: false)) { ($0, $1) }
.drive(onNext: { [unowned self] in
HUD.hide()
self.view.endEditing(true)
self.dismiss(animated: true, completion: nil)
})
tearDown.addDisposableTo(disposeBag)
@laiso
laiso / bookmarklet.js
Last active February 23, 2017 11:20
icons
// in browser
document.write(jQuery("img.ProfileCard-avatarImage").toArray().reduce((txt, img)=>{ return txt + "\n" + img.src }, ""))
// console
pbpaste | xargs -P 10 wget
class AmountSettingViewModelSpec: QuickSpec {
override func spec() {
var viewModel: AmountSettingViewModel!
beforeEach {
viewModel = AmountSettingViewModel(amountText: Observable<String>.just("120"),
submitButtonTap: Observable<Void>.just())
}
it("should be button ebanled") {
let enable = try! viewModel.submitButtonEnable.toBlocking().single()
@laiso
laiso / CodePiece.swift
Created February 6, 2017 09:27
ログイン成否のテスト書けそうな気がしてきた気がする #CodePiece
import Quick
import Nimble
import RxTest
import RxBlocking
import RxSwift
import RxCocoa
import Result
@testable import customer
class SigninViewModelSpec: QuickSpec {
@laiso
laiso / CodePiece.swift
Created January 27, 2017 03:56
うーんこういう風に書きたい #CodePiece
let request = UserAPIRequest(id: 1) // APIKit
let username = URLSession.shared.rx.object(request: request)
.map { user in // Himotoki
return user.name
}
class PersonSpec: QuickSpec {
override func spec() {
describe("Person"){
describe("成人判定") {
itBehavesLike("is成人") {
let p = Person(name: "_", age: 21)
return ["person": p]
}
itBehavesLike("is成人") { ["person": Person(name: "_", age: 999)] }
itBehavesLike("not成人") { ["person": Person(name: "_", age: 19)] }