UNPKG

immutable-js

Version:
100 lines (84 loc) 2.67 kB
/** * Copyright (c) 2015, Jan Biasi. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ import clone from './util/clone'; export var IS_NATIVE_FLAG = '@@__IS_NATIVE__@@'; export function isNative(maybeNative) { return !!(maybeNative && maybeNative[IS_NATIVE_FLAG]); } var NATIVE_COLLECTION_TYPEDEF = '[native Collection]' export class NativeCollection { constructor() { var args = Array.prototype.slice.call(arguments); if(args.length > 1) { let array = new NativeArray(); array.__initialSize = args.length; args.forEach(v => array.push(v)); return array; } else if(args.length === 1) { var single = args[0]; if(Array.isArray(single)) { let array = new NativeArray(); single.forEach(v => array.push(v)); array.__initialSize = single.length || 0; return array; } else if(typeof single === 'object') { let object = new NativeObject(); object.__initialSize = Object.keys(single).length; return object.extend(single); } } else { return new NativeObject(); } } toString() { return NATIVE_COLLECTION_TYPEDEF; } } var NATIVE_ARRAY_TYPEDEF = '[native Array]'; export class NativeArray extends Array { constructor() { super(0); } toString() { return NATIVE_ARRAY_TYPEDEF; } toNative() { return this; } isNativeArray(maybeNativeArray) { return maybeNativeArray && maybeNativeArray.toString && maybeNativeArray.toString() === NATIVE_ARRAY_TYPEDEF; } __clone() { return this.slice(); } } var NATIVE_OBJECT_TYPEDEF = '[native Object]'; export class NativeObject extends Object { constructor() { super(null); } __clone() { return clone(this); } extend(source) { var object = Object.assign(new NativeObject(), source); return object; } toString() { return NATIVE_OBJECT_TYPEDEF; } isNativeObject(maybeNativeObject) { return maybeNativeObject && maybeNativeObject.toString && maybeNativeObject.toString() === NATIVE_OBJECT_TYPEDEF; } } NativeCollection.prototype[IS_NATIVE_FLAG] = true; NativeObject.prototype[IS_NATIVE_FLAG] = true; NativeArray.prototype[IS_NATIVE_FLAG] = true;