Skip to content

Instantly share code, notes, and snippets.

@atierian
Created April 4, 2023 12:43
Show Gist options
  • Save atierian/ad096b09a859f36cef412ca4b50f4e23 to your computer and use it in GitHub Desktop.
Save atierian/ad096b09a859f36cef412ca4b50f4e23 to your computer and use it in GitHub Desktop.
@dynamicMemberLookup
struct Identified<Value> {
let value: Value
let id: String
subscript<T>(dynamicMember keyPath: KeyPath<Value, T>) -> T {
value[keyPath: keyPath]
}
}
@dynamicMemberLookup
struct Timestamped<Value> {
let value: Value
let timestamp: Date
subscript<T>(dynamicMember keyPath: KeyPath<Value, T>) -> T {
value[keyPath: keyPath]
}
}
typealias Complete<T> = Timestamped<Identified<T>>
func complete(_ entry: Complete<User>) {
// ...
}
struct User {
let name: String
let age: UInt8
}
let user = User(name: "Ian", age: 33)
let identified = Identified(value: user, id: UUID().uuidString)
let timestamped = Timestamped(value: identified, timestamp: .init())
timestamped.timestamp // "Apr 4, 2023 at 8:42 AM"
timestamped.id // "66D63DA4-93E1-473A-8893-6A30767FFA8F"
timestamped.name // "Ian"
timestamped.age // 33
complete(timestamped) // ✅
complete(user) // ❌
complete(identified) // ❌
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment