Adzz
Announcing - KeywordLens - A library for dealing with nested data structures
What’s it all about?
A keyword lens is a nested keyword-like structure used to describe paths into certain data types. It is similar to the list you can provide to Ecto’s Repo.preload/2
You can describe a KeywordLens like this:
[a: :b, c: [d: :e]]
Such a list is handy for describing subsets of nested data structures. For example, you can imagine the following KeywordLens: [a: :b] applied to this map: %{a: %{b: 1}} points to the value 1. In contrast this KeywordLens: [:a, :b] applied to this map %{a: 1, b: 2} points to both values 1 and 2.
It’s not a proper Keyword list because we allow any key for convenience, so these are valid:
[{"a", :b}]
[a: [{"b", [c: :d]}]
[{%{}, :b}]
[{1, {2, 3}}]
One KeywordLens can point to many different values inside a given data structure.
Here are some examples of different KeywordLenses and the unique set of lenses they represent.
keyword_lens = [a: :b]
lenses = [[:a], [:b]]
keyword_lens = [a: [b: [:c, :d]]]
lenses = [[:a, :b, :c], [:a, :b, :d]]
keyword_lens = [a: [:z, b: [:c, d: :e]]]
lenses = [[:a, :z], [:a, :b, :c], [:a, :b, :d, :e]]
keyword_lens = [:a, "b", :c]
lenses = [[:a], ["b"], [:c]]
You can use KeywordLens.Helpers.expand/1 to see which unique lenses are encoded in a given KeywordLens.
KeywordLens.Helpers.expand([a: :b])
[:a, :b]
KeywordLens.Helpers.expand([a: [b: [:c, :d]]])
[[:a, :b, :c], [:a, :b, :d]]
This library provides a protocol you can implement for your own data structures and structs. We provide a map implementation to get started.
Examples
KeywordLens.map(%{a: %{b: 1}}, [a: :b], &(&1 + 1))
%{a: %{b: 2}}
data = %{a: 1, b: 2}
reducer = fn {key, value}, acc ->
{:cont, Map.merge(acc, %{key => value + 1})}
end
KeywordLens.reduce_while(data, [:a, :b], %{}, reducer)
%{a: 2, b: 3}
The implementation uses zipper like traversal so it is memory efficient.
Most Liked
Adzz
I didn’t actually post a link to the library… GitHub - Adzz/keyword_lens: A WIP utility library for working with nested data structures · GitHub
Popular in Announcing
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









