Я хотел бы сделать функцию, чтобы поменять местами два элемента в массиве.
Очевидно, что если он запускается Up
msg с первым элементом, ничего не произойдет. То же самое, если Down
msg с последним элементом.
У меня есть следующий код:
module Main exposing (main)
import Browser
import Html exposing (Html, button, div, text)
import Html.Attributes exposing (class)
import Html.Events exposing (onClick)
import Array
import List exposing (map)
type alias Model = Array.Array Int
initialModel : Model
initialModel =
Array.fromList [3, 1, 7, 2, 6, 4, 5]
type Msg
= Up Int
| Down Int
update : Msg -> Model -> Model
update msg model =
case msg of
Up n ->
swap model n (n-1)
Down n ->
swap model n (n+1)
swap : Model -> Int -> Int -> Model
swap model src dest =
model -- How do it?
view : Model -> Html Msg
view model =
div [] (map elements (Array.toIndexedList model))
elements : (Int, Int) -> Html Msg
elements (position, number) =
div [ class "block" ]
[ button [ onClick (Up position) ] [ text "UP" ]
, div [] [ text <| String.fromInt number ]
, button [ onClick (Down position) ] [ text "DOWN" ]
]
main : Program () Model Msg
main =
Browser.sandbox
{ init = initialModel
, view = view
, update = update
}
И я хотел бы знать, лучше ли использовать List или Array, чтобы сделать что.
Большое спасибо