While i was strongly leaning towards singular, i understand why one would 
expect plural. Given that seems to be pretty standard in wild, i am fine 
changing it as well.

What mostly put me off about was that we'd end up with `Time.add(t, 3, 
:minute)` vs `Time.shift(t, minutes: 3)`, which after all, maybe isn't too 
bad, as we can keep the plural keys exclusive to durations. Another reason 
for going with plurals is that it _should_ make migrating from some 
libraries to the standard library relatively straight forward (with the 
exception of microseconds).

On Wednesday, March 6, 2024 at 11:07:52 PM UTC+1 José Valim wrote:

> After a quick glance on other programming languages, it seems Python, 
> Java, Rust, and C# all have plural names. Erlang also uses plural in its 
> helper functions in the timer module. So we might want to follow suit.
>
> On Wed, Mar 6, 2024 at 23:03 José Valim <jose....@dashbit.co> wrote:
>
>> We discussed plural vs singular and settled on singular so it mirrors the 
>> calendar types.  Thoughts?
>>
>> On Wed, Mar 6, 2024 at 23:01 Panagiotis Nezis <pne...@gmail.com> wrote:
>>
>>> +1 for this, awesome work Theo. Shifting dates/timestamps is such a 
>>> common operation and a standard implementation would be beneficial for 
>>> everybody.
>>>
>>> PS. I would expect plural in the duration fields. 
>>>
>>> On Wed, Mar 6, 2024 at 8:23 PM José Valim <jose....@dashbit.co> wrote:
>>>
>>>> The main argument for having it in core is:
>>>>
>>>>   * It integrates directly with the Calendar behaviour
>>>>   * We could provide built-in sigils in the future to create readable 
>>>> durations, such as ~P[3 hours and 10 minutes]
>>>>   * Postgrex, Explorer, CLDR, etc all implement their own version of 
>>>> durations
>>>>
>>>> Arguments for not having it in core: it happens that all of the 
>>>> arguments above can also be solved without adding Duration to Elixir and, 
>>>> instead, by creating a custom library:
>>>>
>>>>   * A separate library could extend the calendar behaviour with shift_* 
>>>> functions
>>>>   * Third-party sigils can also be provided by libraries
>>>>   * Postgrex, Explorer, and CLDR could create or use a package with a 
>>>> duratio type shared across them all
>>>>
>>>> I would love to hear the community thoughts.
>>>>
>>>> On Wed, Mar 6, 2024 at 7:16 PM 'Theo Fiedler' via elixir-lang-core <
>>>> elixir-l...@googlegroups.com> wrote:
>>>>
>>>>> *Preface*
>>>>>
>>>>> We currently have `add/2-3` to manipulate calendar types in the 
>>>>> standard library. These functions allow adding a specified amount of time 
>>>>> of given unit to a date/time. The standard library currently misses means 
>>>>> to apply more complex, or logical *durations *to calendar types. e.g. 
>>>>> adding a month, a week, or one month and 10 days to a date.
>>>>>
>>>>> *Reasons for it*
>>>>>
>>>>> While similar functionality exists in libraries, such as CLDR, 
>>>>> Timex, Tox, adding this functionality to the standard library has already 
>>>>> been requested and discussed at multiple occasions over the past years. 
>>>>> To 
>>>>> list a few examples:
>>>>>
>>>>> - https://github.com/elixir-lang/elixir/pull/10199
>>>>> - 
>>>>> https://elixirforum.com/t/get-date-n-months-years-in-the-past/48346/3
>>>>> - 
>>>>> https://elixir-lang.slack.com/archives/C0HEX82NR/p1709581478427009?thread_ts=1709368588.334759&cid=C0HEX82NR
>>>>>
>>>>> Furthermore the shift behaviour in the extremely popular library Timex 
>>>>> changed <https://github.com/bitwalker/timex/issues/731> in Elixir >= 
>>>>> 1.14.3 which may have complicated the mostly lean and non-breaking 
>>>>> language 
>>>>> upgrade Elixir has to offer.
>>>>>
>>>>> Elixir has a great set of modules and functions that deal with date 
>>>>> and time, the APIs are consistent and `shift/2-3` should fit right in, 
>>>>> solving many standard needs of various industries, be it for reporting, 
>>>>> appointments, events, finance... the list goes on, engineers probably 
>>>>> face 
>>>>> the need to shift time logically more often than not in their careers.
>>>>>
>>>>> *Technical details*
>>>>>
>>>>> Duration
>>>>> A date or time must be shifted by a *duration*. There is an ISO8601 
>>>>> for durations <https://en.wikipedia.org/wiki/ISO_8601#Durations>, 
>>>>> which the initial implementation is loosely following. The structure of a 
>>>>> Duration lives in its own module with its own set of functions to create 
>>>>> and manipulate durations. One example of where it diverts from the ISO 
>>>>> standard, is that it implements microseconds. Microseconds in a 
>>>>> *duration* are stored in the same format as in the time calendar 
>>>>> types, meaning they integrate well and provide consistency.
>>>>>
>>>>> Shift
>>>>> The shift behaviour is implemented as a callback on Calendar and 
>>>>> supported by all calendar types: Date, DateTime, NaiveDateTime and Time. 
>>>>> Date, Time and NaiveDateTime each have their own implementation of a 
>>>>> "shift", while DateTime gets converted to a NaiveDateTime before applying 
>>>>> the shift, and is then rebuilt to a DateTime in its original timezone. 
>>>>> `shift/2-3` also has guaranteed output types (which isn't a given in many 
>>>>> libraries) and follows the consistent API which is established in the 
>>>>> calendar modules.
>>>>>
>>>>> Find the current state of the implementation here: 
>>>>> https://github.com/elixir-lang/elixir/pull/13385
>>>>>
>>>>> *Benchmarks*
>>>>>
>>>>> There are some benchmarks + StreamData tests in the PR description.
>>>>>
>>>>> *Outlook*
>>>>>
>>>>> *After  *adding the Duration type and shift behaviour to the standard 
>>>>> library, the following things could be explored and derived from the 
>>>>> initial work:
>>>>>
>>>>>
>>>>>    - Implementing a protocol that allows Duration to be applied to 
>>>>>    any data type, not just dates and times.
>>>>>    - A range-like data type that allows us to do recurring constructs 
>>>>>    on any data type. For example, Duration.interval(~D[2000-01-01], 
>>>>>    month: 1), when iterated, would emit {:ok, date} | {:error, start, 
>>>>>    duration, reason} entries
>>>>>    - A sigil for easy creation of durations: ~P[3 hours and 10 
>>>>>    minutes]
>>>>>    - Making it so add/2-3 reuses the shift_* functions
>>>>>
>>>>> *Reasons against it*
>>>>>
>>>>> While I am convinced that adding `shift/2-3` to the standard library 
>>>>> would be very beneficial, nothing really speaks against the points 
>>>>> mentioned above to be implemented in a library instead. However, 
>>>>> something 
>>>>> as crucial and central as date/time manipulation should still be part of 
>>>>> the standard library, negating the risk of breaking changes, inconsistent 
>>>>> behaviour and outdated or too unique ergonomics which aren't widely 
>>>>> applicable, unlike what should be part of the standard library.
>>>>>
>>>>> Many thanks to @jose & @kip for the initial reviews and everyone in 
>>>>> advance taking the time to read the proposal!
>>>>>
>>>>> Looking forward to hear other peoples ideas and opinions on the 
>>>>> subject!
>>>>>
>>>>> -- 
>>>>> 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-co...@googlegroups.com.
>>>>> To view this discussion on the web visit 
>>>>> https://groups.google.com/d/msgid/elixir-lang-core/cb0ed628-3848-4de0-aa13-c0f4761e4d99n%40googlegroups.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/cb0ed628-3848-4de0-aa13-c0f4761e4d99n%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-co...@googlegroups.com.
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4%2BNmFsMhbkRubMjnmM8c_Amq8DgmKCJtzJ1GEuM4-sVgw%40mail.gmail.com
>>>>  
>>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4%2BNmFsMhbkRubMjnmM8c_Amq8DgmKCJtzJ1GEuM4-sVgw%40mail.gmail.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-co...@googlegroups.com.
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/elixir-lang-core/CAPxxbtjvFwnMXe134RR8wjnYk%2Bm-%2BF%2BO_79dWKk3G-bt99Ln%2Bw%40mail.gmail.com
>>>  
>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAPxxbtjvFwnMXe134RR8wjnYk%2Bm-%2BF%2BO_79dWKk3G-bt99Ln%2Bw%40mail.gmail.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/3a82f501-cc62-409c-a653-d4b6e5943407n%40googlegroups.com.

Reply via email to