/useful

🇨🇭 A collection of useful functions for working in Elixir

Primary LanguageElixirGNU General Public License v2.0GPL-2.0

useful

A collection of useful functions for building Elixir Apps.

Build Status codecov.io Hex.pm contributions welcome

swiss-army-knife

Why?

We found ourselves copy-pasting a few useful "helper" functions across our Elixir projects ...
it wasn't "DRY", so we created this library.

What?

A library of useful functions that we need for building Elixir Apps.

Who?

This library is for our use on our various Elixir / Phoenix apps. As with everything we do it's Open Source, Tested and Documented so that anyone can benefit from it.

How?

Install

The package can be installed by adding useful to your list of dependencies in mix.exs:

def deps do
  [
    {:useful, "~> 0.2.0"}
  ]
end

Function Reference

atomize_map_keys/1

Converts a Map that has strings as keys (or mixed keys) to have only atom keys. e.g:

# map that has different types of keys:
my_map = %{"name" => "Alex", id: 1}
Useful.atomize_map_keys(my_map)
%{name: Alex, id: 1}

Works recursively for deeply nested maps:

person = %{"name" => "Alex", id: 1, details: %{"age" => 17, height: 185}}
Useful.atomize_map_keys(person)
%{name: Alex, id: 1, details: %{age: 17, height: 185}}

flatten_map/1

Flatten a Map of any depth/nesting:

iex> map = %{name: "alex", data: %{age: 17, height: 185}}
iex> Useful.flatten_map(map)
%{data__age: 17, data__height: 185, name: "alex"}

Note: flatten_map/1 converts all Map keys to Atom as it's easier to work with atoms as keys e.g: map.person__name instead of map["person__name"]. We use the __ (double underscore) as the delimiter for the keys of nested maps, because if we attempt to use . (period character) we get an error:

iex(1)> :a.b
** (UndefinedFunctionError) function :a.b/0 is undefined (module :a is not available)
    :a.b()

Docs

Detailed docs available at: https://hexdocs.pm/useful/Useful.html