PlayerSelection.swift (933B)
1 import Foundation 2 3 /// A peer player's current cursor track: the canonical start cell and 4 /// direction (across/down) of the word they're working on. Carried inside 5 /// `Player` records on CloudKit so the local client can render the peer's 6 /// selected slot without trying to sync every local cursor-reticle movement. 7 struct PlayerSelection: Sendable, Equatable { 8 let row: Int 9 let col: Int 10 let direction: Puzzle.Direction 11 } 12 13 extension Puzzle.Direction { 14 /// Wire-format raw value used in the `selDir` field on `Player` records. 15 /// Stable: do not renumber. 16 var rawValue: Int { 17 switch self { 18 case .across: return 0 19 case .down: return 1 20 } 21 } 22 23 init?(rawValue: Int) { 24 switch rawValue { 25 case 0: self = .across 26 case 1: self = .down 27 default: return nil 28 } 29 } 30 } 31 32 extension PlayerSelection { 33 typealias Direction = Puzzle.Direction 34 }