immutable-js
Version:
Immutable types in JavaScript
100 lines (84 loc) • 2.67 kB
JavaScript
/**
* 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;