refactor(change_detection): make RecordRange responsible for removing iself

This commit is contained in:
vsavkin 2014-11-25 14:25:12 -08:00
parent 2b53a2f353
commit 9a28fa8590
2 changed files with 40 additions and 38 deletions

View File

@ -116,8 +116,8 @@ export class RecordRange {
addRange(child:RecordRange) { addRange(child:RecordRange) {
var lastRecord = this.tailRecord.prev; var lastRecord = this.tailRecord.prev;
var prevEnabledRecord = this._prevEnabled(this.tailRecord); var prevEnabledRecord = RecordRange._prevEnabled(this.tailRecord);
var nextEnabledRerord = this._nextEnabled(this.tailRecord); var nextEnabledRerord = RecordRange._nextEnabled(this.tailRecord);
var firstEnabledChildRecord = child.findFirstEnabledRecord(); var firstEnabledChildRecord = child.findFirstEnabledRecord();
var lastEnabledChildRecord = child.findLastEnabledRecord(); var lastEnabledChildRecord = child.findLastEnabledRecord();
@ -134,12 +134,12 @@ export class RecordRange {
} }
} }
removeRange(child:RecordRange) { remove() {
var firstEnabledChildRecord = child.findFirstEnabledRecord(); var firstEnabledChildRecord = this.findFirstEnabledRecord();
var lastEnabledChildRecord = child.findLastEnabledRecord(); var lastEnabledChildRecord = this.findLastEnabledRecord();
var next = child.tailRecord.next; var next = this.tailRecord.next;
var prev = child.headRecord.prev; var prev = this.headRecord.prev;
_link(prev, next); _link(prev, next);
@ -164,8 +164,8 @@ export class RecordRange {
enableRecord(record:Record) { enableRecord(record:Record) {
if (!record.disabled) return; if (!record.disabled) return;
var prevEnabled = this._prevEnabled(record); var prevEnabled = RecordRange._prevEnabled(record);
var nextEnabled = this._nextEnabled(record); var nextEnabled = RecordRange._nextEnabled(record);
record.prevEnabled = prevEnabled; record.prevEnabled = prevEnabled;
record.nextEnabled = nextEnabled; record.nextEnabled = nextEnabled;
@ -176,9 +176,9 @@ export class RecordRange {
record.disabled = false; record.disabled = false;
} }
disableRange(child:RecordRange) { disable() {
var firstEnabledChildRecord = child.findFirstEnabledRecord(); var firstEnabledChildRecord = this.findFirstEnabledRecord();
var lastEnabledChildRecord = child.findLastEnabledRecord(); var lastEnabledChildRecord = this.findLastEnabledRecord();
var nextEnabled = lastEnabledChildRecord.nextEnabled; var nextEnabled = lastEnabledChildRecord.nextEnabled;
var prevEnabled = firstEnabledChildRecord.prevEnabled; var prevEnabled = firstEnabledChildRecord.prevEnabled;
@ -186,25 +186,25 @@ export class RecordRange {
if (isPresent(nextEnabled)) nextEnabled.prevEnabled = prevEnabled; if (isPresent(nextEnabled)) nextEnabled.prevEnabled = prevEnabled;
if (isPresent(prevEnabled)) prevEnabled.nextEnabled = nextEnabled; if (isPresent(prevEnabled)) prevEnabled.nextEnabled = nextEnabled;
child.disabled = true; this.disabled = true;
} }
enableRange(child:RecordRange) { enable() {
var prevEnabledRecord = this._prevEnabled(child.headRecord); var prevEnabledRecord = RecordRange._prevEnabled(this.headRecord);
var nextEnabledRecord = this._nextEnabled(child.tailRecord); var nextEnabledRecord = RecordRange._nextEnabled(this.tailRecord);
var firstEnabledChildRecord = child.findFirstEnabledRecord(); var firstEnabledthisRecord = this.findFirstEnabledRecord();
var lastEnabledChildRecord = child.findLastEnabledRecord(); var lastEnabledthisRecord = this.findLastEnabledRecord();
if (isPresent(firstEnabledChildRecord) && isPresent(prevEnabledRecord)){ if (isPresent(firstEnabledthisRecord) && isPresent(prevEnabledRecord)){
_linkEnabled(prevEnabledRecord, firstEnabledChildRecord); _linkEnabled(prevEnabledRecord, firstEnabledthisRecord);
} }
if (isPresent(lastEnabledChildRecord) && isPresent(nextEnabledRecord)){ if (isPresent(lastEnabledthisRecord) && isPresent(nextEnabledRecord)){
_linkEnabled(lastEnabledChildRecord, nextEnabledRecord); _linkEnabled(lastEnabledthisRecord, nextEnabledRecord);
} }
child.disabled = false; this.disabled = false;
} }
/** /**
@ -262,7 +262,7 @@ export class RecordRange {
* *
* The function skips disabled sub ranges. * The function skips disabled sub ranges.
*/ */
_nextEnabled(record:Record) { static _nextEnabled(record:Record) {
record = record.next; record = record.next;
while (isPresent(record) && record.disabled) { while (isPresent(record) && record.disabled) {
if (record.isMarkerRecord && record.recordRange.disabled) { if (record.isMarkerRecord && record.recordRange.disabled) {
@ -281,7 +281,7 @@ export class RecordRange {
* *
* The function skips disabled sub ranges. * The function skips disabled sub ranges.
*/ */
_prevEnabled(record:Record) { static _prevEnabled(record:Record) {
record = record.prev; record = record.prev;
while (isPresent(record) && record.disabled) { while (isPresent(record) && record.disabled) {
if (record.isMarkerRecord && record.recordRange.disabled) { if (record.isMarkerRecord && record.recordRange.disabled) {

View File

@ -128,11 +128,11 @@ export function main() {
parent.addRange(child1); parent.addRange(child1);
parent.addRange(child2); parent.addRange(child2);
parent.removeRange(child1); child1.remove();
expect(enabledRecords(parent, recordNames)).toEqual(['record2']); expect(enabledRecords(parent, recordNames)).toEqual(['record2']);
parent.removeRange(child2); child2.remove();
expect(enabledRecords(parent, recordNames)).toEqual([]); expect(enabledRecords(parent, recordNames)).toEqual([]);
}); });
@ -143,7 +143,7 @@ export function main() {
parent.addRange(emptyRange); parent.addRange(emptyRange);
parent.addRange(child2); parent.addRange(child2);
parent.removeRange(emptyRange); emptyRange.remove();
expect(enabledRecords(parent, recordNames)).toEqual(['record1', 'record2']); expect(enabledRecords(parent, recordNames)).toEqual(['record1', 'record2']);
}); });
@ -153,7 +153,7 @@ export function main() {
parent.addRange(child2); parent.addRange(child2);
parent.addRange(child3); parent.addRange(child3);
parent.removeRange(child2); child2.remove();
expect(enabledRecords(parent, recordNames)).toEqual(['record1', 'record3']); expect(enabledRecords(parent, recordNames)).toEqual(['record1', 'record3']);
}); });
@ -283,7 +283,7 @@ export function main() {
var parent = new RecordRange(null, null); var parent = new RecordRange(null, null);
parent.addRange(child1); parent.addRange(child1);
parent.disableRange(child1); child1.disable();
expect(enabledRecords(parent, recordNames)).toEqual([]); expect(enabledRecords(parent, recordNames)).toEqual([]);
}); });
@ -291,9 +291,10 @@ export function main() {
it('should enable a single record range', () => { it('should enable a single record range', () => {
var parent = new RecordRange(null, null); var parent = new RecordRange(null, null);
parent.addRange(child1); parent.addRange(child1);
parent.disableRange(child1);
parent.enableRange(child1); child1.disable();
child1.enable();
expect(enabledRecords(parent, recordNames)).toEqual(['record1']); expect(enabledRecords(parent, recordNames)).toEqual(['record1']);
}); });
@ -305,8 +306,8 @@ export function main() {
parent.addRange(child3); parent.addRange(child3);
parent.addRange(child4); parent.addRange(child4);
parent.disableRange(child2); child2.disable();
parent.disableRange(child3); child3.disable();
expect(enabledRecords(parent, recordNames)).toEqual(['record1', 'record4']); expect(enabledRecords(parent, recordNames)).toEqual(['record1', 'record4']);
}); });
@ -317,11 +318,12 @@ export function main() {
parent.addRange(child2); parent.addRange(child2);
parent.addRange(child3); parent.addRange(child3);
parent.addRange(child4); parent.addRange(child4);
parent.disableRange(child2);
parent.disableRange(child3);
parent.enableRange(child2); child2.disable();
parent.enableRange(child3); child2.disable();
child2.enable();
child3.enable();
expect(enabledRecords(parent, recordNames)).toEqual([ expect(enabledRecords(parent, recordNames)).toEqual([
'record1', 'record2', 'record3', 'record4' 'record1', 'record2', 'record3', 'record4'