decasm

decasm

Standard library suggested addition

Hi, still pretty new to Elixir. Is there a library equivalent of this? I’ve look but I haven’t found anything that looks right, but I want to make sure before I write a library to do it. It seems pretty general so I just assume it’s eluding me.

  # recursive get from collections
  defp getr(x, [head|tail]) when is_tuple(x) do
    getr(elem(x,head), tail)
  end
  defp getr(x, [head|tail]) when is_list(x) do
    getr(Enum.at(x,head), tail)
  end
  defp getr(x, [head|tail]) when is_map(x) do
    getr(Map.get(x,head), tail)
  end
  defp getr(x, []) do
    x
  end

Most Liked

LostKobrakai

LostKobrakai

This seems like an implementation of get_in/2.

hauleth

hauleth

The whole get_in/2 and update_in/3 are Elixir version of lenses which is functional structure for handling and manipulating nested structure. In it core functionality these are 2 functions:

  • get which extracts data from the structure
  • set which put data within structure

So get_in/2 can be thought as a list of functions that will extract value from structure in form:

get_in(stuct, [f, g])

# is (roughly) the same as

g(f(struct))

# and

update_in(struct, [f, g], val)

g(f(struct, val), val)

In reality it is “slightly” more complicated as you cannot return “closured object” with multiple functions in Elixir. So instead it works like that:

f =
  fn
    :get, struct, next -> # extract value and call `next` on it
    :update_in, struct, next -> # call next on data and then update `struct`
  end

So in the end, example implementation of Access.key!:

  def key!(key) do
    fn
      :get, %{} = data, next ->
        # call `next` on extracted data
        next.(Map.fetch!(data, key))

      :get_and_update, %{} = data, next ->
        # get "current data" under key
        value = Map.fetch!(data, key)

        # call `next` on current value
        case next.(value) do
          # return value and update structure
          {get, update} -> {get, Map.put(data, key, update)}
          # remove value from structure
          :pop -> {value, Map.delete(data, key)}
        end

      _op, data, _next ->
        raise "Access.key!/1 expected a map/struct, got: #{inspect(data)}"
    end
  end
peerreynders

peerreynders

Have a look at the Access behaviour.

etc.

iex(1)> users = [{"john", 27}, {"meg", 23}]
[{"john", 27}, {"meg", 23}]
iex(2)> keys = [Access.at(1), Access.elem(0)]
[#Function<1.79554587/3 in Access.at/1>,
 #Function<2.79554587/3 in Access.elem/1>]
iex(3)> get_in(users, keys)
"meg"
iex(4)>
peerreynders

peerreynders

Functions also work with

and Access.key/2 can return a default value if the entry is not found.

There’s also Access.filter/1 and Access.all/0.

Where Next?

Popular in Questions Top

Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
Jim
As a follow up to my earlier question: I have the code compiling and running but not getting a successful login from the rest server. ...
New
sacepums
Hey guys. I'm new to elixir and im really stocked about it. But I ran into a bit of problem - I need to convert a date sting, for examp...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
LegitStack
I’m trying to make a websocket server in Phoenix or raw Elixir. I heard about gun, I think I could use cowboy, but since I’m not that sma...
New
Codball
Mix format works fine if run from the cmd. I’ve followed this to facilitate the implementation into VSC which involves downloading an ext...
New

Other popular topics Top

senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
William
I would like to know that is there any online source for learning Phoenix Framework for building E-Commerce Store? Any advantage on build...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 35421 110
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lis...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New

We're in Beta

About us Mission Statement