Skip to content

Instantly share code, notes, and snippets.

@mihaelamj
Created January 17, 2026 18:25
Show Gist options
  • Select an option

  • Save mihaelamj/ca6b3955f47217d976111b9164d8d927 to your computer and use it in GitHub Desktop.

Select an option

Save mihaelamj/ca6b3955f47217d976111b9164d8d927 to your computer and use it in GitHub Desktop.
final class AnalyticsService: Sendable {
static let shared = AnalyticsService()
private let continuation: AsyncStream<AnalyticsEvent>.Continuation
private init() {
let (stream, continuation) = AsyncStream.makeStream(of: AnalyticsEvent.self)
self.continuation = continuation
// Background consumer
Task.detached(priority: .utility) {
var buffer: [AnalyticsEvent] = []
for await event in stream {
buffer.append(event)
if buffer.count >= 50 {
await Self.send(buffer)
buffer.removeAll()
}
}
// Flush remaining on termination
if !buffer.isEmpty {
await Self.send(buffer)
}
}
}
// Fire and forget — never blocks
func track(_ event: AnalyticsEvent) {
continuation.yield(event)
}
func shutdown() {
continuation.finish()
}
private static func send(_ events: [AnalyticsEvent]) async {
// Network call...
}
}
struct AnalyticsEvent: Sendable {
let name: String
let timestamp: Date
let properties: [String: String]
static func screenView(_ name: String) -> AnalyticsEvent {
AnalyticsEvent(name: "screen_view", timestamp: .now, properties: ["screen": name])
}
}
// usage
AnalyticsService.shared.track(.screenView("Home"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment