/**
 *
 * @param {string | null | number} string
 * @param {(this: any, key: string, value: any) => any} [reviver]
 * @returns {Object<string, any> | Object<string, any>[] | undefined}
 */
function parse(string, reviver) {
    if (!string) return undefined;
    if (typeof string == "object") return string;
    if (typeof string !== "string") return undefined;
    try {
        return JSON.parse(string, reviver);
    } catch (error) {
        return undefined;
    }
}

/**
 *
 * @param {any} value
 * @param {((this: any, key: string, value: any) => any) | null} [replacer]
 * @param { string | number } [space]
 * @returns {string | undefined}
 */
function stringify(value, replacer, space) {
    try {
        return JSON.stringify(value, replacer, space);
    } catch (error) {
        return undefined;
    }
}

const EJSON = {
    parse,
    stringify,
};

module.exports = EJSON;
