pelican/internal/board/shuffle.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
}