enum GameEvent {
    case slid(blockIndex: Int, from: GridPosition, to: GridPosition)
    case destroyed(blockIndex1: Int, blockIndex2: Int, at: GridPosition)
    case merged(blockIndex1: Int, blockIndex2: Int, resultColor: BlockColor, at: GridPosition)
}

struct MoveResult {
    let newState: GameState
    let events: [GameEvent]
    /// True when the move actually changed state (block moved)
    var isValid: Bool { !events.isEmpty }
}
