Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion __tests__/index.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,28 @@
import n32, { getSymbol } from '../dist';
import n32, { n32decode, getSymbol, getSymbolValue } from '../dist';

describe('n32', () => {
it('returns a valid string', () => {
expect(n32(0)).toBe('0');
expect(n32(31)).toBe('z');
expect(n32(32)).toBe('10');
expect(n32(1035280)).toBe('zk0g');
expect(n32(Number.MAX_SAFE_INTEGER)).toBe('7zzzzzzzzzz');
});
it('throws an error', () => {
expect(() => n32(-1)).toThrowError('n32 expects an absolute number.');
});
});

describe('n32decode', () => {
it('returns a valid number', () => {
expect(n32decode('0')).toBe(0);
expect(n32decode('z')).toBe(31);
expect(n32decode('10')).toBe(32);
expect(n32decode('0zk0g')).toBe(1035280);
expect(n32decode('7zzzzzzzzzz')).toBe(Number.MAX_SAFE_INTEGER);
});
});

describe('getSymbol', () => {
it('returns a valid symbol', () => {
expect(getSymbol(0)).toBe('0');
Expand All @@ -25,3 +36,12 @@ describe('getSymbol', () => {
);
});
});

describe('getSymbolValue', () => {
it('returns a valid symbol value', () => {
expect(getSymbolValue('0')).toBe(0);
expect(getSymbolValue('9')).toBe(9);
expect(getSymbolValue('a')).toBe(10);
expect(getSymbolValue('z')).toBe(31);
});
});
18 changes: 18 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ export const getSymbol = (index: number): string => {
return SYMBOLS.charAt(index);
};

export const getSymbolValue = (symbol: string): number => {
return '0123456789abcdefghjkmnpqrstvwxyz'.search(symbol);
};

const n32 = (number: number): string => {
if (number < 0) throw new Error('n32 expects an absolute number.');
if (number < 32) return getSymbol(number);
Expand All @@ -22,4 +26,18 @@ const n32 = (number: number): string => {
return m;
};

export const n32decode = (n32: string): number => {
const BASE = 32;
let n = n32.length;
let s = 0;

while (n > 0) {
n--;
const symbol = n32[n32.length - n - 1];
s = getSymbolValue(symbol) * BASE ** n + s;
}

return s;
};

export default n32;