Skip to content

Instantly share code, notes, and snippets.

View ha1f's full-sized avatar

はるふ ha1f

View GitHub Profile
//
// UIViewControllerReferenceCycleTests.swift
// TargetTests
//
import UIKit
import XCTest
@testable import Target
//
// Comparable+Clamp.swift
//
import Foundation
extension Comparable {
/// minとmaxの範囲に収める
func clamp(min minValue: Self, max maxValue: Self) -> Self {
return max(min(self, maxValue), minValue)
//
// WithPrevious.swift
//
// Created by ha1f on 2018/06/25.
// Copyright © 2018年 ha1f. All rights reserved.
//
import Foundation
import RxCocoa
import RxSwift
//
// 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
func const<T, U>(_ value: T) -> (U) -> T {
return { _ in value }
}
func identity<T>() -> (T) -> T {
return { $0 }
}
import UIKit
protocol WoExecutable {
func を<Result>(_ process: WoProcess<Self, Result>) -> Result
}
extension WoExecutable {
func を<Result>(_ process: WoProcess<Self, Result>) -> Result {
return process.process(self)
}
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(
/// delegateなどを配列などに持ちたいときに使う
private final class WeakObject<T: AnyObject> {
weak var object: T?
init(_ object: T?) {
self.object = object
}
}
final class PageViewControllerDelegateMulticaster: NSObject, UIPageViewControllerDelegate {
/// リクエストをして、データをキャッシュする
/// ロード中mの再呼び出しは無視する
/// これだと、一回データ取得して、二回目でエラー、みたいなときにつらい
class Repository<T> {
typealias State = RepositoryState<T, Error>
private let _request: Observable<T>
let state = BehaviorRelay<State>(value: .possible)
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)
}