Map Sorter v0.1.16 MapSorter View Source

Sorts a list of maps as per a list of sort specs (ascending/descending keys).

Also supports:

  • keywords
  • structs implementing the Access behaviour
  • nested maps, keywords or structs implementing the Access behaviour

Link to this section Summary

Functions

Allows to change the log level at compile time

Sorts maps as per its sort specs (compile time or runtime)

Link to this section Functions

Link to this macro log_level(level) View Source (macro)

Allows to change the log level at compile time.

Link to this macro sort(maps, sort_specs) View Source (macro)

Sorts maps as per its sort specs (compile time or runtime).

sort specs can be implicit, explicit or mixed:

  • implicit: [:dob, :name]
  • mixed: [:dob, desc: :name]
  • explicit: [asc: :dob, desc: :name]

sort specs for nested data structures:

  • implicit: [[:birth, :date], [:name, :first]]
  • mixed: [[:birth, :date], desc: [:name, :first]]
  • explicit: [asc: [:birth, :date], desc: [:name, :first]]

Examples

iex> require MapSorter
iex> people = [
...>   %{name: "Mike", likes: "movies" , dob: "1992-04-15"},
...>   %{name: "Mary", likes: "travels", dob: "1992-04-15"},
...>   %{name: "Ann" , likes: "reading", dob: "1992-04-15"},
...>   %{name: "Ray" , likes: "cycling", dob: "1977-08-28"},
...>   %{name: "Bill", likes: "karate" , dob: "1977-08-28"},
...>   %{name: "Joe" , likes: "boxing" , dob: "1977-08-28"},
...>   %{name: "Jill", likes: "cooking", dob: "1976-09-28"}
...> ]
iex> fun = & &1
iex> MapSorter.log_level(:info) # :debug → debug messages
iex> sorted = %{
...>   explicit: MapSorter.sort(people, asc: :dob, desc: :likes),
...>   mixed:    MapSorter.sort(people, [:dob, desc: :likes]),
...>   runtime:  MapSorter.sort(people, fun.([:dob, desc: :likes]))
...> }
iex> MapSorter.log_level(:info)
iex> sorted.explicit == sorted.mixed and
...> sorted.explicit == sorted.runtime and
...> sorted.explicit
[
  %{name: "Jill", likes: "cooking", dob: "1976-09-28"},
  %{name: "Bill", likes: "karate" , dob: "1977-08-28"},
  %{name: "Ray" , likes: "cycling", dob: "1977-08-28"},
  %{name: "Joe" , likes: "boxing" , dob: "1977-08-28"},
  %{name: "Mary", likes: "travels", dob: "1992-04-15"},
  %{name: "Ann" , likes: "reading", dob: "1992-04-15"},
  %{name: "Mike", likes: "movies" , dob: "1992-04-15"}
]