ts-prime
Version:
A utility library for JavaScript and Typescript.
60 lines (59 loc) • 1.91 kB
JavaScript
;
// from https://github.com/ramda/ramda/blob/master/source/internal/_clone.js
Object.defineProperty(exports, "__esModule", { value: true });
var type_1 = require("./type");
function _cloneRegExp(pattern) {
return new RegExp(pattern.source, (pattern.global ? 'g' : '') +
(pattern.ignoreCase ? 'i' : '') +
(pattern.multiline ? 'm' : '') +
(pattern.sticky ? 'y' : '') +
(pattern.unicode ? 'u' : ''));
}
function _clone(value, refFrom, refTo, deep) {
function copy(copiedValue) {
var len = refFrom.length;
var idx = 0;
while (idx < len) {
if (value === refFrom[idx]) {
return refTo[idx];
}
idx += 1;
}
refFrom[idx + 1] = value;
refTo[idx + 1] = copiedValue;
// tslint:disable-next-line:forin
for (var key in value) {
copiedValue[key] = deep
? _clone(value[key], refFrom, refTo, true)
: value[key];
}
return copiedValue;
}
switch (type_1.type(value)) {
case 'Object':
return copy({});
case 'Array':
return copy([]);
case 'Date':
return new Date(value.valueOf());
case 'RegExp':
return _cloneRegExp(value);
default:
return value;
}
}
/**
* Creates a deep copy of the value. Supported types: `Array`, `Object`, `Number`, `String`, `Boolean`, `Date`, `RegExp`. Functions are assigned by reference rather than copied.
* @param value - the object to clone
* @signature P.clone(value)
* @example P.clone({foo: 'bar'}) // {foo: 'bar'}
* @category Object
*/
function clone(value) {
// @ts-ignore
return value != null && typeof value.clone === 'function'
? // @ts-ignore
value.clone()
: _clone(value, [], [], true);
}
exports.clone = clone;