Skip to content

Instantly share code, notes, and snippets.

View achernoprudov's full-sized avatar
🏠
Working from home

Andrei Chernoprudov achernoprudov

🏠
Working from home
View GitHub Profile
@achernoprudov
achernoprudov / LruCache.swift
Created May 12, 2019 09:02
LRU Cache implementation. Swift version.
class LruCache<K: Hashable, V> {
private class Entity<V> {
let value: V
let key: K
var left: Entity<V>?
var right: Entity<V>?
init(value: V, key: K) {
self.value = value
@achernoprudov
achernoprudov / quicksort.swift
Created May 12, 2019 09:39
Swift Quicksort.
func quicksort<T: Comparable>(_ list: [T]) -> [T] {
if list.count <= 1 {
return list
}
let pivot = list[0]
var smallerList = [T]()
var equalList = [T]()
var biggerList = [T]()
@achernoprudov
achernoprudov / RxPaginator.swift
Created September 17, 2019 09:08
RxSwift endless paginator template
class Paginator {
struct Params {
let firstIndex: Int
}
let initParams: Params
private let pageSubject = PublishSubject<Void>()
@achernoprudov
achernoprudov / HudController.swift
Created January 24, 2020 05:34
Simple abstraction for hud controller
/// Controller for `HUD` visibility management.
/// Shows hud with delay to prevent interface blinking.
public class HudController {
// MARK: - Instance variables
private let container: UIView
private let delay: DispatchTimeInterval
private var hud: UIActivityIndicatorView?
struct CustomTableSection<HeaderItem, Item> {
var header: HeaderItem
var items: [Item]
}
struct CustomTableView<Item, Content: View, HeaderItem, HeaderContent: View>: UIViewRepresentable {
@Binding
var sections: [CustomTableSection<HeaderItem, Item>]
@achernoprudov
achernoprudov / ErrorReporter.swift
Created August 4, 2020 05:12
Error Reporter facade for non fatals errors
import Foundation
public class ErrorReporter {
// MARK: - Aliases
public typealias ReportFunction = (
_ error: Error,
_ file: StaticString,
_ line: UInt
) -> Void
@achernoprudov
achernoprudov / UnfairLock.swift
Created August 18, 2020 08:03
Unfair lock implementation
/// Low-level lock that allows waiters to block efficiently on contention.
///
/// Based on `os_unfair_lock_s`
public class UnfairLock {
// MARK: - Instance variables
private var unfairLock = os_unfair_lock_s()
// MARK: - Public
@achernoprudov
achernoprudov / Atomic.swift
Last active August 18, 2020 08:04
Property wrapper for atomic modifications
/// Property wrapper for atomic modifications
@propertyWrapper
public struct Atomic<T> {
private var value: T
private let lock = NSLock()
public init(wrappedValue value: T) {
self.value = value
}
public class ReadWriteLock {
// MARK: - Instance variables
private var lock = pthread_rwlock_t()
private var attr = pthread_rwlockattr_t()
// MARK: - Public
public init() {
pthread_rwlockattr_init(&attr)
/// Watcher for time measure.
///
/// ! Non thread safe
public class TimeWatcher {
// MARK: - Static
public enum Interval: UInt64 {
case nanos = 1
case mills = 1_000_000