Список эликсира не обновляется при использовании нескольких методов - PullRequest
0 голосов
/ 08 апреля 2020
def create(conn, params) do
  conn 
    |> render_json_response(bulk_convertor(params))
end

def bulk_convertor(%{"file" => %Plug.Upload{content_type: "text/csv", filename: basename, 
      path: fullpath}}) do
   list = [~w(old, new)]
   fullpath
     |> read_csv(list)
     |> form_response
end

def read_csv(path, list) do
  if path |> File.stream! |> Enum.count <= 50 do
    path
      |> File.stream!
      |> Parser.parse_stream
      |> Stream.map(fn [arg] -> %{url: arg} end)
      |> iterate_urls(list)
  else
    %{error: %{message: "Limit Exceeded"}}
  end
end

def iterate_urls(mapped_stream, list) do
  mapped_stream
    |> Enum.each(fn(url) -> url_convertor(url, list) end)
  %{response: %{message: "Request Initiated"}}
end

def url_convertor(%{url: val}, list) do
  with {:ok, %Route{} = route} <- App.create_route(%{"url" => val}) do
    route
      |> App.redirect_url
      |> add_to_list(route, list)
  end
end

def add_to_list(new_url, %{url: original_url}, list) do
  list = List.insert_at(list, -1, ~w(#{original_url}, #{new_url}))
  list
end

Содержимое списка не обновляется всякий раз, когда я пытаюсь распечатать его где-нибудь, используя IO. В этом случае отображается начальный список. Я пытаюсь обновить содержимое списка на основе данных, проанализированных из файла csv, который я анализирую с помощью библиотеки elixir nimble_csv.

Если я пытаюсь напечатать список внутри

add_to_list

видны только две строки: заголовок, который я добавил изначально, и последняя строка из CSV.

Есть ли что-то, что я здесь не так делаю.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Вы создаете новую функцию list в add_to_list, функция возвращает новый list, но вы игнорируете ее. Структуры данных неизменны в Elixir. Проверьте этот ответ: эликсир не обновляет значения в наборе карт, используя enum.each

0 голосов
/ 08 апреля 2020

Поскольку я узнал, что DS в эликсире является неизменяемым, я смог решить вышеуказанную проблему, внеся небольшое изменение в функцию ниже

def iterate_urls(mapped_stream) do
  mapped_stream
    |> Enum.flat_map(fn(url) -> url_convertor(url) end)
    |> dump_to_csv
  %{response: %{message: "Request Initiated"}}
end

Остальное теперь остается прежним этой строки

Enum.flat_map (fn (url) -> url_convertor (url) end)

список возврата, который я хотел.

...