UNPKG

ember-legacy-class-transform

Version:
722 lines (587 loc) 22.1 kB
define('@glimmer/reference', ['exports', '@glimmer/util'], function (exports, _glimmer_util) { 'use strict'; function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } function _classCallCheck$1(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var CONSTANT = 0; var INITIAL = 1; var VOLATILE = NaN; var RevisionTag = function () { function RevisionTag() { _classCallCheck$1(this, RevisionTag); } RevisionTag.prototype.validate = function validate(snapshot) { return this.value() === snapshot; }; return RevisionTag; }(); RevisionTag.id = 0; var VALUE = []; var VALIDATE = []; var TagWrapper = function () { function TagWrapper(type, inner) { _classCallCheck$1(this, TagWrapper); this.type = type; this.inner = inner; } TagWrapper.prototype.value = function value() { var func = VALUE[this.type]; return func(this.inner); }; TagWrapper.prototype.validate = function validate(snapshot) { var func = VALIDATE[this.type]; return func(this.inner, snapshot); }; return TagWrapper; }(); function register(Type) { var type = VALUE.length; VALUE.push(function (tag) { return tag.value(); }); VALIDATE.push(function (tag, snapshot) { return tag.validate(snapshot); }); Type.id = type; } /// // CONSTANT: 0 VALUE.push(function () { return CONSTANT; }); VALIDATE.push(function (_tag, snapshot) { return snapshot === CONSTANT; }); var CONSTANT_TAG = new TagWrapper(0, null); // VOLATILE: 1 VALUE.push(function () { return VOLATILE; }); VALIDATE.push(function (_tag, snapshot) { return snapshot === VOLATILE; }); var VOLATILE_TAG = new TagWrapper(1, null); // CURRENT: 2 VALUE.push(function () { return $REVISION; }); VALIDATE.push(function (_tag, snapshot) { return snapshot === $REVISION; }); var CURRENT_TAG = new TagWrapper(2, null); /// var $REVISION = INITIAL; var DirtyableTag = function (_RevisionTag) { _inherits(DirtyableTag, _RevisionTag); DirtyableTag.create = function create() { var revision = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $REVISION; return new TagWrapper(this.id, new DirtyableTag(revision)); }; function DirtyableTag() { var revision = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $REVISION; _classCallCheck$1(this, DirtyableTag); var _this = _possibleConstructorReturn(this, _RevisionTag.call(this)); _this.revision = revision; return _this; } DirtyableTag.prototype.value = function value() { return this.revision; }; DirtyableTag.prototype.dirty = function dirty() { this.revision = ++$REVISION; }; return DirtyableTag; }(RevisionTag); register(DirtyableTag); function combineTagged(tagged) { var optimized = []; for (var i = 0, l = tagged.length; i < l; i++) { var tag = tagged[i].tag; if (tag === VOLATILE_TAG) return VOLATILE_TAG; if (tag === CONSTANT_TAG) continue; optimized.push(tag); } return _combine(optimized); } function combineSlice(slice) { var optimized = []; var node = slice.head(); while (node !== null) { var tag = node.tag; if (tag === VOLATILE_TAG) return VOLATILE_TAG; if (tag !== CONSTANT_TAG) optimized.push(tag); node = slice.nextNode(node); } return _combine(optimized); } function combine(tags) { var optimized = []; for (var i = 0, l = tags.length; i < l; i++) { var tag = tags[i]; if (tag === VOLATILE_TAG) return VOLATILE_TAG; if (tag === CONSTANT_TAG) continue; optimized.push(tag); } return _combine(optimized); } function _combine(tags) { switch (tags.length) { case 0: return CONSTANT_TAG; case 1: return tags[0]; case 2: return TagsPair.create(tags[0], tags[1]); default: return TagsCombinator.create(tags); } } var CachedTag = function (_RevisionTag2) { _inherits(CachedTag, _RevisionTag2); function CachedTag() { _classCallCheck$1(this, CachedTag); var _this2 = _possibleConstructorReturn(this, _RevisionTag2.apply(this, arguments)); _this2.lastChecked = null; _this2.lastValue = null; return _this2; } CachedTag.prototype.value = function value() { var lastChecked = this.lastChecked, lastValue = this.lastValue; if (lastChecked !== $REVISION) { this.lastChecked = $REVISION; this.lastValue = lastValue = this.compute(); } return this.lastValue; }; CachedTag.prototype.invalidate = function invalidate() { this.lastChecked = null; }; return CachedTag; }(RevisionTag); var TagsPair = function (_CachedTag) { _inherits(TagsPair, _CachedTag); TagsPair.create = function create(first, second) { return new TagWrapper(this.id, new TagsPair(first, second)); }; function TagsPair(first, second) { _classCallCheck$1(this, TagsPair); var _this3 = _possibleConstructorReturn(this, _CachedTag.call(this)); _this3.first = first; _this3.second = second; return _this3; } TagsPair.prototype.compute = function compute() { return Math.max(this.first.value(), this.second.value()); }; return TagsPair; }(CachedTag); register(TagsPair); var TagsCombinator = function (_CachedTag2) { _inherits(TagsCombinator, _CachedTag2); TagsCombinator.create = function create(tags) { return new TagWrapper(this.id, new TagsCombinator(tags)); }; function TagsCombinator(tags) { _classCallCheck$1(this, TagsCombinator); var _this4 = _possibleConstructorReturn(this, _CachedTag2.call(this)); _this4.tags = tags; return _this4; } TagsCombinator.prototype.compute = function compute() { var tags = this.tags; var max = -1; for (var i = 0; i < tags.length; i++) { var value = tags[i].value(); max = Math.max(value, max); } return max; }; return TagsCombinator; }(CachedTag); register(TagsCombinator); var UpdatableTag = function (_CachedTag3) { _inherits(UpdatableTag, _CachedTag3); UpdatableTag.create = function create(tag) { return new TagWrapper(this.id, new UpdatableTag(tag)); }; function UpdatableTag(tag) { _classCallCheck$1(this, UpdatableTag); var _this5 = _possibleConstructorReturn(this, _CachedTag3.call(this)); _this5.tag = tag; _this5.lastUpdated = INITIAL; return _this5; } UpdatableTag.prototype.compute = function compute() { return Math.max(this.lastUpdated, this.tag.value()); }; UpdatableTag.prototype.update = function update(tag) { if (tag !== this.tag) { this.tag = tag; this.lastUpdated = $REVISION; this.invalidate(); } }; return UpdatableTag; }(CachedTag); register(UpdatableTag); var CachedReference = function () { function CachedReference() { _classCallCheck$1(this, CachedReference); this.lastRevision = null; this.lastValue = null; } CachedReference.prototype.value = function value() { var tag = this.tag, lastRevision = this.lastRevision, lastValue = this.lastValue; if (!lastRevision || !tag.validate(lastRevision)) { lastValue = this.lastValue = this.compute(); this.lastRevision = tag.value(); } return lastValue; }; CachedReference.prototype.invalidate = function invalidate() { this.lastRevision = null; }; return CachedReference; }(); var MapperReference = function (_CachedReference) { _inherits(MapperReference, _CachedReference); function MapperReference(reference, mapper) { _classCallCheck$1(this, MapperReference); var _this6 = _possibleConstructorReturn(this, _CachedReference.call(this)); _this6.tag = reference.tag; _this6.reference = reference; _this6.mapper = mapper; return _this6; } MapperReference.prototype.compute = function compute() { var reference = this.reference, mapper = this.mapper; return mapper(reference.value()); }; return MapperReference; }(CachedReference); function map(reference, mapper) { return new MapperReference(reference, mapper); } ////////// var ReferenceCache = function () { function ReferenceCache(reference) { _classCallCheck$1(this, ReferenceCache); this.lastValue = null; this.lastRevision = null; this.initialized = false; this.tag = reference.tag; this.reference = reference; } ReferenceCache.prototype.peek = function peek() { if (!this.initialized) { return this.initialize(); } return this.lastValue; }; ReferenceCache.prototype.revalidate = function revalidate() { if (!this.initialized) { return this.initialize(); } var reference = this.reference, lastRevision = this.lastRevision; var tag = reference.tag; if (tag.validate(lastRevision)) return NOT_MODIFIED; this.lastRevision = tag.value(); var lastValue = this.lastValue; var value = reference.value(); if (value === lastValue) return NOT_MODIFIED; this.lastValue = value; return value; }; ReferenceCache.prototype.initialize = function initialize() { var reference = this.reference; var value = this.lastValue = reference.value(); this.lastRevision = reference.tag.value(); this.initialized = true; return value; }; return ReferenceCache; }(); var NOT_MODIFIED = "adb3b78e-3d22-4e4b-877a-6317c2c5c145"; function isModified(value) { return value !== NOT_MODIFIED; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ConstReference = function () { function ConstReference(inner) { _classCallCheck(this, ConstReference); this.inner = inner; this.tag = CONSTANT_TAG; } ConstReference.prototype.value = function value() { return this.inner; }; return ConstReference; }(); function isConst(reference) { return reference.tag === CONSTANT_TAG; } function _defaults$1(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } function _classCallCheck$2(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn$1(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits$1(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$1(subClass, superClass); } var ListItem = function (_ListNode) { _inherits$1(ListItem, _ListNode); function ListItem(iterable, result) { _classCallCheck$2(this, ListItem); var _this = _possibleConstructorReturn$1(this, _ListNode.call(this, iterable.valueReferenceFor(result))); _this.retained = false; _this.seen = false; _this.key = result.key; _this.iterable = iterable; _this.memo = iterable.memoReferenceFor(result); return _this; } ListItem.prototype.update = function update(item) { this.retained = true; this.iterable.updateValueReference(this.value, item); this.iterable.updateMemoReference(this.memo, item); }; ListItem.prototype.shouldRemove = function shouldRemove() { return !this.retained; }; ListItem.prototype.reset = function reset() { this.retained = false; this.seen = false; }; return ListItem; }(_glimmer_util.ListNode); var IterationArtifacts = function () { function IterationArtifacts(iterable) { _classCallCheck$2(this, IterationArtifacts); this.map = _glimmer_util.dict(); this.list = new _glimmer_util.LinkedList(); this.tag = iterable.tag; this.iterable = iterable; } IterationArtifacts.prototype.isEmpty = function isEmpty() { var iterator = this.iterator = this.iterable.iterate(); return iterator.isEmpty(); }; IterationArtifacts.prototype.iterate = function iterate() { var iterator = this.iterator || this.iterable.iterate(); this.iterator = null; return iterator; }; IterationArtifacts.prototype.has = function has(key) { return !!this.map[key]; }; IterationArtifacts.prototype.get = function get(key) { return this.map[key]; }; IterationArtifacts.prototype.wasSeen = function wasSeen(key) { var node = this.map[key]; return node && node.seen; }; IterationArtifacts.prototype.append = function append(item) { var map = this.map, list = this.list, iterable = this.iterable; var node = map[item.key] = new ListItem(iterable, item); list.append(node); return node; }; IterationArtifacts.prototype.insertBefore = function insertBefore(item, reference) { var map = this.map, list = this.list, iterable = this.iterable; var node = map[item.key] = new ListItem(iterable, item); node.retained = true; list.insertBefore(node, reference); return node; }; IterationArtifacts.prototype.move = function move(item, reference) { var list = this.list; item.retained = true; list.remove(item); list.insertBefore(item, reference); }; IterationArtifacts.prototype.remove = function remove(item) { var list = this.list; list.remove(item); delete this.map[item.key]; }; IterationArtifacts.prototype.nextNode = function nextNode(item) { return this.list.nextNode(item); }; IterationArtifacts.prototype.head = function head() { return this.list.head(); }; return IterationArtifacts; }(); var ReferenceIterator = function () { // if anyone needs to construct this object with something other than // an iterable, let @wycats know. function ReferenceIterator(iterable) { _classCallCheck$2(this, ReferenceIterator); this.iterator = null; var artifacts = new IterationArtifacts(iterable); this.artifacts = artifacts; } ReferenceIterator.prototype.next = function next() { var artifacts = this.artifacts; var iterator = this.iterator = this.iterator || artifacts.iterate(); var item = iterator.next(); if (!item) return null; return artifacts.append(item); }; return ReferenceIterator; }(); var Phase; (function (Phase) { Phase[Phase["Append"] = 0] = "Append"; Phase[Phase["Prune"] = 1] = "Prune"; Phase[Phase["Done"] = 2] = "Done"; })(Phase || (Phase = {})); var IteratorSynchronizer = function () { function IteratorSynchronizer(_ref) { var target = _ref.target, artifacts = _ref.artifacts; _classCallCheck$2(this, IteratorSynchronizer); this.target = target; this.artifacts = artifacts; this.iterator = artifacts.iterate(); this.current = artifacts.head(); } IteratorSynchronizer.prototype.sync = function sync() { var phase = Phase.Append; while (true) { switch (phase) { case Phase.Append: phase = this.nextAppend(); break; case Phase.Prune: phase = this.nextPrune(); break; case Phase.Done: this.nextDone(); return; } } }; IteratorSynchronizer.prototype.advanceToKey = function advanceToKey(key) { var current = this.current, artifacts = this.artifacts; var seek = current; while (seek && seek.key !== key) { seek.seen = true; seek = artifacts.nextNode(seek); } this.current = seek && artifacts.nextNode(seek); }; IteratorSynchronizer.prototype.nextAppend = function nextAppend() { var iterator = this.iterator, current = this.current, artifacts = this.artifacts; var item = iterator.next(); if (item === null) { return this.startPrune(); } var key = item.key; if (current && current.key === key) { this.nextRetain(item); } else if (artifacts.has(key)) { this.nextMove(item); } else { this.nextInsert(item); } return Phase.Append; }; IteratorSynchronizer.prototype.nextRetain = function nextRetain(item) { var artifacts = this.artifacts, current = this.current; current = current; current.update(item); this.current = artifacts.nextNode(current); this.target.retain(item.key, current.value, current.memo); }; IteratorSynchronizer.prototype.nextMove = function nextMove(item) { var current = this.current, artifacts = this.artifacts, target = this.target; var key = item.key; var found = artifacts.get(item.key); found.update(item); if (artifacts.wasSeen(item.key)) { artifacts.move(found, current); target.move(found.key, found.value, found.memo, current ? current.key : null); } else { this.advanceToKey(key); } }; IteratorSynchronizer.prototype.nextInsert = function nextInsert(item) { var artifacts = this.artifacts, target = this.target, current = this.current; var node = artifacts.insertBefore(item, current); target.insert(node.key, node.value, node.memo, current ? current.key : null); }; IteratorSynchronizer.prototype.startPrune = function startPrune() { this.current = this.artifacts.head(); return Phase.Prune; }; IteratorSynchronizer.prototype.nextPrune = function nextPrune() { var artifacts = this.artifacts, target = this.target, current = this.current; if (current === null) { return Phase.Done; } var node = current; this.current = artifacts.nextNode(node); if (node.shouldRemove()) { artifacts.remove(node); target.delete(node.key); } else { node.reset(); } return Phase.Prune; }; IteratorSynchronizer.prototype.nextDone = function nextDone() { this.target.done(); }; return IteratorSynchronizer; }(); function referenceFromParts(root, parts) { var reference = root; for (var i = 0; i < parts.length; i++) { reference = reference.get(parts[i]); } return reference; } exports.ConstReference = ConstReference; exports.isConst = isConst; exports.ListItem = ListItem; exports.referenceFromParts = referenceFromParts; exports.IterationArtifacts = IterationArtifacts; exports.ReferenceIterator = ReferenceIterator; exports.IteratorSynchronizer = IteratorSynchronizer; exports.CONSTANT = CONSTANT; exports.INITIAL = INITIAL; exports.VOLATILE = VOLATILE; exports.RevisionTag = RevisionTag; exports.TagWrapper = TagWrapper; exports.CONSTANT_TAG = CONSTANT_TAG; exports.VOLATILE_TAG = VOLATILE_TAG; exports.CURRENT_TAG = CURRENT_TAG; exports.DirtyableTag = DirtyableTag; exports.combineTagged = combineTagged; exports.combineSlice = combineSlice; exports.combine = combine; exports.CachedTag = CachedTag; exports.UpdatableTag = UpdatableTag; exports.CachedReference = CachedReference; exports.map = map; exports.ReferenceCache = ReferenceCache; exports.isModified = isModified; Object.defineProperty(exports, '__esModule', { value: true }); });