Skip to content

Instantly share code, notes, and snippets.

View tkersey's full-sized avatar
👹

Tim Kersey tkersey

👹
View GitHub Profile
@tkersey
tkersey / PollingDataModel.swift
Created April 14, 2024 18:51
An example of using AsyncStream
import Combine
import Foundation
import os
@MainActor public final class PollingDataModel<DataModels: Sendable> {
private let logger = Logger(subsystem: "Polling", category: "PollingDataModel")
private var pollingTask: Task<Void, Never>?
private var currentlyPolling = false
@tkersey
tkersey / Task.swift
Created April 11, 2024 22:16
try await Task.sleep(until: targetDate)
import Foundation
extension Task {
static func sleep(until target: Date) async throws where Success == Never, Failure == Never {
let duration = target.timeIntervalSinceNow
try await Self.sleep(for: .seconds(duration))
}
}
print("Waiting for 1s...")
@tkersey
tkersey / ReducedReplayAsyncStream.swift
Created March 14, 2024 06:27 — forked from ABridoux/ReducedReplayAsyncStream.swift
An AsyncSequence that allows to be consumed several times. Returning the current state as specified in a reduce function
struct ReducedReplayAsyncStream<Element> {
typealias Reduce = (_ partialResult: inout Element, _ nextResult: Element) -> Void
private let storage: _Storage
private var originalStream: AsyncStream<Element>
init(
bufferingPolicy limit: AsyncStream<Element>.Continuation.BufferingPolicy = .unbounded,
initialResult: Element,
@tkersey
tkersey / Optional.swift
Last active March 14, 2024 00:41
Missing async functions
extension Optional {
func map<T>(
transform: (Wrapped) async throws -> T
) async rethrows -> T? {
guard case let .some(value) = self else { return nil }
return try await transform(value)
}
}
@tkersey
tkersey / iOSMemoryDeepDive.md
Created January 23, 2024 18:14
iOS Memory Deep Dive
  • vmmap --summary X.memgraph
  • vmmap X.memgraph | rg "MEMORY REGION NAME"
  • vmmap --verbose X.memgraph | rg "MEMORYREGION"
  • leaks --traceTree 0xSTARTINGMEMORYADDRESS
  • malloc_history X.memgraph --fullStacks 0xSTARTINGMEMORYADRESS
  • Other helpful commands
    • vmmap --pages X.memgraph
    • leaks X.memgraph
  • heap X.memgraph
#!/bin/sh
# Runs SwiftFormat on changed Swift files in the project.
# The re-formatting may not be caught at commit time, though, and so may require a subsequent commit/amending.
# If any command fails, exit immediately with that command's exit status.
# shellcheck disable=SC3040
set -eo pipefail
# Redirect output to stderr.
-- Yoneda --------------------------------------------------------------
newtype Yoneda f a = Yoneda { runYoneda :: forall b. ((a -> b) -> f b) }
instance Functor (Yoneda f) where
fmap f y = Yoneda (\ab -> runYoneda y (ab . f))
toYoneda :: Functor f => f a -> Yoneda f a
toYoneda fa = Yoneda (\f -> fmap f fa)
fromYoneda :: Yoneda f a -> f a
@tkersey
tkersey / LinkerSetting.swift
Last active October 24, 2023 14:19
Package.swift Settings
extension LinkerSetting {
static var mergeable: Self = unsafeFlags([
"-Wl,-make_mergeable",
"-Wl,-no_exported_symbols",
])
}
@tkersey
tkersey / pas.ts
Created September 24, 2023 17:27
TypeScript Proposition as Types
// https://www.typescriptlang.org/play?#code/PTAEDMEMBsGcFNQAcBOB7JbYEsAu20A7UQUqIAoXATyUQBUUBXRAXlAcIGtC0B3QgbjJkQoXI0SoMWPAWKASogrVEAMRgJQrQvABu8FIOFgAItlgArdgGN8RUAEFQgCiJQAIUU1QAeRQAeOwBpXAD4NUDJQUAAfUABvUUgAcwAuUAAiaHhwXFT+UG0YJhSHAF8wiOi43ESU1JRsBIALbNz86ELXUGKDMnArG2IMrL8ggApW9rsAShTvP0CtXRQQmPDQFHhcBhRiSuq0wezA8cQusmKhXsJrWTX6pp8XUeOUl2mvXwW9QMfY1fXN7axeLJNJ1RqHPIFE6Cc49Po3eB4Bp6OauQIAYVGqzQKBmvgCwX82MIABlMrgUiNIEVJhoQuiiREiAAlO4U0AjABGL1pzHpRLe6N+fw2W2II1WTJQADoqgkNMxWOlyakyhF1QB+UBEMlZEY46XHWmS9UpFls-Uyo2rSYwoSGUDoogWK79eygQDkRK53Ig7IQACaon6sADaBJcAF1uiIAJIAWyQ0GwlkgbocAFoQm4qB540ggyFWFSaXTXAYRABRACODGwrXgV19oB8fO9OcQMfA4ALoRDeYLgX7LkCdiCUaEIgAcvAEqmbgBCOw+0CTtC4YahEYADxLrc++ntImU2BQsFwoFTuHgCfPuDQyHQ-oYlkQkBXM7nulESjhrpuUGwDJ-QAfS0BJgMva8kFwEZaRWVZLmuWxwBxHQUVHYt7Dgk1-jFCBUMWKlbVWUohAids0HAfD1kWVYRHVAA9DV7QiRC3X9NAGE5DJQJnYYRi7SkU2gaBOUgSwOEpaksNLfdeRCOSil+dVQBAE02JuHhIDwYCUJovRMKmFJ92UlS1lFQEtJ0vS0JQIjBBU2EVNwwEuxGKzcF0gi9GIiJznIpRKNADiuJ4sC6LARjmIiejsEQVd1wS4YgjI0AMnPaTCAYONOT0UIQu4+BeISEYOFLDgRg