I love this. My suggestion is to add earliest(date, date) and earliest(list_of_dates) and the same for latest. We need to add it to Time, Date, NaiveDateTime and DateTime.
A PR is very appreciated. *José Valim* www.plataformatec.com.br Skype: jv.ptec Founder and Director of R&D On Thu, Oct 10, 2019 at 5:15 AM Tyson Buzza <tyson.bu...@gmail.com> wrote: > I have been using DateTime and NaiveDateTime alot over the last year and > have found that using the compare function to involves some mental > gymnastics. When using compare you often just want the most recent or > oldest timestamp, or else you want to sort a list of timestamps. > > I am proposing four new functions for each module: earliest/2, latest/2, > sort_earliest/2, and sort_latest/2. earliest/2 and latest/2 each take two > DateTime structs and return the first/last time respectively. The > sort_earliest/2 and sort_latest/2 functions take a list and an optional > mapper, similar to the Enum.sort_by/2 function. sort_earliest/2 and > sort_latest/2 will return the list in ascending/descending chronological > order respectively. > > Example usage: > > ``` > start_time = DateTime.earliest(datetime1, datetime2) > start_time = Enum.reduce(datetime_list, &DateTime.earliest/2) > sorted_times = DateTime.sort_earliest(datetime_list) > sorted_records = DateTime.sort_earliest(records, &(&1.timestamp)) > ``` > > This example is a function that uses sort_earliest to check if a time is > inside a given time range: > > ``` > def in_range(time_stamp, {start_time, end_time} = _range) do > case sort_earliest([time_stamp, start_time, end_time]) do > [^start_time, ^time_stamp, ^end_time] -> > true > > _ -> > false > end > end > ``` > > The implementation would be something simple like this: > > ``` > def sort_earliest(list, mapper \\ fn x -> x end) do > Enum.sort_by(list, mapper, fn x, y -> > :lt == DateTime.compare(x, y) > end) > end > > def earliest(%DateTime{} = datetime1, %DateTime{} = datetime2) do > case DateTime.compare(datetime1, datetime2) do > :gt -> > datetime2 > > _ -> > datetime1 > end > end > ``` > > Might need to make sure sort_earliest is an in place sort. > > -- > You received this message because you are subscribed to the Google Groups > "elixir-lang-core" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to elixir-lang-core+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/elixir-lang-core/47178019-74cd-44bd-b26e-4b092c5c04a2%40googlegroups.com > <https://groups.google.com/d/msgid/elixir-lang-core/47178019-74cd-44bd-b26e-4b092c5c04a2%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to elixir-lang-core+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4%2B6pU8P%2B2XAd7KYURUWP%3DE8ToCtAMYxOo_frkprfSScRA%40mail.gmail.com.