Small camelCase conversion adjustments (#1537)

* Small camelCase conversion adjustments

* Remove unused exports

* Extract formatRuns
This commit is contained in:
Jaco
2022-06-16 16:07:45 +03:00
committed by GitHub
parent 6c1b0e7346
commit b774b7804b
5 changed files with 34 additions and 12 deletions
+5 -1
View File
@@ -53,6 +53,9 @@ describe('stringCamelCase', (): void => {
expect(
stringCamelCase('DEDUP_KEY_PREFIX')
).toEqual('dedupKeyPrefix');
expect(
stringCamelCase(String('DEDUP_KEY_PREFIX'))
).toEqual('dedupKeyPrefix');
expect(
stringCamelCase('SOMETHING')
).toEqual('something');
@@ -109,5 +112,6 @@ describe('stringCamelCase', (): void => {
).toEqual('aBCDef');
});
performance('stringCamelCase', 100_000, randomWords, stringCamelCase);
performance('stringCamelCase (random)', 100_000, randomWords, stringCamelCase);
performance('stringCamelCase (NFTOrder)', 100_000, [['NFTOrder']], stringCamelCase);
});
+17 -7
View File
@@ -3,6 +3,18 @@
import type { AnyString } from '../types';
export const CC_TO_UP = new Array<string>(256);
export const CC_TO_LO = new Array<string>(256);
for (let i = 0; i < CC_TO_UP.length; i++) {
CC_TO_LO[i] = String.fromCharCode(i).toLowerCase();
CC_TO_UP[i] = String.fromCharCode(i).toUpperCase();
}
function formatRuns (w: string): string {
return w.slice(0, w.length - 1).toLowerCase() + CC_TO_UP[w.charCodeAt(w.length - 1)];
}
// Inspired from https://stackoverflow.com/a/2970667
//
// this is not as optimal as the original answer (we split into multiple),
@@ -10,24 +22,22 @@ import type { AnyString } from '../types';
// a major improvement over the original camelcase npm package (at running)
//
// original: 20.88 μs/op
// this: 1.20 μs/op
// this: 1.09 μs/op
//
// Caveat of this: only Ascii, but acceptable for the intended usecase
function converter (format: (w: string, i: number) => string): (value: AnyString) => string {
const formatRuns = (w: string) => w.slice(0, w.length - 1).toLowerCase() + w.slice(-1).toUpperCase();
return (value: AnyString): string => {
const parts = value
.toString()
// replace all seperators (including consequtive) with spaces
.replace(/[-_., ]+/g, ' ')
// we don't want leading or trailing spaces
.trim()
// split into words
.split(' ');
const count = parts.length;
let result = '';
for (let i = 0; i < parts.length; i++) {
for (let i = 0; i < count; i++) {
const w = parts[i];
// apply the formatting
@@ -52,7 +62,7 @@ function converter (format: (w: string, i: number) => string): (value: AnyString
*/
export const stringCamelCase = converter((w, i) =>
// lowercase for first letter/first word, else uppercase first, rest unchanged
(i ? w[0].toUpperCase() : w[0].toLowerCase()) + w.slice(1)
(i ? CC_TO_UP[w.charCodeAt(0)] : CC_TO_LO[w.charCodeAt(0)]) + w.slice(1)
);
/**
@@ -61,5 +71,5 @@ export const stringCamelCase = converter((w, i) =>
*/
export const stringPascalCase = converter((w) =>
// uppercase the first character, leave the rest unchanged
w[0].toUpperCase() + w.slice(1)
CC_TO_UP[w.charCodeAt(0)] + w.slice(1)
);
@@ -1,6 +1,7 @@
// Copyright 2017-2022 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { performance } from '../test/performance';
import { stringLowerFirst } from '.';
describe('stringLowerFirst', (): void => {
@@ -33,4 +34,6 @@ describe('stringLowerFirst', (): void => {
stringLowerFirst(null)
).toBe('');
});
performance('stringLowerFirst', 1_000_000, [['HelloWorldSomething']], stringLowerFirst);
});
+6 -4
View File
@@ -3,10 +3,12 @@
import type { AnyString } from '../types';
function converter (fn: (value: string) => string): (value?: AnyString | null) => string {
import { CC_TO_LO, CC_TO_UP } from './camelCase';
function converter (map: string[]): (value?: AnyString | null) => string {
return (value?: AnyString | null): string =>
value
? fn(value[0]) + value.slice(1)
? map[value.charCodeAt(0)] + value.slice(1)
: '';
}
@@ -24,7 +26,7 @@ function converter (fn: (value: string) => string): (value?: AnyString | null) =
* stringLowerFirst('ABC'); // => 'aBC'
* ```
*/
export const stringLowerFirst = converter((s) => s.toLowerCase());
export const stringLowerFirst = converter(CC_TO_LO);
/**
* @name stringUpperFirst
@@ -40,4 +42,4 @@ export const stringLowerFirst = converter((s) => s.toLowerCase());
* stringUpperFirst('abc'); // => 'Abc'
* ```
*/
export const stringUpperFirst = converter((s) => s.toUpperCase());
export const stringUpperFirst = converter(CC_TO_UP);
@@ -1,6 +1,7 @@
// Copyright 2017-2022 @polkadot/util authors & contributors
// SPDX-License-Identifier: Apache-2.0
import { performance } from '../test/performance';
import { stringUpperFirst } from '.';
describe('stringUpperFirst', (): void => {
@@ -33,4 +34,6 @@ describe('stringUpperFirst', (): void => {
stringUpperFirst(null)
).toBe('');
});
performance('stringUpperFirst', 1_000_000, [['helloWorldSomething']], stringUpperFirst);
});