RolandJansen/intermix.js

View on GitHub
src/helper.ts

Summary

Maintainability
D
2 days
Test Coverage
A
95%
export const getRandomString = (length: number): string => {
    const randomChars: string[] = [];
    const input = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    if (length > 0) {
        for (let i = 0; i < length; i++) {
            randomChars[i] = input.charAt(Math.floor(Math.random() * input.length));
        }

        return randomChars.join("");
    }
    return "";
};

export const isKeyUnique = (key: string, hashMap: object): boolean => {
    if (hashMap.hasOwnProperty(key)) {
        return false;
    }
    return true;
};

// this should be in the types or interfaces or sth
export type TypedArray =
    | Int8Array
    | Uint8Array
    | Int16Array
    | Uint16Array
    | Int32Array
    | Uint32Array
    | Uint8ClampedArray
    | Float32Array
    | Float64Array
    | BigInt64Array
    | BigUint64Array;

/**
 * Copies deeply nested (and other) data by value.
 * It's based on a gist by Erik Vullings, the author of "deep-copy-ts"
 * with a few improvements and additions for complex types
 * see https://gist.github.com/erikvullings/ada7af09925082cbb89f40ed962d475e
 * @param original The value to be cloned of any type
 */
export const deepCopy = <T>(original: T): T => {
    // what about:
    // * img data
    // * functions

    // null and undefined (==) should be returned not copied.
    if (original == null) {
        return original;
    }

    if (original instanceof Date) {
        return new Date(original.getTime()) as any;
    }

    if (original instanceof RegExp) {
        return new RegExp(original.source, original.flags) as any;
    }

    if (original instanceof ArrayBuffer) {
        return original.slice(0, original.byteLength) as any;
    }

    // TypedArrays are views for ArrayBuffers (binary data)
    if (isTypedArray(original)) {
        return copyTypedArray(original) as any;
    }

    if (original instanceof Map) {
        if (original.size !== 0) {
            return new Map(deepCopy(Array.from(original))) as any;
        }
        return new Map() as any;
    }

    if (original instanceof Set) {
        if (original.size !== 0) {
            return new Set(deepCopy(Array.from(original))) as any;
        }
        return new Set() as any;
    }

    if (original instanceof Array) {
        if (original.length !== 0) {
            const clone: T = original.map(<N>(arrayElement: N) => {
                return deepCopy(arrayElement);
            }) as any;
            return clone;
        }
        return [] as any;
    }

    // objects have to be handled last since all other values
    // are objects, too.
    if (typeof original === "object" && original !== {}) {
        // not very efficient to shallow copy and then to deep copy
        // but didn't figure out how to initialize "clone" otherwise
        const clone: T = Object.assign({}, original);
        for (const key in original) {
            clone[key] = deepCopy(original[key]);
        }
        return clone;
    }

    // if its not an object/array/date,
    // it must be a primitive, empty array/object
    return original;
};

const copyTypedArray = (original: TypedArray): TypedArray => {
    if (original instanceof Int8Array) {
        return new Int8Array(original);
    }
    if (original instanceof Uint8Array) {
        return new Uint8Array(original);
    }
    if (original instanceof Uint8ClampedArray) {
        return new Uint8ClampedArray(original);
    }
    if (original instanceof Int16Array) {
        return new Int16Array(original);
    }
    if (original instanceof Uint16Array) {
        return new Uint16Array(original);
    }
    if (original instanceof Int16Array) {
        return new Int16Array(original);
    }
    if (original instanceof Uint16Array) {
        return new Uint16Array(original);
    }
    if (original instanceof Int32Array) {
        return new Int32Array(original);
    }
    if (original instanceof Uint32Array) {
        return new Uint32Array(original);
    }
    if (original instanceof Float32Array) {
        return new Float32Array(original);
    }
    if (original instanceof Float64Array) {
        return new Float64Array(original);
    }
    if (original instanceof BigInt64Array) {
        return new BigInt64Array(original);
    }
    if (original instanceof BigUint64Array) {
        return new BigUint64Array(original);
    }
    return new Uint8Array(); // just to return something from every path
};

const isTypedArray = (item: any): item is TypedArray => {
    return (item as TypedArray).buffer !== undefined;
};