Map Sorter v0.1.9 MapSorter View Source

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

¹Or keywords or structures implementing the Access behaviour.

Link to this section Summary

Functions

Allows to change the log level at compile time

Takes a list of maps¹ and either a list of sort specs or an AST that will evaluate to a list of sort specs at 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)

Takes a list of maps¹ and either a list of sort specs or an AST that will evaluate to a list of sort specs at runtime.

Returns the AST to sort the maps¹ as per the sort specs.

sort specs can be implicit, explicit or mixed:

  • [:dob, :name] is implicit and same as => [asc: :dob, asc: :name]
  • [:dob, desc: :name] is mixed and like => [asc: :dob, desc: :name]
  • [asc: :dob, desc: :name] is explicit

¹Or keywords or structures implementing the Access behaviour.

Examples

iex> # Sorting maps...
iex> require MapSorter
iex> people = [
...>   %{name: "Mike", likes: {:ski, :arts}, dob: ~D[1992-04-15]},
...>   %{name: "Mary", likes: ["travels"]  , dob: ~D[1992-04-15]},
...>   %{name: "Ann" , likes: ['reading']  , dob: ~D[1992-04-15]},
...>   %{name: "Ray" , likes: ["cycling"]  , dob: ~D[1977-08-28]},
...>   %{name: "Bill", likes: ["karate"]   , dob: ~D[1977-08-28]},
...>   %{name: "Joe" , likes: ["boxing"]   , dob: ~D[1977-08-28]},
...>   %{name: "Jill", likes: ["cooking"]  , dob: ~D[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) # :info => no debug messages
iex> sorted.explicit == sorted.mixed and
...> sorted.explicit == sorted.runtime and
...> sorted.explicit
[
  %{name: "Jill", likes: ["cooking"]  , dob: ~D[1976-09-28]},
  %{name: "Bill", likes: ["karate"]   , dob: ~D[1977-08-28]},
  %{name: "Ray" , likes: ["cycling"]  , dob: ~D[1977-08-28]},
  %{name: "Joe" , likes: ["boxing"]   , dob: ~D[1977-08-28]},
  %{name: "Mary", likes: ["travels"]  , dob: ~D[1992-04-15]},
  %{name: "Ann" , likes: ['reading']  , dob: ~D[1992-04-15]},
  %{name: "Mike", likes: {:ski, :arts}, dob: ~D[1992-04-15]}
]

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