zerogvt

zerogvt

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:

  1. How can I avoid using the temp var edges (i.e. use a continuous pipe)
  2. 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?

Thanks!

Showing Posts 1 to 10

idi527

idi527

:waving_hand:

  1. 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
dwahyudi

dwahyudi

Extract to another function.

mudasobwa

mudasobwa

Creator of Cure
edges =
  try
    body
    |> Poison.Parser.parse!()
    |> Map.get("data")
    |> Map.get("repository")
    |> Map.get("issues")
    |> Map.get("edges")
    |> case do
      edges when map_size(edges) == 0 -> throw(:ok)
      edges -> edges
    end
    |> Enum.at(-1)
    |> Map.get("cursor")
    |> IO.inspect
    |> get(pagenum + 1)
    throw(:ok)
  catch
    value -> value
  end

Please note, Kernel.catch/1 is a local return.

But I probably would better extract it into a private function.

dimitarvp

dimitarvp

I’d change that to:

get_in(~w<data repository issues edges>)
mudasobwa

mudasobwa

Creator of Cure

C’mon, I blindly copy-pasted it :slight_smile:

dimitarvp

dimitarvp

You know that if you want a harsh critic you must hire a Slav! :smiley:

Appreciate your help here. Just trying to make you into a Superman. :003:

mudasobwa

mudasobwa

Creator of Cure

I’m Russian, I know it better than anybody else :sunglasses:

zerogvt

zerogvt OP

Thanks a million guys!
Working on your pointers.
Any thoughts about question 2 (tee operator) ?
Something like:

data |> transformation_1 |> transformation_2 T> snapshot_data |> transformation_3
snapshot_data |> transformation_4
peerreynders

peerreynders

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

functional-programming-patterns-ndc-london-2014-15-638

More often than not the solution to a problem is “functions”.

pie

peerreynders

peerreynders

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.

Aside return vs throw vs exit vs raise.

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews