Packages

Traverse and map values of deeply nested data structures: Provides a `map_deeply/2` function for Maps and Lists and Keyword Lists

Current section

Files

Jump to
data_leaf_walker lib data_leaf_walker.ex
Raw

lib/data_leaf_walker.ex

defmodule DataLeafWalker do
def map( hash, fn_transform ) when is_map( hash ) do
List.foldl(
Map.keys( hash ),
%{},
fn key, acc ->
old_value = Map.fetch! hash, key
new_value = case key do
# don not touch __struct__ values as they define the struct type
:__struct__ -> old_value
_ -> transform old_value, fn_transform
end
Map.put_new acc, key, new_value
end
)
end
def map( list, fn_transform ) when is_list( list ) do
Enum.map list, fn item -> transform( item, fn_transform) end
end
def transform( value, fn_transform ) when is_map( value ) do
map( value, fn_transform )
end
def transform( value, fn_transform ) when is_list( value ) do
map( value, fn_transform )
end
def transform( { key, value }, fn_transform ) do
{ key, fn_transform.( value ) }
end
def transform value, fn_transform do
fn_transform.( value )
end
end