Hey guys! I am back from vacation, during which I had some great new ideas.
Numbers has been completely overhauled!
A release candidate for version five (v5.0.0-rc0
) is now available on Hex. Please give it a whirl and let me know if you find any rough edges.
This is a major version release because the internal structure is completely changed (and some old exceptions that used to be thrown at certain times no longer exist):
- Instead of one
Numeric
behaviours as previously, a whole set of Protocols is now used, so types are no longer required to implement all of the operations if only some of them make sense for a certain numeric type (and when you get into more niche mathematical realms like the realm of elliptic curves for instance, these things do happen very frequently). - Using protocols also means that libraries are no longer forced to use the (semi-arbitrarily) function names that Numbers uses for the different operations.
- Dispatching based on (consolidated!) protocols also means that the library should be a lot more performant. Although I have not done any benchmarks, in the old version of the library there were a lot of extra run-time checks going on that are now unnecessary.
- A new library called coerce now handles the optional coercion of data types. Previously, coercion was something that was completely handled at runtime. Now, most of it already happens at compile-time, meaning that coercion is probably a lot faster too.
coerce
also has a lot clearer, more explicit way to define coercions, which I am very happy about as well. - No longer ‘ad hoc’ Decimal support. Decimal is now an optional dependency with an explicit version number, and a Decimal-implementation of the protocols is made conditionally using
Code.ensure_loaded?
, so you’ll only need to addNumbers
to e.g. your Phoenix project to get started. Since Numbers will automatically coerce integers and floats to decimals if the other number in an operation is a decimal, this might really increase the readability of your mathematical algorithms. Thanks to @ericmj for telling me about optional dependencies, and also forDecimal
itself.
I am very eager for feedback! I feel Numbers is getting quite mature now.
A full-fledged version will be released as soon as I’m convinced there are no glaring oversights anymore, and I’ll update ComplexNum
, Tensor
, Rational
and FunLand
at the same time to support the new version as well.