json-joy
Version:
Collection of libraries for building collaborative editing apps.
54 lines (53 loc) • 1.95 kB
JavaScript
import { sort } from '@jsonjoy.com/util/lib/sort/insertion';
export var CONST;
(function (CONST) {
CONST[CONST["START_STATE"] = 5381] = "START_STATE";
CONST[CONST["NULL"] = 982452847] = "NULL";
CONST[CONST["TRUE"] = 982453247] = "TRUE";
CONST[CONST["FALSE"] = 982454243] = "FALSE";
CONST[CONST["ARRAY"] = 982452259] = "ARRAY";
CONST[CONST["STRING"] = 982453601] = "STRING";
CONST[CONST["OBJECT"] = 982454533] = "OBJECT";
})(CONST || (CONST = {}));
export const updateNum = (state, num) => {
return (state << 5) + state + num;
};
export const updateStr = (state, str) => {
let i = str.length;
while (i)
state = (state << 5) + state + str.charCodeAt(--i);
return state;
};
export const updateJson = (state, json) => {
switch (typeof json) {
case 'number':
return updateNum(state, json);
case 'string':
state = updateNum(state, CONST.STRING);
return updateStr(state, json);
case 'object': {
if (json === null)
return updateNum(state, CONST.NULL);
if (json instanceof Array) {
const length = json.length;
state = updateNum(state, CONST.ARRAY);
for (let i = 0; i < length; i++)
state = updateJson(state, json[i]);
return state;
}
state = updateNum(state, CONST.OBJECT);
const keys = sort(Object.keys(json));
const length = keys.length;
for (let i = 0; i < length; i++) {
const key = keys[i];
state = updateStr(state, key);
state = updateJson(state, json[key]);
}
return state;
}
case 'boolean':
return updateNum(state, json ? CONST.TRUE : CONST.FALSE);
}
return state;
};
export const hash = (json) => updateJson(CONST.START_STATE, json) >>> 0;