Swap elements in nested list

Hello, I am quite new to Elixir (I already start loving the language).
I am trying to write a function that swaps two elements in nested list.
For instance, I want to swap the third element at the first row with the fifth element at the third row I would write something like swap.(list, {0, 2}, {2, 4}).
My current version is

swap = fn
  list, {i1, j1}, {i2, j2} ->
    temp = list |> Enum.at(i1) |> Enum.at(j1)
    row1 = list |> Enum.at(i1)
    row2 = list |> Enum.at(i2)
    new_row1 = row1 |> List.replace_at(j1, Enum.at(row2, j2))
    new_row2 = row2 |> List.replace_at(j2, temp)
    list |> List.replace_at(i1, new_row1) |> List.replace_at(i2, new_row2)
end
list = [
  [1, 2, 3, 4, 5],
  [1, 2, 3, 4, 5],
  [1, 2, 3, 4, 5],
  [1, 2, 3, 4, 5],
  [1, 2, 3, 4, 5]
]
swap.(list, {0, 2}, {2, 4})

I am wondering if there is better way of doing this.

Maybe get_in and put_in would be useful here.

@LostKobrakai: It’s not as easy as it looks, please see José Valim’s answer in similar topic.

In short:

  1. For simple example like here it’s totally ok to use get_in and update in functions, but …
  2. If this data is only example for bigger source then recommend way, but much more verbose is to map lists.
  3. Vectors should solve it, but I don’t know when they will be available (if any)

@baruh : How about look for a library? First that I found is Matix, but I don’t used/tested it, so I can’t say if it’s good and/or optimized enough.

I don’t think that a list of lists is a good way to do matrices in Elixir. I think you’re getter off by doing a Map like:

%{
  {0, 0} => 1,
  {0, 1} => 2,
  ...
}

Swapping is then pretty easy, you just

val1 = Map.get(matrix, coords1)
val2 = Map.get(matrix, coords2)
%{matrix | coords1 => val2, coords2 => val1}

@LostKobrakai Thank you! I didn’t know for get_in and put_in.
@benwilson512 Thanks! I am thinking of switch to map at the end might be the easiest way.
@Eiji Thanks! I took a quick look at the library and it is taking similar to my approach. I will switch to implementation with map instead of a nested list, what @benwilson512 suggested. Another library that I found for linear algebra also uses nested lists.
I edited the reply to be one post. No need of spam.