Skip to content

Instantly share code, notes, and snippets.

@garsdle
garsdle / ObservedStorePath.swift
Last active May 8, 2020 20:42
ObservedStorePath
@propertyWrapper
struct ObservedStorePath<Value: Equatable>: DynamicProperty {
@ObservedObject private var observableFilter: ObservableStoreFilter<Value>
var wrappedValue: Value {
get {
observableFilter.value
}
nonmutating set {
observableFilter.value = newValue
import Combine
import SwiftUI
class ScopedGetObservable<T>: ObservableObject {
var cancellable: AnyCancellable?
let getter: () -> T
init<P>(getter: @autoclosure @escaping () -> T, publisher: P) where P: Publisher, P.Output == T, P.Failure == Never {
self.getter = getter
@garsdle
garsdle / View+Relative.swift
Last active July 27, 2021 22:40 — forked from IanKeen/View+Relative.swift
SwiftUI relative frame
struct SizePreferenceKey: PreferenceKey {
static var defaultValue: CGSize = .zero
static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
value = nextValue()
}
}
struct RelativeSizeModifier: ViewModifier {
let percentWidth: CGFloat
import SwiftUI
import Combine
import ComposableArchitecture
// MARK: - MODELS
struct Counter: Identifiable, Equatable {
let id: UUID
let createdAt: Date
var count: Int
}
@garsdle
garsdle / Vanilla.swift
Last active December 4, 2021 05:21
Count app using vanilla SwiftUI, container views and Equatable
import SwiftUI
import Combine
import ComposableArchitecture
// MARK: - MODELS
struct Counter: Identifiable, Equatable {
let id: UUID
let createdAt: Date
var count: Int
}
import SwiftUI
import Combine
@propertyWrapper
struct Streamed<Value: Sendable> {
var wrappedValue: Value {
didSet {
onCountUpdate(wrappedValue)
}
}