Skip to content

Instantly share code, notes, and snippets.

View darrarski's full-sized avatar
:octocat:
🍏🦕

Dariusz Rybicki darrarski

:octocat:
🍏🦕
View GitHub Profile
extension View {
@ViewBuilder func modify<Modified: View>(
if condition: @autoclosure () -> Bool,
then transform: (Self) -> Modified
) -> some View {
if condition() {
transform(self)
} else {
self
}
@darrarski
darrarski / IfLet.swift
Last active January 7, 2021 13:15
SwiftUI IfLet helper functions
import SwiftUI
func IfLet<T, ThenOut: View>(
_ value: T?,
then: (T) -> ThenOut
) -> some View {
ViewBuilder.buildIf(value.map { then($0) })
}
func IfLet<T, ThenOut: View, ElseOut: View>(
@darrarski
darrarski / SystemIdleTime.m
Last active March 30, 2021 07:05
Get Mac OS X system idle time in Swift or Objective-C
//
// Created by Dariusz Rybicki on 17/04/16.
// Copyright © 2016 Darrarski. All rights reserved.
//
#import <Foundation/Foundation.h>
/**
Returns number of seconds since system became idle
@darrarski
darrarski / CaseTogglable.swift
Created July 13, 2021 12:50
Swift `toggle()` extension for enums
protocol CaseTogglable {}
extension CaseTogglable where Self: CaseIterable, Self: Equatable {
mutating func toggle() {
assert(Self.allCases.isEmpty == false, "CaseTogglable cannot be applied to an enum with no cases!")
let index = Self.allCases.firstIndex(of: self)!
let nextIndex = Self.allCases.index(after: index)
if nextIndex < Self.allCases.endIndex {
self = Self.allCases[nextIndex]
} else {
@darrarski
darrarski / CaseSwitchable.swift
Created July 13, 2021 16:32
Swift `switch()` and `next()` extension for enums
protocol CaseSwitchable: CaseIterable, Equatable {}
extension CaseSwitchable {
mutating func `switch`() {
self = next()
}
func next() -> Self {
self.next() ?? Self.allCases.first!
}
@darrarski
darrarski / SwiftUI_DeviceOrientationObserver.swift
Last active July 20, 2021 10:11
SwiftUI DeviceOrientationObserver
import SwiftUI
public final class DeviceOrientationObserver: ObservableObject {
public init(notificationCenter: NotificationCenter = .default) {
observation = notificationCenter.addObserver(
forName: UIDevice.orientationDidChangeNotification,
object: nil,
queue: .main,
using: { [weak self] notification in
self?.value = (notification.object as? UIDevice)?.orientation ?? .unknown
@darrarski
darrarski / SwiftUI_DeviceOrientationObserver.swift
Created August 23, 2021 17:28
SwiftUI CoreMotion driven DeviceOrientationObserver
import CoreMotion
import SwiftUI
public final class DeviceOrientationObserver: ObservableObject {
public init() {
manager.startAccelerometerUpdates(to: OperationQueue.main) { [weak self] data, error in
guard error == nil, let acceleration = data?.acceleration else {
self?.value = .unknown
return
}
@darrarski
darrarski / SimplePublisher.swift
Last active November 22, 2021 23:34
SimplePublisher - custom publisher for Combine framework
import Combine
public final class SimplePublisher<Output, Failure>: Publisher where Failure: Error {
public init(_ closure: @escaping (Receiver<Output, Failure>) -> Disposable) {
self.closure = closure
}
public func receive<S>(subscriber: S) where S: Subscriber, S.Input == Output, S.Failure == Failure {
subscriber.receive(subscription: Subscription(subscriber: subscriber, closure: closure))
}
@darrarski
darrarski / CodableDecimalSpec.swift
Last active November 26, 2021 14:23
Swift Codable, Decimal <~> String encoding
import Quick
import Nimble
class CodableDecimalSpec: QuickSpec {
override func spec() {
context("encode Model to JSON") {
var model: Model!
var json: [String: String]?
beforeEach {
@darrarski
darrarski / SwiftUI_GeometryReaderViewModifier.swift
Last active January 16, 2022 23:27
SwiftUI extension that attaches geometry reader to a view and notifies whenever provided geometry changes.
import SwiftUI
extension View {
func geometryReader<Geometry: Codable>(
geometry: @escaping (GeometryProxy) -> Geometry,
onChange: @escaping (Geometry) -> Void
) -> some View {
modifier(GeometryReaderViewModifier(
geometry: geometry,
onChange: onChange