Skip to content

Commit

Permalink
Add proper ES6 Symbol polyfill
Browse files Browse the repository at this point in the history
  • Loading branch information
leebyron committed Aug 25, 2014
1 parent 0164a55 commit 049eff1
Show file tree
Hide file tree
Showing 8 changed files with 96 additions and 72 deletions.
95 changes: 51 additions & 44 deletions dist/Immutable.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,52 @@ $traceurRuntime.createClass = createClass;
$traceurRuntime.superCall = superCall;
$traceurRuntime.defaultSuperCall = defaultSuperCall;
"use strict";
var SHIFT = 5;
var SIZE = 1 << SHIFT;
var MASK = SIZE - 1;
var NOT_SET = {};
var CHANGE_LENGTH = {value: false};
var DID_ALTER = {value: false};
function MakeRef(ref) {
ref.value = false;
return ref;
}
function SetRef(ref) {
ref && (ref.value = true);
}
function OwnerID() {}
function arrCopy(arr) {
var len = arr.length;
var newArr = new Array(len);
for (var ii = 0; ii < len; ii++) {
newArr[ii] = arr[ii];
}
return newArr;
}
var ITER_RESULT = {
value: undefined,
done: false
};
function iteratorValue(value) {
ITER_RESULT.value = value;
ITER_RESULT.done = false;
return ITER_RESULT;
}
function iteratorDone() {
ITER_RESULT.value = undefined;
ITER_RESULT.done = true;
return ITER_RESULT;
}
function invariant(condition, error) {
if (!condition)
throw new Error(error);
}
if (typeof Symbol === 'undefined') {
Symbol = {};
}
if (!Symbol.iterator) {
Symbol.iterator = '@@iterator';

This comment has been minimized.

Copy link
@medikoo

medikoo Aug 26, 2014

To avoid interoperation issues with other scripts, you should use such Symbol implementation strictly locally, but do not expose it like that on global scope, it's not a valid polyfill.

This comment has been minimized.

Copy link
@leebyron

leebyron Aug 26, 2014

Author Collaborator

Good catch. Fixed in 74854a4

}
var Sequence = function Sequence(value) {
return $Sequence.from(arguments.length === 1 ? value : Array.prototype.slice.call(arguments));
};
Expand Down Expand Up @@ -830,6 +876,7 @@ var SequenceIterator = function SequenceIterator() {};
return '[Iterator]';
}}, {});
var SequenceIteratorPrototype = SequenceIterator.prototype;
SequenceIteratorPrototype[Symbol.iterator] = returnThis;
SequenceIteratorPrototype.inspect = SequenceIteratorPrototype.toSource = function() {
return this.toString();
};
Expand Down Expand Up @@ -929,42 +976,6 @@ function iteratorMapper(iter, fn) {
});
return newIter;
}
var SHIFT = 5;
var SIZE = 1 << SHIFT;
var MASK = SIZE - 1;
var NOT_SET = {};
var CHANGE_LENGTH = {value: false};
var DID_ALTER = {value: false};
function MakeRef(ref) {
ref.value = false;
return ref;
}
function SetRef(ref) {
ref && (ref.value = true);
}
function OwnerID() {}
function arrCopy(arr) {
var len = arr.length;
var newArr = new Array(len);
for (var ii = 0; ii < len; ii++) {
newArr[ii] = arr[ii];
}
return newArr;
}
var ITER_RESULT = {
value: undefined,
done: false
};
function iteratorValue(value) {
ITER_RESULT.value = value;
ITER_RESULT.done = false;
return ITER_RESULT;
}
function iteratorDone() {
ITER_RESULT.value = undefined;
ITER_RESULT.done = true;
return ITER_RESULT;
}
var Cursor = function Cursor(rootData, keyPath, onChange, value) {
value = value ? value : rootData.getIn(keyPath);
this.length = value instanceof Sequence ? value.length : null;
Expand Down Expand Up @@ -1045,10 +1056,6 @@ function is(first, second) {
}
return false;
}
function invariant(condition, error) {
if (!condition)
throw new Error(error);
}
var Map = function Map(sequence) {
var map = $Map.empty();
return sequence ? sequence.constructor === $Map ? sequence : map.merge(sequence) : map;
Expand Down Expand Up @@ -1176,7 +1183,7 @@ var $Map = Map;
return EMPTY_MAP || (EMPTY_MAP = makeMap(0));
}}, Sequence);
var MapPrototype = Map.prototype;
MapPrototype['@@iterator'] = function() {
MapPrototype[Symbol.iterator] = function() {
return this.entries();
};
Map.from = Map;
Expand Down Expand Up @@ -1824,7 +1831,7 @@ var $Vector = Vector;
}
}, IndexedSequence);
var VectorPrototype = Vector.prototype;
VectorPrototype['@@iterator'] = VectorPrototype.values;
VectorPrototype[Symbol.iterator] = VectorPrototype.values;
VectorPrototype.update = MapPrototype.update;
VectorPrototype.updateIn = MapPrototype.updateIn;
VectorPrototype.cursor = MapPrototype.cursor;
Expand Down Expand Up @@ -2326,7 +2333,7 @@ var $Set = Set;
}
}, Sequence);
var SetPrototype = Set.prototype;
SetPrototype['@@iterator'] = SetPrototype.keys = SetPrototype.values;
SetPrototype[Symbol.iterator] = SetPrototype.keys = SetPrototype.values;
SetPrototype.contains = SetPrototype.has;
SetPrototype.mergeDeep = SetPrototype.merge = SetPrototype.union;
SetPrototype.mergeDeepWith = SetPrototype.mergeWith = function(merger) {
Expand Down Expand Up @@ -2555,7 +2562,7 @@ var $Record = Record;
}, {}, Sequence);
var RecordPrototype = Record.prototype;
RecordPrototype.__deepEqual = MapPrototype.__deepEqual;
RecordPrototype['@@iterator'] = MapPrototype['@@iterator'];
RecordPrototype[Symbol.iterator] = MapPrototype[Symbol.iterator];
RecordPrototype.merge = MapPrototype.merge;
RecordPrototype.mergeWith = MapPrototype.mergeWith;
RecordPrototype.mergeDeep = MapPrototype.mergeDeep;
Expand Down
38 changes: 19 additions & 19 deletions dist/Immutable.min.js

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions src/Map.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@ import "is"
import "invariant"
import "Cursor"
import "TrieUtils"
import "Symbol"
/* global Sequence, SequenceIterator, is, invariant, Cursor,
SHIFT, SIZE, MASK, NOT_SET, CHANGE_LENGTH, DID_ALTER, OwnerID,
MakeRef, SetRef, arrCopy, iteratorValue, iteratorDone */
MakeRef, SetRef, arrCopy, iteratorValue, iteratorDone, Symbol */
/* exported Map, MapPrototype */


