-
Notifications
You must be signed in to change notification settings - Fork 206
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore: use a better API for stringifyRatio functions (#2795)
- Loading branch information
1 parent
c811c41
commit 6751d85
Showing
6 changed files
with
200 additions
and
92 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
export * from './display'; | ||
export * from './natValue/stringifyRatioAsFraction'; | ||
export * from './natValue/stringifyRatio'; | ||
export * from './natValue/stringifyRatioNumerator'; | ||
export * from './natValue/stringifyRatioAsPercent'; |
73 changes: 34 additions & 39 deletions
73
packages/ui-components/src/display/natValue/stringifyRatio.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,53 +1,48 @@ | ||
// @ts-check | ||
|
||
import { assert } from '@agoric/assert'; | ||
import { isNatValue } from '@agoric/ertp'; | ||
|
||
// eslint-disable-next-line import/no-extraneous-dependencies | ||
import '@agoric/zoe/exported'; | ||
|
||
import { stringifyNat } from './stringifyNat'; | ||
import { assert, details } from '@agoric/assert'; | ||
import { captureNum } from './helpers/captureNum'; | ||
import { roundToDecimalPlaces } from './helpers/roundToDecimalPlaces'; | ||
|
||
const PLACES_TO_SHOW = 2; | ||
|
||
/** | ||
* | ||
* @param {Ratio} ratio | ||
* @param {{ numDecimalPlaces?: number, | ||
numPlacesToShow?: number, | ||
denomDecimalPlaces?: number, | ||
denomPlacesToShow?: number, | ||
getDecimalPlaces?: Function }} [options] | ||
* | ||
* @param {Ratio} ratio | ||
* @param {(brand: Brand) => number | undefined} getDecimalPlaces | ||
* @param {number} [placesToShow] | ||
* @returns {string} | ||
*/ | ||
export const stringifyRatio = (ratio, options) => { | ||
const { | ||
numPlacesToShow = PLACES_TO_SHOW, | ||
denomPlacesToShow = PLACES_TO_SHOW, | ||
getDecimalPlaces = undefined, | ||
} = options || {}; | ||
let { numDecimalPlaces, denomDecimalPlaces } = options || {}; | ||
|
||
assert(isNatValue(ratio.numerator.value)); | ||
assert(isNatValue(ratio.denominator.value)); | ||
|
||
if (getDecimalPlaces !== undefined) { | ||
numDecimalPlaces = getDecimalPlaces(ratio.numerator.brand); | ||
denomDecimalPlaces = getDecimalPlaces(ratio.denominator.brand); | ||
export const stringifyRatio = ( | ||
ratio, | ||
getDecimalPlaces, | ||
placesToShow = PLACES_TO_SHOW, | ||
) => { | ||
if (ratio === null || ratio === undefined) { | ||
return '0'; | ||
} | ||
assert( | ||
ratio && ratio.numerator, | ||
details`Ratio ${ratio} did not look like a ratio`, | ||
); | ||
|
||
assert(numDecimalPlaces !== undefined, `numDecimalPlaces required`); | ||
assert(denomDecimalPlaces !== undefined, `denomDecimalPlaces required`); | ||
const numDecimalPlaces = getDecimalPlaces(ratio.numerator.brand); | ||
const denomDecimalPlaces = getDecimalPlaces(ratio.denominator.brand); | ||
|
||
const numeratorString = stringifyNat( | ||
ratio.numerator.value, | ||
assert( | ||
numDecimalPlaces, | ||
numPlacesToShow, | ||
`decimalPlaces for numerator ${ratio.numerator} must be provided`, | ||
); | ||
const denominatorString = stringifyNat( | ||
ratio.denominator.value, | ||
assert( | ||
denomDecimalPlaces, | ||
denomPlacesToShow, | ||
`decimalPlaces for denominator ${ratio.denominator} must be provided`, | ||
); | ||
return `${numeratorString} / ${denominatorString}`; | ||
const denomPower = 10n ** BigInt(denomDecimalPlaces); | ||
const numPower = 10n ** BigInt(numDecimalPlaces); | ||
const numerator = ratio.numerator.value * denomPower; | ||
const denominator = ratio.denominator.value * numPower; | ||
const str = `${Number(numerator) / Number(denominator)}`; | ||
const capturedNum = captureNum(str); | ||
return `${capturedNum.left}.${roundToDecimalPlaces( | ||
capturedNum.right, | ||
placesToShow, | ||
)}`; | ||
}; |
53 changes: 53 additions & 0 deletions
53
packages/ui-components/src/display/natValue/stringifyRatioAsFraction.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
// @ts-check | ||
|
||
import { assert } from '@agoric/assert'; | ||
import { isNatValue } from '@agoric/ertp'; | ||
|
||
// eslint-disable-next-line import/no-extraneous-dependencies | ||
import '@agoric/zoe/exported'; | ||
|
||
import { stringifyNat } from './stringifyNat'; | ||
|
||
const PLACES_TO_SHOW = 2; | ||
|
||
/** | ||
* @param {Ratio} ratio | ||
* @param {(brand: Brand) => number | undefined } getDecimalPlaces | ||
* @param {number} [numPlacesToShow] | ||
* @param {number} [denomPlacesToShow] | ||
* @returns {string} | ||
*/ | ||
export const stringifyRatioAsFraction = ( | ||
ratio, | ||
getDecimalPlaces, | ||
numPlacesToShow = PLACES_TO_SHOW, | ||
denomPlacesToShow = PLACES_TO_SHOW, | ||
) => { | ||
assert(isNatValue(ratio.numerator.value)); | ||
assert(isNatValue(ratio.denominator.value)); | ||
|
||
const numDecimalPlaces = getDecimalPlaces(ratio.numerator.brand); | ||
const denomDecimalPlaces = getDecimalPlaces(ratio.denominator.brand); | ||
|
||
assert( | ||
numDecimalPlaces, | ||
`decimalPlaces for numerator ${ratio.numerator} must be provided`, | ||
); | ||
assert( | ||
denomDecimalPlaces, | ||
`decimalPlaces for denominator ${ratio.denominator} must be provided`, | ||
); | ||
const numeratorString = stringifyNat( | ||
// @ts-ignore value is BigInt | ||
ratio.numerator.value, | ||
numDecimalPlaces, | ||
numPlacesToShow, | ||
); | ||
const denominatorString = stringifyNat( | ||
// @ts-ignore value is BigInt | ||
ratio.denominator.value, | ||
denomDecimalPlaces, | ||
denomPlacesToShow, | ||
); | ||
return `${numeratorString} / ${denominatorString}`; | ||
}; |
54 changes: 54 additions & 0 deletions
54
packages/ui-components/src/display/natValue/stringifyRatioAsPercent.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
// @ts-check | ||
|
||
import { assert, details } from '@agoric/assert'; | ||
import '@agoric/zoe/exported'; | ||
|
||
import { captureNum } from './helpers/captureNum'; | ||
import { roundToDecimalPlaces } from './helpers/roundToDecimalPlaces'; | ||
|
||
const PERCENT_BASE = 100n; | ||
const PLACES_TO_SHOW = 2; | ||
|
||
/** | ||
* @param {Ratio} ratio | ||
* @param {(brand: Brand) => number | undefined } getDecimalPlaces | ||
* @param {number} [placesToShow] | ||
* @returns {string} | ||
*/ | ||
export const stringifyRatioAsPercent = ( | ||
ratio, | ||
getDecimalPlaces, | ||
placesToShow = PLACES_TO_SHOW, | ||
) => { | ||
if (ratio === null || ratio === undefined) { | ||
return '0'; | ||
} | ||
assert( | ||
ratio && ratio.numerator, | ||
details`Ratio ${ratio} did not look like a ratio`, | ||
); | ||
|
||
const numDecimalPlaces = getDecimalPlaces(ratio.numerator.brand); | ||
const denomDecimalPlaces = getDecimalPlaces(ratio.denominator.brand); | ||
|
||
assert( | ||
numDecimalPlaces, | ||
`decimalPlaces for numerator ${ratio.numerator} must be provided`, | ||
); | ||
assert( | ||
denomDecimalPlaces, | ||
`decimalPlaces for denominator ${ratio.denominator} must be provided`, | ||
); | ||
const denomPower = 10n ** BigInt(denomDecimalPlaces); | ||
const numPower = 10n ** BigInt(numDecimalPlaces); | ||
// @ts-ignore value is BigInt | ||
const numerator = ratio.numerator.value * denomPower * PERCENT_BASE; | ||
// @ts-ignore value is BigInt | ||
const denominator = ratio.denominator.value * numPower; | ||
const str = `${Number(numerator) / Number(denominator)}`; | ||
const capturedNum = captureNum(str); | ||
return `${capturedNum.left}.${roundToDecimalPlaces( | ||
capturedNum.right, | ||
placesToShow, | ||
)}`; | ||
}; |
41 changes: 0 additions & 41 deletions
41
packages/ui-components/src/display/natValue/stringifyRatioNumerator.js
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters