import Foundation enum MoveValidator { /// True if the two cards have alternating colors (one red, one black). static func isAlternatingColor(_ card: Card, with other: Card) -> Bool { card.color != other.color } /// True if both cards share the same suit. static func isSameSuit(_ card: Card, as other: Card) -> Bool { card.suit == other.suit } /// True if card's rank is exactly one higher than target (for foundation building A→K). static func isAscending(_ card: Card, onto target: Card) -> Bool { card.rank.rawValue == target.rank.rawValue + 1 } /// True if card's rank is exactly one lower than target (for tableau stacking K→A). static func isDescending(_ card: Card, onto target: Card) -> Bool { card.rank.rawValue == target.rank.rawValue - 1 } /// True if the card is an Ace. static func isAce(_ card: Card) -> Bool { card.rank == .ace } /// True if the card is a King. static func isKing(_ card: Card) -> Bool { card.rank == .king } /// True if the card can be placed on a foundation pile (same suit, ascending). static func canPlaceOnFoundation(_ card: Card, topCard: Card?) -> Bool { guard let topCard else { return isAce(card) } return isSameSuit(card, as: topCard) && isAscending(card, onto: topCard) } }