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.

Reply via email to