diff --git a/src/mol-util/object.ts b/src/mol-util/object.ts index 2ee047d59ee226390d30cf68beb09f6f21b7df22..28405be92bf9360173e2ef79375dbab29530f7b9 100644 --- a/src/mol-util/object.ts +++ b/src/mol-util/object.ts @@ -2,6 +2,7 @@ * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> + * @author Alexander Rose <alexander.rose@weirdbyte.de> */ const hasOwnProperty = Object.prototype.hasOwnProperty; @@ -54,4 +55,27 @@ export function shallowMerge<T>(source: T, ...rest: (Partial<T> | undefined)[]): } } return ret; -} \ No newline at end of file +} + +/** Simple deep clone for number, boolean, string, null, undefined, object, array */ +export function deepClone<T>(source: T): T { + if (null === source || "object" !== typeof source) return source; + + if (source instanceof Array) { + const copy: any[] = []; + for (let i = 0, len = source.length; i < len; i++) { + copy[i] = deepClone(source[i]); + } + return copy as any as T; + } + + if (source instanceof Object) { + const copy: { [k: string]: any } = {}; + for (let k in source) { + if (hasOwnProperty.call(source, k)) copy[k] = deepClone(source[k]); + } + return copy as any as T; + } + + throw new Error(`Can't clone, type "${typeof source}" unsupported`); + } \ No newline at end of file