If Tyson Buzza don't mind, I would love to write this as my first PR as I had used Elixir in work for two years and want to do a contribution. : P
On Thu, Oct 10, 2019 at 4:29 PM José Valim <jose.va...@plataformatec.com.br> wrote: > Oh, I see why you called it sort_earliest, because you also want to allow > a function to be given, in the style of sort_by. I am not a big fan of > sort_earliest though. > > What if we add only: DateTime.earliest(list_of_dates) and > DateTime.earliest(list_of_dates, fun)? You can always get the earliest of > two dates by passing it a list with two elements. > > > *José Valim* > www.plataformatec.com.br > Skype: jv.ptec > Founder and Director of R&D > > > On Thu, Oct 10, 2019 at 5:26 AM José Valim < > jose.va...@plataformatec.com.br> wrote: > >> 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/CAGnRm4KYAzPQDYUdyWie3pkamFERh5uHVS-8FJEs%2BsAUDZTRug%40mail.gmail.com > <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4KYAzPQDYUdyWie3pkamFERh5uHVS-8FJEs%2BsAUDZTRug%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > -- -- Regards, YongHao Hu -- 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/CAASkFKW0c2bcwSMHcSQhjQOWt6vSdJmNR9FaO5r6GFrz4rAUGw%40mail.gmail.com.