Вы можете использовать двойную дозу patch()
, чтобы переместить предмет в новое место. К сожалению, это немного отличается в зависимости от направления, вперед или назад.
case class Bucket(id: UUID, title: String, cards: Seq[Card]) {
def moveCard(cardId: UUID, newIndex: Int): Bucket = {
val from = cards.indexWhere(_.id == cardId)
if (from < 0) throw new Error("no such card")
copy(cards =
if (from < newIndex)
cards.patch(newIndex+1,Seq(cards(from)),0).patch(from,Seq(),1)
else
cards.patch(newIndex,Seq(cards(from)),0).patch(from+1,Seq(),1)
)
}
}
Или это очень хорошее упрощение, предложенное @LeoC:
copy(cards = cards.patch(from, Seq(), 1).patch(newIndex, Seq(cards(from)), 0))