Expand Down Expand Up @@ -181,7 +182,7 @@ class Map extends Sequence {
}

var MapPrototype = Map.prototype;
MapPrototype['@@iterator'] = function() { return this.entries() };
MapPrototype[Symbol.iterator] = function() { return this.entries() };

Map.from = Map;

Expand Down
5 changes: 3 additions & 2 deletions src/Record.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
import "Sequence"
import "Map"
import "invariant"
/* global Sequence, Map, MapPrototype, invariant */
import "Symbol"
/* global Sequence, Map, MapPrototype, invariant, Symbol */
/* exported Record */


Expand Down Expand Up @@ -132,7 +133,7 @@ class Record extends Sequence {

var RecordPrototype = Record.prototype;
RecordPrototype.__deepEqual = MapPrototype.__deepEqual;
RecordPrototype['@@iterator'] = MapPrototype['@@iterator'];
RecordPrototype[Symbol.iterator] = MapPrototype[Symbol.iterator];
RecordPrototype.merge = MapPrototype.merge;
RecordPrototype.mergeWith = MapPrototype.mergeWith;
RecordPrototype.mergeDeep = MapPrototype.mergeDeep;
Expand Down
6 changes: 5 additions & 1 deletion src/Sequence.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
*/

/* Sequence has implicit lazy dependencies */
/* global is, Map, OrderedMap, Vector, Set, NOT_SET, invariant */
import "TrieUtils"
import "invariant"
import "Symbol"
/* global is, Map, OrderedMap, Vector, Set, NOT_SET, invariant, Symbol */
/* exported Sequence, IndexedSequence, SequenceIterator, iteratorMapper */


Expand Down Expand Up @@ -871,6 +874,7 @@ class SequenceIterator {
}

var SequenceIteratorPrototype = SequenceIterator.prototype;
SequenceIteratorPrototype[Symbol.iterator] = returnThis;
SequenceIteratorPrototype.inspect =
SequenceIteratorPrototype.toSource = function () { return this.toString(); }

Expand Down
5 changes: 3 additions & 2 deletions src/Set.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@

import "Sequence"
import "Map"
import "Symbol"
/* global Sequence, IndexedSequencePrototype, iteratorMapper,
Map, MapPrototype */
Map, MapPrototype, Symbol */
/* exported Set */


Expand Down Expand Up @@ -178,7 +179,7 @@ class Set extends Sequence {
}

var SetPrototype = Set.prototype;
SetPrototype['@@iterator'] = SetPrototype.keys = SetPrototype.values;
SetPrototype[Symbol.iterator] = SetPrototype.keys = SetPrototype.values;
SetPrototype.contains = SetPrototype.has;
SetPrototype.mergeDeep = SetPrototype.merge = SetPrototype.union;
SetPrototype.mergeDeepWith = SetPrototype.mergeWith = function(merger, ...seqs) {
Expand Down
9 changes: 9 additions & 0 deletions src/Symbol.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/* global Symbol */

if (typeof Symbol === 'undefined') {
Symbol = {}; // jshint ignore: line
}

if (!Symbol.iterator) {
Symbol.iterator = '@@iterator';
}
5 changes: 3 additions & 2 deletions src/Vector.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@ import "is"
import "invariant"
import "Map"
import "TrieUtils"
import "Symbol"
/* global Sequence, IndexedSequence, SequenceIterator, is, invariant,
MapPrototype, mergeIntoCollectionWith, deepMerger,
SHIFT, SIZE, MASK, NOT_SET, DID_ALTER, OwnerID, MakeRef, SetRef,
arrCopy, iteratorValue, iteratorDone */
arrCopy, iteratorValue, iteratorDone, Symbol */
/* exported Vector, VectorPrototype */


Expand Down Expand Up @@ -230,7 +231,7 @@ class Vector extends IndexedSequence {
}

var VectorPrototype = Vector.prototype;
VectorPrototype['@@iterator'] = VectorPrototype.values;
VectorPrototype[Symbol.iterator] = VectorPrototype.values;
VectorPrototype.update = MapPrototype.update;
VectorPrototype.updateIn = MapPrototype.updateIn;
VectorPrototype.cursor = MapPrototype.cursor;
Expand Down

0 comments on commit 049eff1

Please sign in to comment.