Hi all, first post here (also a newbie in elixir/FP).
So, I have next pipe code which works but also looks funny:
case {status_code, body} do
{200, _} ->
edges = Poison.Parser.parse!(body)
|> Map.get("data")
|> Map.get("repository")
|> Map.get("issues")
|> Map.get("edges")
if Enum.count(edges) == 0 do
:ok
else
edges
|> Enum.at(-1)
# get last edge cursor
|> Map.get("cursor")
|> IO.inspect
# recurse to get next page
|> get(pagenum + 1)
:ok
end
_ ->
IO.inspect(status_code)
IO.inspect("[ERROR]")
:error
end
2 questions here:
How can I avoid using the temp var edges (i.e. use a continuous pipe)
Is there some sort of tee operator that I could use to siphon out data at a specific pipe point whilst the pipe would continue on?
How can I avoid using the temp var edges (i.e. use a continuous pipe)
# ...
|> Map.get("edges")
|> case do
[] -> :ok
edges ->
edges
|> Enum.at(-1)
# get last edge cursor
|> Map.get("cursor")
|> IO.inspect
# recurse to get next page
|> get(pagenum + 1)
:ok
end
# ...
But I’d probably want to refactor what you have to something like
def handle_resp(status_code, raw_body)
def handle_resp(200, raw_body) do
raw_body
|> Posion.decode!()
|> extract_edges!()
|> handle_edges()
end
defp extract_edges!(%{"data" => %{"repository" => %{"issues" => %{"edges" => edges}}}}) do
edges
end
defp extract_edges!(invalid_body) do
raise("invalid body: #{inspect(invalid_body)}")
end
defp handle_edges([]), do: :ok
defp handle_edges(edges) when is_list(edges) do
# not sure what this is supposed to do
# ...
:ok
end
# etc
def f_1(data) do
data
|> transformation_1()
|> transformation_2()
|> f_2()
end
# still purely sequential - more like a (sequential) fork/join
# because everything has to be an expression.
#
def f_2(snapshot_data) do
{transformation_3(snapshot_data),transformation_4(snapshot_data)} # return both results as a tuple
end
More often than not the solution to a problem is “functions”.
Typically a “local return” is simply returning a value - which is what all functions naturally do. And even though it says throw you are essentially using it as a goto - i.e. tread carefully.
The primary intent behind a throw is a non-local return of a value as described in Try a try in a tree.
it’s gonna take me a while to adjust. Coming from classic OO world (and landing to elixir by accident). FP paradigm feels quite alien to me in a good way though. I feel like I’m unlocking doors in my mind. Thanks a mil!