package board type shuffleDirection int const ( forwards shuffleDirection = iota backwards ) // moveAndShuffle creates a new list where the element specified at the index of the current // position is moved to the index of the target position. Elements within the range of the // old and new positions will then shuffle forwards or backwards in the list depending on the // direction of the move. // This is currently used to move specified columns forwards or backwards on the Kanban board. // When a column changes position the other columns shuffle forward or backwards as required. func moveAndShuffle(input []Status, currentPosition, targetPosition int) []Status { var shuffle shuffleDirection if targetPosition < currentPosition { // affected elements will need to shuffle backwards if the focused // element moves towards the beginning of the list... shuffle = backwards } else { // ...or else the elements need to shuffle forwards if the focused // element moves towards the end of the list. shuffle = forwards } output := make([]Status, len(input)) for ind := range input { switch { case (shuffle == backwards) && (ind < targetPosition || ind > currentPosition): output[ind] = input[ind] case (shuffle == backwards) && (ind == currentPosition): output[targetPosition] = input[ind] case (shuffle == backwards): output[ind+1] = input[ind] case (shuffle == forwards) && (ind < currentPosition || ind > targetPosition): output[ind] = input[ind] case (shuffle == forwards) && (ind == currentPosition): output[targetPosition] = input[ind] case (shuffle == forwards): output[ind-1] = input[ind] } } return output }