{"id":16178004,"url":"https://github.com/javiercejudo/linear-converter","last_synced_at":"2025-10-12T23:59:45.295Z","repository":{"id":28267862,"uuid":"31778196","full_name":"javiercejudo/linear-converter","owner":"javiercejudo","description":":triangular_ruler: Flexible linear converter with built-in composition and inversion","archived":false,"fork":false,"pushed_at":"2017-02-05T19:16:01.000Z","size":269,"stargazers_count":6,"open_issues_count":71,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-10-11T23:33:11.354Z","etag":null,"topics":["conversion","linear-converter","units"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/linear-converter","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/javiercejudo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-03-06T16:29:50.000Z","updated_at":"2023-03-10T11:20:36.000Z","dependencies_parsed_at":"2022-08-27T16:12:16.878Z","dependency_job_id":null,"html_url":"https://github.com/javiercejudo/linear-converter","commit_stats":null,"previous_names":[],"tags_count":44,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javiercejudo%2Flinear-converter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javiercejudo%2Flinear-converter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javiercejudo%2Flinear-converter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javiercejudo%2Flinear-converter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/javiercejudo","download_url":"https://codeload.github.com/javiercejudo/linear-converter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221662750,"owners_count":16859740,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["conversion","linear-converter","units"],"created_at":"2024-10-10T05:11:42.835Z","updated_at":"2025-10-12T23:59:40.259Z","avatar_url":"https://github.com/javiercejudo.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# linear-converter\n\n[![Build Status](https://travis-ci.org/javiercejudo/linear-converter.svg?branch=master)](https://travis-ci.org/javiercejudo/linear-converter)\n[![Coverage Status](https://coveralls.io/repos/javiercejudo/linear-converter/badge.svg?branch=master)](https://coveralls.io/r/javiercejudo/linear-converter?branch=master)\n[![Code Climate](https://codeclimate.com/github/javiercejudo/linear-converter/badges/gpa.svg)](https://codeclimate.com/github/javiercejudo/linear-converter)\n[![Inline docs](http://inch-ci.org/github/javiercejudo/linear-converter.svg?branch=master)](http://inch-ci.org/github/javiercejudo/linear-converter)\n\n[![Sauce Test Status](https://saucelabs.com/browser-matrix/linear-converter.svg)](https://saucelabs.com/u/linear-converter)\n\nFlexible linear converter\n\n## Table of contents\n\n- [Installation](#installation)\n- [Basic usage](#basic-usage)\n- [Conversion inversion](#conversion-inversion)\n- [Conversions composition](#conversions-composition)\n- [Custom conversions](#custom-conversions)\n- [Coefficients](#coefficients)\n- [Conversion equivalence](#conversion-equivalence)\n- [Arbitrary precision](#arbitrary-precision)\n- [Currying](#currying)\n- [See more](#see-more)\n- [Related projects](#related-projects)\n\n## Installation\n\n### npm\n\n    npm i linear-converter\n\n### Bower\n\n    bower install linear-converter\n\nTo use it in the browser, include the following on your site:\n\n```js\n\u003cscript src=\"bower_components/linear-converter/dist/linear-converter.min.js\"\u003e\u003c/script\u003e\n```\n\n## Basic usage\n\n*linear-converter* uses the [arbitrary-precision](https://github.com/javiercejudo/arbitrary-precision)\npackage to support arbitrary precision.\nSee [all available adapters](https://www.npmjs.com/browse/keyword/arbitrary-precision-adapter).\n\n```js\nvar Decimal = require('arbitrary-precision')(require('floating-adapter'));\nvar lc = require('linear-converter')(Decimal);\n\n// 0°C and 100°C are 32°F and 212°F\nvar celsiusToFahrenheit = [[0, 100], [32, 212]];\n\nlc.convert(celsiusToFahrenheit, 25); // =\u003e new Decimal('77')\n\n// also accepts Decimals\nlc.convert(celsiusToFahrenheit, new Decimal('25'));\n```\n\nReady-to-use conversions can be found in the [linear-presets](https://github.com/javiercejudo/linear-presets) package.\n\nFor a quick interactive intro, see [CodePen example](http://codepen.io/javiercejudo/pen/PwvePd?editors=101).\n\nVariants:\n\n- [linear-converter-to-go](https://github.com/javiercejudo/linear-converter-to-go): opinionated, zero-configuration version with floating point precision and built-in conversion presets.\n- [linear-conversion](https://github.com/javiercejudo/linear-conversion): if you prefer the object-oriented paradigm.\n- [linear-converter-cli](https://github.com/javiercejudo/linear-converter-cli): for CLI use.\n\n## Conversion inversion\n\n```js\nvar fahrenheitToCelsius = lc.invertConversion(celsiusToFahrenheit);\n\nlc.convert(fahrenheitToCelsius, 77); // =\u003e 25 (as decimal)\n```\n\n## Conversions composition\n\n```js\nvar kelvinToCelsius = [[273.15, 373.15], [0, 100]];\nvar kelvinToFahrenheit = lc.composeConversions(kelvinToCelsius, celsiusToFahrenheit);\n\nlc.convert(kelvinToFahrenheit, 293.15); // =\u003e 68 (as decimal)\n```\n\n## Custom conversions\n\nCustom conversions are achieved by passing an array with 2 scales, each\nof those an array with 2 values. For example, **[[0, 1], [0, 2]]** means that 0 and\n1 in the first scale map to 0 and 2 in the second scale respectively; in short,\nit multiplies by 2. Any linear conversion can be described that way:\n\n```js\n// f(x) = ax + b\nlc.convert([[0, 1], [b, a+b]], x); // =\u003e ax + b (as Decimal)\nlc.convert([[1/a, -b/a], [b+1, 0]], x); // =\u003e ax + b (as Decimal)\n```\n\nFor an arbitrary f(_x_) = _ax + b_, any [[_x\u003csub\u003e1\u003c/sub\u003e_, _x\u003csub\u003e2\u003c/sub\u003e_], [f(_x\u003csub\u003e1\u003c/sub\u003e_), f(_x\u003csub\u003e2\u003c/sub\u003e_)]] is a valid conversion.\n\nMore examples:\n\n```js\n// degrees to radians\nlc.convert([[0, 180], [0, Math.PI]], 240); // =\u003e 4 * Math.PI / 3 (as Decimal)\n\n// f(x) = 3x\nlc.convert([[0, 1/3], [0, 1]], 5); // =\u003e 15 (as Decimal)\n\n// f(x) = -2x - 46\nlc.convert([[0, 1], [-46, -48]], -23); // =\u003e 0 (as Decimal)\n```\n\n## Coefficients\n\n```js\n// f(x) = 2x + 1\nlc.getCoefficientA([[0, 1], [1, 3]]); // =\u003e 2 (as Decimal)\nlc.getCoefficientB([[0, 1], [1, 3]]); // =\u003e 1 (as Decimal)\n\n// f(x) = ax + b\nlc.getCoefficientA([[x1, x2], [f(x1), f(x2)]]); // =\u003e a (as Decimal)\nlc.getCoefficientB([[x1, x2], [f(x1), f(x2)]]); // =\u003e b (as Decimal)\n```\n\n## Conversion equivalence\n\n```js\n// f(x) = -3x + 6\nlc.equivalentConversions(\n  [[1, 5], [3, -9]],\n  [[-1, 100], [9, -294]]\n); // =\u003e true\n\nlc.equivalentConversions(\n  [[0, 1], [0, 2]], // f(x) = 2x\n  [[0, 1], [0, 3]]  // f(x) = 3x\n); // =\u003e false\n```\n\n## Arbitrary precision\n\nArbitrary precision support is provided via the [arbitrary-precision](https://github.com/javiercejudo/arbitrary-precision) package.\nSee [all available adapters](https://www.npmjs.com/browse/keyword/arbitrary-precision-adapter).\n\n```js\n// without arbitrary precision (very lightweight)\nvar Decimal = require('arbitrary-precision')(require('floating-adapter'));\nvar lc = require('linear-converter')(Decimal);\n\nlc.getCoefficientA([[0, 0.1], [0.1, 0.3]]); // =\u003e 1.9999999999999998 (as Decimal)\n\n// with arbitrary precision\nvar Decimal = require('arbitrary-precision')(require('bigjs-adapter'));\nvar lc = require('linear-converter')(Decimal);\n\nlc.getCoefficientA([[0, 0.1], [0.1, 0.3]]); // =\u003e 2 (as Decimal)\n```\n\nSee [CodePen example](http://codepen.io/javiercejudo/pen/WvEWdQ?editors=101).\n\n## Currying\n\n```js\nvar convert = require('lodash.curry')(lc.convert);\n\nconvert(celsiusToFahrenheit, 25); // =\u003e 77 (as Decimal)\n\nvar cToF = convert(celsiusToFahrenheit);\n\ncToF(25); // =\u003e 77 (as Decimal)\n```\n\nSee [CodePen example](http://codepen.io/javiercejudo/pen/wKKbLV?editors=101).\n\n## See more\n\n- [spec](test/node/spec.js)\n- [all conversion presets](https://github.com/javiercejudo/linear-presets#presets)\n\n## Related projects\n\n- [linear-conversion](https://github.com/javiercejudo/linear-conversion): linear conversion class for linear-converter.\n- [linear-converter-cli](https://github.com/javiercejudo/linear-converter-cli): CLI for linear-converter.\n- [rescale](https://github.com/javiercejudo/rescale): rescales a point given two scales.\n- [scale](https://github.com/javiercejudo/scale): scales normalised data.\n- [normalise](https://github.com/javiercejudo/normalise): normalise data to [0, 1].\n- [rescale-util](https://github.com/javiercejudo/rescale-util): rescale utilities.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaviercejudo%2Flinear-converter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjaviercejudo%2Flinear-converter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaviercejudo%2Flinear-converter/lists"}