DaAnalyst

DaAnalyst

Extructure - a flexible destructure library for Elixir

Hey guys (and gals),

Letting you know I finally release this Extructure library. Here’s some info copied from its docs:

By default the library is using loose (flexible) matching, allowing for implicit structural conversions (maps, lists and tuples, from one to another). Tuple and list key pair element order are also taken loosely by default.

Supports destructure-like implicit keys (with the same name as the variable) as well as optional values, flexible keyword and key pair tuple size and order of elements, implicit transformation between a map, list and a key pair tuple.

Also supports toggling between the loose mode and the standard Elixir pattern matching (“rigid”) mode where none of the flexibilities except for the optional variables are allowed.

Fully enforces pattern matching between the left and right side once taken into account the optional values and structural transformation.

For example, instead of:

%{
  first_name: fist_name,
  last_name: last_name,
} = socket.assigns

age = socket.assigns[ :age]

just write:

%{ first_name, last_name, _age} <~ socket.assigns

or implicitly transform the map into a list:

[ first_name, last_name, _age] <~ socket.assigns

or use a different order:

[ last_name, _age, first_name] <~ socket.assigns

or set a default value:

[ last_name, age( 25), first_name] <~ socket.assigns

https://github.com/DaTrader/extructure

Enjoy!

First Post!

hst337

hst337

Great library for destructing!

I have several questions.

  1. Why did you chose arguments like age(25) instead of more common age \\ 25 like defaults in arguments of functions? This kind of specification of defaults is less intuitive for Elixir developers and it makes impossible to use macros inside the left part of <~/2

  2. Why did you chose _defaults_to_nil syntax ? I think explicit defaults_to_nil \\ 25 or defaults_to_nil(nil) is just more obvious

Most Liked

DaAnalyst

DaAnalyst

New features available in v0.2.1 (as per the changelog):

Enhancements

  • Support transforming entire structures on the right side by specifying an empty map, tuple or list, e.g.:
[ a: a = %{}] <~ [ a: [ b: 2, c: 3]]
# a
# => %{b: 2, c: 3}
  • Support destructuring from module (named) structures as if plain maps, e.g:
[ hour, minute, second] <~ DateTime.utc_now()
# => [hour: 15, minute: 44, second: 14]
DaAnalyst

DaAnalyst

Extructure v1.0 is out

DaAnalyst

DaAnalyst

Thanks for the compliments.

As for your question, it’s not like I had that option. Namely, the following generates a syntax error:

%{ a, b \\ 25} <~ %{ a: 1, b: 2}

as it does not work for maps, and I wanted to have a uniform way of expressing the variables (the same syntax works with lists and tuples).

Last Post!

DaAnalyst

DaAnalyst

Finally managed to find some (Claude’s) time to complete the long planned and postponed feature set for the :extructure library. I’m aware this probably matters far less now than it did while we still used to actually code but I still prefer using :extructure even though it’s Claude writing most of the code now, because in my view it’s more compact and readable (e.g. for reviews) than the vanilla Elixir’s Map.get/fetch, Keyword.get/fetch, etc.

So, in addition to the existing loose (& rigid) destructuring based on the <~/2 operator, there is now a match based destructuring for the likes of function headers and case statements:

-%{ a} = %{ a: 1, b: 2}   # for atom keys
-@%{ a} = %{ "a" => 1}    # for string keys

The analog syntax with keyword lists and tuple keypairs is also supported.

Also added something I’ve long liked about JS (and been missing in Elixir) - the structuring shorthand:

a = 1
b = 2
+%{ a, b}   # %{ a: 1, b: 2}
+@%{ a, b}  # %{ "a" => 1, "b" => 2}

Same for keywords or listed string keypairs and tuple atom and string keypairs.

Here’s the whole thing again with the examples and all: extructure | Hex

Where Next?

Popular in Announcing Top

danschultzer
In short Plug n’ play OAuth 2.0 provider library. Just set up a resource owner schema with Ecto (your user schema), install the dependen...
New
treble37
Just looking for a little feedback on a tiny helper library I built - Sometimes I find the need to convert maps with atom keys to maps w...
New
versilov
Could not wait for the missing Elixir ML libraries to appear, so, I wrote one myself, taking https://github.com/sdwolfz/exlearn as a foun...
New
tmbb
I’ve been working on two packages (not on hex.pm yet) to build admin interfaces for phoenix apps: bureaucrat - which contains a bunch ...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 44778 311
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 44265 214
New
Flo0807
Hello everyone! I am excited to share our heart project Backpex with you. After building several Phoenix applications, we realized that...
New

Other popular topics Top

KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 36820 110
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1144 55125 245
New
axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 49266 226
New
AstonJ
Seen any cool LiveView demos, sample apps or examples? Please post them here! :003:
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New

We're in Beta

About us Mission Statement