49 lines
1.6 KiB
Go
49 lines
1.6 KiB
Go
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
|
|
}
|