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 11 to 2

zerogvt

zerogvt OP

:sweat_smile: 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!

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.

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

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
mudasobwa

mudasobwa

Creator of Cure

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

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

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

dimitarvp

dimitarvp

I’d change that to:

get_in(~w<data repository issues edges>)
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.

dwahyudi

dwahyudi

Extract to another function.

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
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
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
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
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
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

Other Trending Topics Top

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
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
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
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews