Okay, I'm totally in love with this idea :)

*iex(1)>*



























*defprotocol Comparable do  @spec compare(t, t) :: :lt | :eq | :gt  def 
compare(a, b)enddefimpl Comparable, for: Integer do  def compare(a, b) do  
  cond do      a < b -> :lt      a == b -> :eq      a > b -> :gt    end  
endenddefimpl Comparable, for: DateTime do  def compare(a, b) do    
DateTime.compare(a, b)  endenddefmodule Foo do  def a >= b do    
Comparable.compare(a, b) != :lt  endendimport Kernel, except: [>=: 2]import 
Foo*

It's magic!

*iex(2)>* 2 >= 1
*true*
*iex(3)>* DateTime.add(DateTime.utc_now(), 10, :hour) >= DateTime.utc_now()
*true*
On Tuesday, November 1, 2022 at 8:55:14 AM UTC-4 Cliff wrote:

> Actually, using something like a *Comparable* protocol (as Jose 
> mentioned) would do this using already-existing language features.
>
> On Tuesday, November 1, 2022 at 8:46:08 AM UTC-4 Cliff wrote:
>
>> Would it be possible to allow different modules to define multiple 
>> clauses of the same function as long as they don't overlap? i.e. DateTime 
>> could define
>>
>>
>> *defmodule DateTime do*
>>
>>
>>
>> *  def %DateTime{ ... } >= %DateTime{ ... } do    ...  endend*
>>
>> So that if you *import DateTime, only: [:>=]*, a call to >= using 
>> DateTime structs would use DateTime.>=, and all other calls would match the 
>> clause for Kernel.>=?
>> On Monday, October 31, 2022 at 6:50:19 PM UTC-4 Billy Lanchantin wrote:
>>
>>> FWIW, I think a macro approach that takes a single argument and allows 
>>> chained comparisons covers a lot of the cases being discussed here.
>>>
>>> Consider something like:
>>>
>>> # imports a compare?/1 macro
>>> use CompareChain, for: DateTime
>>>
>>> def between?(left, middle, right) do
>>>   compare?(left <= middle < right)
>>> end
>>>
>>> The code reads well since you don't have the module name getting in the 
>>> way. And it covers the annoying inclusive/exclusive issue quite nicely I 
>>> think.
>>>
>>> It's also convenient because I often find myself combining the results 
>>> of comparisons (Ben provided some good examples). Being able to chain the 
>>> operators within the macro helps avoids much of that verbose code. For 
>>> instance, even with DateTime.before?/3 and DateTime.after?/3, you'd 
>>> have to render my between?/3 as something like:  
>>>
>>> def between?(left, middle, right) do
>>>   DateTime.before?(left, middle, inclusive: true) and 
>>> DateTime.after?(right, middle)
>>> end
>>> On Monday, October 31, 2022 at 6:18:09 PM UTC-4 halos...@gmail.com 
>>> wrote:
>>>
>>>> I would *personally* appreciate an inclusive option from the start, as 
>>>> sometimes the `b` value is pulled from a database and to make the 
>>>> `before?` 
>>>> work the way `<=` would, I’d have to *add* a millisecond (or day or…) and 
>>>> for `after?` I’d have to *subtract*.
>>>>
>>>> -a
>>>>
>>>> On Mon, Oct 31, 2022 at 5:26 PM José Valim <jose....@dashbit.co> wrote:
>>>>
>>>>> Making DateTime.compare?(left, :<=, right) resemble left <= right can 
>>>>> be a win but i think it can also cause confusion in that "why not use 
>>>>> left 
>>>>> <= right in the first place"? And once we import, it makes me wonder why 
>>>>> it 
>>>>> isn't a protocol so we can compare anything?
>>>>>
>>>>> I am not saying we shouldn't tackle those problems... but those are 
>>>>> likely to take longer discussions.
>>>>>
>>>>> At the same time, I don't feel we have to pick one option or the 
>>>>> other.  So I would start with DateTime.before?/2 and DateTime.after?/2 
>>>>> for 
>>>>> now, which is definitely an improvement over the current code and may as 
>>>>> well elegantly solve the problem in the long term. If not, it is no 
>>>>> problem 
>>>>> to restart the discussion.
>>>>>
>>>>> So a PR for before?/2 and after?/2 (no inclusive for now) on all 4 
>>>>> modules is welcome. :)
>>>>>
>>>>>
>>>>>
>>>>> On Mon, Oct 31, 2022 at 10:14 PM Ben Wilson <benwil...@gmail.com> 
>>>>> wrote:
>>>>>
>>>>>> Making < and <= work in general for DateTime has been discussed and 
>>>>>> isn't feasible. The macro answer I kinda love.
>>>>>>
>>>>>> On Monday, October 31, 2022 at 3:42:16 PM UTC-4 m...@achempion.com 
>>>>>> wrote:
>>>>>>
>>>>>>> Is it possible to modify language in a way to make >,<, = work for 
>>>>>>> dates?
>>>>>>>
>>>>>>> The datetime's struct has known values 
>>>>>>> <https://github.com/elixir-lang/elixir/blob/v1.14.1/lib/elixir/lib/calendar/datetime.ex#L110-L123>
>>>>>>>  which 
>>>>>>> can be pattern matched against and struct comparison, in general, is 
>>>>>>> not 
>>>>>>> used that match, so it shouldn't mess up with already written code 
>>>>>>> (maybe 
>>>>>>> we even fix couple bugs as using >,<,= to compare dates are relatively 
>>>>>>> common first bug for new elixir developers). 
>>>>>>>
>>>>>>> If we can ducktype struct with such attributes and use a regular 
>>>>>>> DateTime.compate/2 to compare it in Kernel.>/2 function and friends.
>>>>>>>
>>>>>>> On 31 Oct 2022, at 19:54, Cliff <notcliff...@gmail.com> wrote:
>>>>>>>
>>>>>>> I did some more playing around and created this macro:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> *defmodule Foo do  defmacro compare_with(comparison, module) do    
>>>>>>> {op, _env, [a, b]} = comparison    cmp_result = quote do      
>>>>>>> unquote(module).compare(unquote(a), unquote(b))    end    case op do    
>>>>>>>   
>>>>>>> :> ->        {:==, [], [cmp_result, :gt]}      :< ->        {:==, [], 
>>>>>>> [cmp_result, :lt]}      :>= ->        {:!=, [], [cmp_result, :lt]}      
>>>>>>> :<= 
>>>>>>> ->        {:!=, [], [cmp_result, :gt]}    end  endend*
>>>>>>>
>>>>>>> I don't think it is actually a good solution to this issue, but just 
>>>>>>> wanted to share the idea.
>>>>>>>
>>>>>>> *(a >= b) |> compare_with(DateTime)*
>>>>>>>
>>>>>>> On Monday, October 31, 2022 at 2:46:09 PM UTC-4 benwil...@gmail.com 
>>>>>>> wrote:
>>>>>>>
>>>>>>> > DateTime.compare(a, :<, b) would get my vote of the alternative 
>>>>>>>> proposals but I think it doesn't move much the needle in comparison to 
>>>>>>>> DateTime.compare.
>>>>>>>>
>>>>>>>> To me this is a pretty big difference difference, because with an 
>>>>>>>> `import` it does 2 things:
>>>>>>>>
>>>>>>>> 1) Eliminates the existence of an irrelevant, boilerplate operator 
>>>>>>>> ==
>>>>>>>> 2) positions the 2 values you care about correctly with respect to 
>>>>>>>> the relevant operator
>>>>>>>>
>>>>>>>> When you have
>>>>>>>>
>>>>>>>> DateTime.compare(a, b) == :lt
>>>>>>>>
>>>>>>>> it's like RPN, you have to hold a and b in your head, remember 
>>>>>>>> their order, then skip past the `==` since it doesn't matter, and 
>>>>>>>> finally 
>>>>>>>> you get to see your comparison. When discussing this in complex 
>>>>>>>> contexts 
>>>>>>>> the need to try to distinguish about whether you're talking about what 
>>>>>>>> the 
>>>>>>>> _function call is equal to_ from whether the values themselves are 
>>>>>>>> equal to 
>>>>>>>> is actually a pretty big deal. There are basically 4 characters with 
>>>>>>>> semantic value, and there rest are boilerplate. When you have a bunch 
>>>>>>>> of 
>>>>>>>> these all next to each other (like when building up complex range 
>>>>>>>> helpers) 
>>>>>>>> https://gist.github.com/benwilson512/456735775028c2da5bd38572d25b7813
>>>>>>>>  it's just a ton of data to filter out.
>>>>>>>>
>>>>>>>> If you could `import DateTime, compare?: 3` this could be
>>>>>>>>
>>>>>>>> compare?(a, :<, b)
>>>>>>>> compare?(a, :<=, b)
>>>>>>>>
>>>>>>>> On Monday, October 31, 2022 at 2:02:03 PM UTC-4 Cliff wrote:
>>>>>>>>
>>>>>>> > in Elixir the subject is always the first argument
>>>>>>>>>
>>>>>>>>> Ah, that clears it up for me, I hadn't yet realized that symmetry 
>>>>>>>>> in the APIs. I like the before?/after? functions now.
>>>>>>>>>
>>>>>>>>> On Monday, October 31, 2022 at 1:16:52 PM UTC-4 José Valim wrote:
>>>>>>>>>
>>>>>>>> I am not worried about the argument order because in Elixir the 
>>>>>>>>>> subject is always the first argument. So it is always "is date1 
>>>>>>>>>> before 
>>>>>>>>>> date2?". I like the :inclusive option if the need ever arises.
>>>>>>>>>>
>>>>>>>>>> DateTime.compare(a, :<, b) would get my vote of the alternative 
>>>>>>>>>> proposals but I think it doesn't move much the needle in comparison 
>>>>>>>>>> to 
>>>>>>>>>> DateTime.compare.
>>>>>>>>>>
>>>>>>>>>> On Mon, Oct 31, 2022 at 5:44 PM Cliff <notcliff...@gmail.com> 
>>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>> I would prefer the atoms *:before*, and *:after* rather than 
>>>>>>>>>>> :gt/:greater_than/etc. Since we're already solving the problem of 
>>>>>>>>>>> operator/argument ordering, why not remove the final mental barrier 
>>>>>>>>>>> of 
>>>>>>>>>>> reasoning about whether a time being "greater than" another time 
>>>>>>>>>>> means that 
>>>>>>>>>>> it is before or after? *foo(a, :gt, b)* still requires a second 
>>>>>>>>>>> thought ("Is a bigger time earlier or later?"), whereas if I read 
>>>>>>>>>>> code that 
>>>>>>>>>>> said *foo(a, :before, b)* I would feel confident in my 
>>>>>>>>>>> understanding after only the first read.
>>>>>>>>>>>
>>>>>>>>>>> On Monday, October 31, 2022 at 12:35:05 PM UTC-4 
>>>>>>>>>>> lui...@gmail.com wrote:
>>>>>>>>>>>
>>>>>>>>>> I also prefer something like *DateTime.compare(a, operator, b)*.
>>>>>>>>>>>>
>>>>>>>>>>>> Operators don't need to be *cryptic* like *:eq*, *:gt*, *:lte*, 
>>>>>>>>>>>> etc., we can use the same comparison operators we already are used 
>>>>>>>>>>>> to:
>>>>>>>>>>>>
>>>>>>>>>>>> *DateTime.compare(a, :<, b)*
>>>>>>>>>>>> *DateTime.compare(a, :==, b)*
>>>>>>>>>>>> *DateTime.compare(a, :>=, b)*
>>>>>>>>>>>>
>>>>>>>>>>>> It's clear and much less verbose than the Ecto's (which was a 
>>>>>>>>>>>> great suggestion, by the way).
>>>>>>>>>>>>
>>>>>>>>>>>> On Monday, October 31, 2022 at 5:23:54 PM UTC+1 
>>>>>>>>>>>> and...@dryga.com wrote:
>>>>>>>>>>>>
>>>>>>>>>>> Hey guys, as an idea why don't we reuse atoms from Ecto: 
>>>>>>>>>>>>>
>>>>>>>>>>>>>    - :less_than
>>>>>>>>>>>>>    - :greater_than
>>>>>>>>>>>>>    - :less_than_or_equal_to
>>>>>>>>>>>>>    - :greater_than_or_equal_to
>>>>>>>>>>>>>    - :equal_to
>>>>>>>>>>>>>    - :not_equal_to
>>>>>>>>>>>>>
>>>>>>>>>>>>> I feel like they are fairly common nowadays and even though 
>>>>>>>>>>>>> it's more to type make it easier to understand when you want an 
>>>>>>>>>>>>> inclusive 
>>>>>>>>>>>>> comparison. 
>>>>>>>>>>>>>
>>>>>>>>>>>>> We can later make it part of all modules that have `compare/2` 
>>>>>>>>>>>>> (Date, DateTime, Time, Version, etc).
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Monday, October 31, 2022 at 10:10:09 AM UTC-6 Cliff wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>> I prefer the form *DateTime.is <http://DateTime.is>(a, 
>>>>>>>>>>>>>> operator, b)*, but I agree with others that it would need a 
>>>>>>>>>>>>>> more sensible name than "is". 
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Regarding the form *DateTime.before?(a, b)*, I could still 
>>>>>>>>>>>>>> see myself getting confused by argument order. *before?(a, 
>>>>>>>>>>>>>> b)* might be read as "before A happened, B happened", rather 
>>>>>>>>>>>>>> than the intended "A happened before B". the *is(a, :before, 
>>>>>>>>>>>>>> b)* form, however, is read exactly how it would be spoken.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Regarding comparison inclusivity, another possibility is a 
>>>>>>>>>>>>>> keyword option: *DateTime.before?(a, b, inclusive: true)*
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Monday, October 31, 2022 at 3:45:15 AM UTC-4 
>>>>>>>>>>>>>> simonmc...@gmail.com wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>> DateTime.before?(a, b) is much nicer than DateTime.compare(a, 
>>>>>>>>>>>>>>> b) == :lt.  It doesn't completely remove the argument order 
>>>>>>>>>>>>>>> issue but I 
>>>>>>>>>>>>>>> reckon it would resolve it for me.  I run DateTime.compare(a, 
>>>>>>>>>>>>>>> b) in iex 
>>>>>>>>>>>>>>> every time I use the function because I'm terribly forgetful 
>>>>>>>>>>>>>>> and paranoid.  
>>>>>>>>>>>>>>> I would prefer DateTime.eq?/lt?/le?/gt?/ge? instead of 
>>>>>>>>>>>>>>> before?/after?/on_or_before?/on_or_after? which is shorter, 
>>>>>>>>>>>>>>> matches 
>>>>>>>>>>>>>>> compare/2 and might allow the le/ge equivalents to sneak 
>>>>>>>>>>>>>>> through.  I think 
>>>>>>>>>>>>>>> it would be a shame to leave out le and ge.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> DateTime.is?/compare?(a, :lt, b) is a whole lot less 
>>>>>>>>>>>>>>> ambiguous to me.  It reads how you would write it in maths or 
>>>>>>>>>>>>>>> spoken 
>>>>>>>>>>>>>>> language.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Monday, 31 October 2022 at 5:08:35 pm UTC+10 
>>>>>>>>>>>>>>> zachary....@gmail.com wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I wonder how much of the issue is the Api and how much of the 
>>>>>>>>>>>>>>>> issue is just the docs? I.e its not a given that all arguments 
>>>>>>>>>>>>>>>> in every 
>>>>>>>>>>>>>>>> position always make sense, but we typically rely on things 
>>>>>>>>>>>>>>>> like elixir_ls 
>>>>>>>>>>>>>>>> to help us when the answer isn't obvious.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Could we perhaps just improve the docs in some way? i.e 
>>>>>>>>>>>>>>>> update the specs to say `datetime :: Calendar.datetime(), 
>>>>>>>>>>>>>>>> compares_to :: 
>>>>>>>>>>>>>>>> Calendar.datetime()`, and have the args say `compare(datetime, 
>>>>>>>>>>>>>>>> compares_to)` and have part of the first line of text say 
>>>>>>>>>>>>>>>> something a bit 
>>>>>>>>>>>>>>>> more informative?
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On Mon, Oct 31, 2022 at 3:02 AM, Jon Rowe <
>>>>>>>>>>>>>>>> ma...@jonrowe.co.uk> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I'm not sure the name is right, but I like
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> DateTime.is?(a <http://datetime.is/?(a>, operator, b), 
>>>>>>>>>>>>>>>>> when operator :lt | :le | :eq | :ge | :gt, which would 
>>>>>>>>>>>>>>>>> capture the :le and 
>>>>>>>>>>>>>>>>> :ge options.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> As a usage api, we could actually have `compare?/3` 
>>>>>>>>>>>>>>>>> especially as the name doesn't overlap with `compare/2` which 
>>>>>>>>>>>>>>>>> would 
>>>>>>>>>>>>>>>>> hopefully alleviate anyones concerns about the return type 
>>>>>>>>>>>>>>>>> changing
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Mon, 31 Oct 2022, at 6:23 AM, José Valim wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> My thought process is that a simple to use API should be 
>>>>>>>>>>>>>>>>> the focus, because we already have a complete API in 
>>>>>>>>>>>>>>>>> Date.compare/2 <http://date.compare/2> and friends.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Mon, Oct 31, 2022 at 02:16 Simon McConnell <
>>>>>>>>>>>>>>>>> simonmc...@gmail.com> wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> would we want on_or_after? and on_or_before? as well 
>>>>>>>>>>>>>>>>> then?  Or something like DateTime.is?(a 
>>>>>>>>>>>>>>>>> <http://datetime.is/?(a>, operator, b), when operator :lt 
>>>>>>>>>>>>>>>>> | :le | :eq | :ge | :gt, which would capture the :le and :ge 
>>>>>>>>>>>>>>>>> options.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Monday, 31 October 2022 at 7:26:42 am UTC+10 José Valim 
>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Thank you!
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> A PR that adds before?/after? to Time, Date, 
>>>>>>>>>>>>>>>>> NaiveDateTime, and DateTime is welcome!
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Sun, Oct 30, 2022 at 6:46 PM Cliff <
>>>>>>>>>>>>>>>>> notcliff...@gmail.com> wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I did a bit of research. Many other languages use some 
>>>>>>>>>>>>>>>>> form of operator overloading to do datetime comparison. The 
>>>>>>>>>>>>>>>>> ones that do 
>>>>>>>>>>>>>>>>> something different:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>    - Java has LocalDateTime.compareTo(other) 
>>>>>>>>>>>>>>>>>    
>>>>>>>>>>>>>>>>> <https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/LocalDateTime.html#compareTo(java.time.chrono.ChronoLocalDateTime)>,
>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>>    returning an integer representing gt/lt/eq. There is also
>>>>>>>>>>>>>>>>>     LocalDateTime.isBefore(other) 
>>>>>>>>>>>>>>>>>    
>>>>>>>>>>>>>>>>> <https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/LocalDateTime.html#isBefore(java.time.chrono.ChronoLocalDateTime)>,
>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>>    LocalDateTime.isAfter(other), and 
>>>>>>>>>>>>>>>>> LocalDateTime.isEqual(other). The
>>>>>>>>>>>>>>>>>     LocalDateTime.is <http://localdatetime.is/>{Before, 
>>>>>>>>>>>>>>>>>    After} methods are non-inclusive (<, >) comparisons. They 
>>>>>>>>>>>>>>>>> are instance 
>>>>>>>>>>>>>>>>>    methods, so usage is like `myTime1.isBefore(myTime2)`
>>>>>>>>>>>>>>>>>    - OCaml's "calendar" library provides a Date.compare 
>>>>>>>>>>>>>>>>>    
>>>>>>>>>>>>>>>>> <https://ocaml.org/p/calendar/3.0.0/doc/CalendarLib/Date/index.html#val-compare>
>>>>>>>>>>>>>>>>>     function that returns an integer representing 
>>>>>>>>>>>>>>>>>    gt/lt/eq (for use in OCaml's List.sort function, which 
>>>>>>>>>>>>>>>>> sorts a list 
>>>>>>>>>>>>>>>>>    according to the provided comparison function). It also 
>>>>>>>>>>>>>>>>> provides
>>>>>>>>>>>>>>>>>     Date.> 
>>>>>>>>>>>>>>>>>    
>>>>>>>>>>>>>>>>> <https://ocaml.org/p/calendar/3.0.0/doc/CalendarLib/Date/index.html#val-(%3E)>,
>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>>    and Date.>= 
>>>>>>>>>>>>>>>>>    
>>>>>>>>>>>>>>>>> <https://ocaml.org/p/calendar/3.0.0/doc/CalendarLib/Date/index.html#val-(%3E=)>,
>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>>    etc. Worth noting is that OCaml allows you to do 
>>>>>>>>>>>>>>>>> expression-level module 
>>>>>>>>>>>>>>>>>    imports, like *Date.(my_t1 > my_t2)* to use Date's *>* 
>>>>>>>>>>>>>>>>> function 
>>>>>>>>>>>>>>>>>    in the parenthesized expression without needing to *open 
>>>>>>>>>>>>>>>>>    Date* in the entire scope ("open" is OCaml's "import") 
>>>>>>>>>>>>>>>>>    - this could potentially be possible in Elixir using a 
>>>>>>>>>>>>>>>>> macro?
>>>>>>>>>>>>>>>>>    - Golang: t1.After(t2) 
>>>>>>>>>>>>>>>>>    <https://pkg.go.dev/time#Time.After>, t1.Before(t2), 
>>>>>>>>>>>>>>>>>    t1.Equal(t2). Non-inclusive (> and <).
>>>>>>>>>>>>>>>>>    - Clojure clj-time library: (after? t1 t2) 
>>>>>>>>>>>>>>>>>    
>>>>>>>>>>>>>>>>> <https://clj-time.github.io/clj-time/doc/clj-time.core.html#var-after.3F>
>>>>>>>>>>>>>>>>>    , (before? t1 t2) 
>>>>>>>>>>>>>>>>>    
>>>>>>>>>>>>>>>>> <https://clj-time.github.io/clj-time/doc/clj-time.core.html#var-before.3F>,
>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>>    and (equal? t1 t2) 
>>>>>>>>>>>>>>>>>    
>>>>>>>>>>>>>>>>> <https://clj-time.github.io/clj-time/doc/clj-time.core.html#var-equal.3F>.
>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>>    IMO the argument order is still confusing in these.
>>>>>>>>>>>>>>>>>    
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Sunday, October 30, 2022 at 3:15:14 AM UTC-4 José Valim 
>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I am definitely in favor of clearer APIs.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> However, it would probably be best to explore how 
>>>>>>>>>>>>>>>>> different libraries in different languages tackle this. Can 
>>>>>>>>>>>>>>>>> you please 
>>>>>>>>>>>>>>>>> explore this? In particular, I am curious to know if 
>>>>>>>>>>>>>>>>> before/after mean "<" 
>>>>>>>>>>>>>>>>> and ">" respectively or if they mean "<=" and "=>" (I assume 
>>>>>>>>>>>>>>>>> the former). 
>>>>>>>>>>>>>>>>> And also if some libraries feel compelled to expose functions 
>>>>>>>>>>>>>>>>> such as 
>>>>>>>>>>>>>>>>> "after_or_equal" or if users would have to write 
>>>>>>>>>>>>>>>>> Date.equal?(date1, date2) 
>>>>>>>>>>>>>>>>> or Date.earlier?(date1, date2), which would end-up doing the 
>>>>>>>>>>>>>>>>> double of 
>>>>>>>>>>>>>>>>> conversions.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> -- 
>>>>>>>>>>>>>>>>> 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/fcd07389-c6a0-497d-9c09-7f1eacf620c6n%40googlegroups.com
>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/fcd07389-c6a0-497d-9c09-7f1eacf620c6n%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/e6c55604-c3ea-464c-908c-5a6092f4d8edn%40googlegroups.com
>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/e6c55604-c3ea-464c-908c-5a6092f4d8edn%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%2ByT9jA7uqGX0Cyapgfx0AjW%2BU_d4Ai-NQ6vD9UsEb2uQ%40mail.gmail.com
>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4%2ByT9jA7uqGX0Cyapgfx0AjW%2BU_d4Ai-NQ6vD9UsEb2uQ%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/2e821e87-6ee0-4702-b69f-e2616b61b1dd%40app.fastmail.com
>>>>>>>>>>>>>>>>>  
>>>>>>>>>>>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/2e821e87-6ee0-4702-b69f-e2616b61b1dd%40app.fastmail.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/7435b979-d0eb-4726-aa65-a94ada53d320n%40googlegroups.com
>>>>>>>>>>>  
>>>>>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/7435b979-d0eb-4726-aa65-a94ada53d320n%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/2ca24f84-0a77-4dcc-8917-83ef18bba16an%40googlegroups.com
>>>>>>>  
>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/2ca24f84-0a77-4dcc-8917-83ef18bba16an%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/89619070-2b42-409a-bdeb-1259375f7f14n%40googlegroups.com
>>>>>>  
>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/89619070-2b42-409a-bdeb-1259375f7f14n%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%2BPces0tbWQeZr-iuC%2BZWEyugRJ_9Op8d6oKZ6MmsQAkQ%40mail.gmail.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4%2BPces0tbWQeZr-iuC%2BZWEyugRJ_9Op8d6oKZ6MmsQAkQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>
>>>>
>>>> -- 
>>>> Austin Ziegler • halos...@gmail.com • aus...@halostatue.ca
>>>> http://www.halostatue.ca/http://twitter.com/halostatue
>>>>
>>>

-- 
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/7d7af1d6-bff7-4fbe-a3c4-0da74ac104d9n%40googlegroups.com.

Reply via email to