Skip to content

Instantly share code, notes, and snippets.

View ha1f's full-sized avatar

はるふ ha1f

View GitHub Profile
#!/bin/sh
echo "Running pre-commit..."
# pre-commit自体が最新かどうかをチェック
PRECOMMIT_MASTER_FILE='./script/pre-commit'
if [ -e $PRECOMMIT_MASTER_FILE ]; then
diff -s $PRECOMMIT_MASTER_FILE ./.git/hooks/pre-commit > /dev/null 2>&1
if [ $? -ne 0 ]; then
cp $PRECOMMIT_MASTER_FILE ./.git/hooks/pre-commit
enum CachableRequestState {
/// 読み込み前
case possible
/// 読込中
case loading
/// 直近のリクエストがエラー
case error(Error)
//
// CachableRequest.swift
// LIPS
//
import Foundation
import RxSwift
import RxCocoa
private extension ObservableType {
final class LazyBehaviorRelay<Element>: ObservableType, ObserverType {
private let _behaviorRelay = BehaviorRelay<Element?>(value: nil)
private let _emittedValue: Observable<Element>
init() {
_emittedValue = _behaviorRelay
.filterNil()
.share(replay: 1, scope: .forever)
}
/// リクエストをして、データをキャッシュする
/// ロード中mの再呼び出しは無視する
/// これだと、一回データ取得して、二回目でエラー、みたいなときにつらい
class Repository<T> {
typealias State = RepositoryState<T, Error>
private let _request: Observable<T>
let state = BehaviorRelay<State>(value: .possible)
extension CGRect {
/// 線形補間した矩形を返す
/// - parameter rate: 変化割合。0 <= rate <= 1の範囲で指定する。
func lerp(to rect: CGRect, rate: CGFloat) -> CGRect {
let lerp = _lerpCurried(rate)
return CGRect(
x: lerp(origin.x, rect.origin.x),
y: lerp(origin.y, rect.origin.y),
width: lerp(width, rect.width),
height: lerp(height, rect.height)
/// delegateなどを配列などに持ちたいときに使う
private final class WeakObject<T: AnyObject> {
weak var object: T?
init(_ object: T?) {
self.object = object
}
}
final class PageViewControllerDelegateMulticaster: NSObject, UIPageViewControllerDelegate {
final class CircleImageRenderer {
let image: Observable<UIImage>
init(radius: CGFloat, fillColor: UIColor = .white) {
self.image = Observable.create { observer in
let format = UIGraphicsImageRendererFormat.default()
format.scale = UIScreen.main.scale
let width = radius * 2
let size = CGSize.square(width)
let renderer = UIGraphicsImageRenderer(
func const<T, U>(_ value: T) -> (U) -> T {
return { _ in value }
}
func identity<T>() -> (T) -> T {
return { $0 }
}
//
// WithBlockingView.swift
//
extension ObservableConvertibleType {
/// actionがcompleteするまで画面を表示する
func withBlockingView(from parentViewController: UIViewController) -> Observable<Element> {
let viewController = _BlockingLoadingViewController(self)
return viewController.result
.do(onSubscribed: { [weak parentViewController] in