Wealth Wizards выпустила две собственные библиотеки Javascript в качестве библиотек NPM с открытым исходным кодом.

Ramda-Десятичный

Во-первых, у нас есть ramda-decimal — очень маленькая оболочка вокруг Decimal.js, что делает его более удобным для использования с Ramda.

В Wealth Wizards мы делаем много финансовых расчетов, и для этого математики с плавающей запятой недостаточно. Decimal.js дает нам десятичную математику с произвольной точностью, и это здорово.

Но мы также пишем большую часть нашего кода обработки, используя Ramda, и хотя его не совсем сложно использовать, между стилем verb(noun) Ramda и стилем noun.verb() Decimal есть противоречие:

const value = R.pipe(
    n => new Decimal(b),
    d => d.times(growthRate)
)

ramda-decimal просто предоставляет функции, которые оборачивают методы Decimal. Все функции используют curry() Ramda, поэтому вы можете использовать их в бесточечном стиле:

const RD = require('ramda-decimal');
const value = R.pipe(
    RD.decimal,
    RD.times(growthRate)
);

Если вы используете Ramda и вам нужны математические вычисления с произвольной точностью, попробуйте. Мы реализовали все функции, которые нам нужны в настоящее время, и многие другие основные операции, которые предоставляет Decimal. Мы планируем добавить больше функций Decimal, но запросы функций через «проблемы» GitHub будут воодушевлять нас — или, что еще лучше, мы любим получать запросы на включение.

Год месяц

Затем мы выпустили year-month. Одна из основных вещей, которую мы делаем в Wealth Wizards, — это моделирование прогнозируемых финансов семьи. Так получилось, что наименьшая единица, которую мы моделируем, — это месяц.

Мы использовали Moment.js для представления дат. Moment — отличная библиотека для обработки дат (Luxon, созданная той же командой, еще лучше, так как она поддерживает неизменяемые объекты). Однако мы заметили, что наш код стал более сложным, чем нужно, поскольку наш код использовал Moment объектов с точностью до миллисекунды для представления целого месяца.

Мы также заметили, что некоторые операции над Moment действительно замедляли нашу обработку. Это была полностью наша вина, потому что мы просили Moment сделать что-то, что на самом деле не было его сильной стороной, и мы делали это в большом цикле.

thousandsOfEntries.forEach( e => {
   if(moment.utc(e.startDate).isBefore(someDate, 'month')) {
       doSomething();
   }
});

Оказывается, по неизбежным причинам moment.utc() дорого, как и moment.isBefore(m, 'month'). Это связано с тем, что в обоих случаях он должен переводиться между годом и месяцем и некоторым количеством миллисекунд, принимая во внимание високосные годы, високосные секунды, количество дней в каждом месяце и т. д. Никакие эти дорогостоящие вычисления не нужны, если мы Вас интересуют только месяцы.

Введите year-month, который использует неизменяемые объекты, такие как Luxon, и работает путем очень простого преобразования года и месяца в целое число месяцев с января 1970 года, предполагая, что все годы состоят из 12 месяцев.

year-month используется в производстве, и API считается стабильным. Мы на грани того, чтобы сделать это официальным, подняв версию до 1.0.

Мы по-прежнему используем Moment и Luxon в тех частях нашего кода, которые должны измерять меньшие единицы времени, чем месяц.

Опять же, мы любим общение. Если вы считаете, что мы можем сделать year-month лучше, сообщите нам об этом через GitHub. Или, что еще лучше, мы очень любим запросы на вытягивание.

Ссылки: