I'm in a similar situation to you YongHao. Sorry, but would you mind if I did it?
To be clear the functionality would be: DateTime.earliest(enumerable, mapper \\ fn x -> x end) with a typespec like @spec earliest(Enum.t(), (any() -> t())) :: list() right? On Thursday, October 10, 2019 at 4:42:45 PM UTC+8, YongHao Hu wrote: > > 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...@plataformatec.com.br > <javascript:>> 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...@plataformatec.com.br >> <javascript:>> 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...@gmail.com >>> <javascript:>> 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-l...@googlegroups.com <javascript:>. >>>> 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-l...@googlegroups.com <javascript:>. >> 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/74c0de06-fd22-42fc-bb59-8eef056a994a%40googlegroups.com.