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.

Reply via email to