Skip to content

Commit 5bac19c

Browse files
Remove Symbol.iterator (#1330)
1 parent ffd1526 commit 5bac19c

11 files changed

+27
-156
lines changed

packages/firestore/src/local/indexeddb_schema.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,9 @@ export class SchemaConverter implements SimpleDbSchemaConverter {
164164
);
165165
const batch = this.serializer.fromDbMutationBatch(dbBatch);
166166

167-
return removeMutationBatch(txn, queue.userId, batch).next();
167+
return removeMutationBatch(txn, queue.userId, batch).next(
168+
() => {}
169+
);
168170
});
169171
});
170172
});

packages/firestore/src/local/memory_persistence.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,9 @@ export class MemoryEagerDelegate implements ReferenceDelegate {
247247
// Since this is the eager delegate and memory persistence,
248248
// we don't care about the size of documents. We don't track
249249
// the size of the cache for eager GC.
250-
return cache.removeEntry(txn, key).next();
250+
return cache.removeEntry(txn, key).next(() => {});
251251
}
252+
return PersistencePromise.resolve();
252253
});
253254
});
254255
}
@@ -326,7 +327,7 @@ export class MemoryLruDelegate implements ReferenceDelegate, LruDelegate {
326327
): PersistencePromise<void> {
327328
return PersistencePromise.forEach(
328329
this.orphanedSequenceNumbers,
329-
({ key, value: sequenceNumber }) => {
330+
(key, sequenceNumber) => {
330331
// Pass in the exact sequence number as the upper bound so we know it won't be pinned by
331332
// being too recent.
332333
return this.isPinned(txn, key, sequenceNumber).next(isPinned => {

packages/firestore/src/local/memory_remote_document_cache.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ export class MemoryRemoteDocumentCache implements RemoteDocumentCache {
136136
transaction: PersistenceTransaction,
137137
f: (key: DocumentKey) => PersistencePromise<void>
138138
): PersistencePromise<void> {
139-
return PersistencePromise.forEach(this.docs, entry => f(entry.key));
139+
return PersistencePromise.forEach(this.docs, key => f(key));
140140
}
141141

142142
getNewDocumentChanges(

packages/firestore/src/local/persistence_promise.ts

Lines changed: 17 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -170,58 +170,33 @@ export class PersistencePromise<T> {
170170

171171
static waitFor(
172172
// tslint:disable-next-line:no-any Accept all Promise types in waitFor().
173-
all: Iterable<PersistencePromise<any>>
173+
all: { forEach: (cb: ((el: PersistencePromise<any>) => void)) => void }
174174
): PersistencePromise<void> {
175-
const it = all[Symbol.iterator]();
176175
return new PersistencePromise<void>((resolve, reject) => {
177176
let expectedCount = 0;
178177
let resolvedCount = 0;
178+
let done = false;
179179

180-
let result = it.next();
181-
while (!result.done) {
180+
all.forEach(element => {
182181
++expectedCount;
183-
result.value.next(
182+
element.next(
184183
() => {
185184
++resolvedCount;
186-
if (result.done && resolvedCount === expectedCount) {
185+
if (done && resolvedCount === expectedCount) {
187186
resolve();
188187
}
189188
},
190189
err => reject(err)
191190
);
192-
result = it.next();
193-
}
191+
});
194192

193+
done = true;
195194
if (resolvedCount === expectedCount) {
196195
resolve();
197196
}
198197
});
199198
}
200199

201-
static map<R>(all: Iterable<PersistencePromise<R>>): PersistencePromise<R[]> {
202-
const results: R[] = [];
203-
const promises: Array<PersistencePromise<void>> = [];
204-
205-
const it = all[Symbol.iterator]();
206-
let result = it.next();
207-
let count = 0;
208-
while (!result.done) {
209-
const value = result.value;
210-
const index = count;
211-
212-
promises.push(
213-
value.next(val => {
214-
results[index] = val;
215-
})
216-
);
217-
218-
result = it.next();
219-
++count;
220-
}
221-
222-
return PersistencePromise.waitFor(promises).next(() => results);
223-
}
224-
225200
/**
226201
* Given an array of predicate functions that asynchronously evaluate to a
227202
* boolean, implements a short-circuiting `or` between the results. Predicates
@@ -246,22 +221,19 @@ export class PersistencePromise<T> {
246221

247222
/**
248223
* Given an iterable, call the given function on each element in the
249-
* collection and wait for all of the resulting concurrent
250-
* PersistencePromises to resolve.
224+
* collection and wait for all of the resulting concurrent PersistencePromises
225+
* to resolve.
251226
*/
252-
static forEach<K>(
253-
collection: Iterable<K>,
254-
f: (item: K) => PersistencePromise<void>
227+
static forEach<R, S>(
228+
collection: { forEach: ((cb: ((r: R, s?: S) => void)) => void) },
229+
f:
230+
| ((r: R, s: S) => PersistencePromise<void>)
231+
| ((r: R) => PersistencePromise<void>)
255232
): PersistencePromise<void> {
256-
const it = collection[Symbol.iterator]();
257-
258233
const promises: Array<PersistencePromise<void>> = [];
259-
let result = it.next();
260-
while (!result.done) {
261-
const value = result.value;
262-
promises.push(f(value));
263-
result = it.next();
264-
}
234+
collection.forEach((r, s) => {
235+
promises.push(f.call(this, r, s));
236+
});
265237
return this.waitFor(promises);
266238
}
267239
}

packages/firestore/src/util/obj_map.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,4 @@ export class ObjectMap<KeyType extends Equatable<KeyType>, ValueType> {
107107
isEmpty(): boolean {
108108
return objUtil.isEmpty(this.inner);
109109
}
110-
111-
[Symbol.iterator](): Iterator<{ key: KeyType; value: ValueType }> {
112-
// We don't care about the keys, all of the actual keys are in the
113-
// arrays that are the values of the inner object.
114-
const entries: Array<{ key: KeyType; value: ValueType }> = [];
115-
this.forEach((key, value) => entries.push({ key, value }));
116-
return entries[Symbol.iterator]();
117-
}
118110
}

packages/firestore/src/util/sorted_map.ts

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -168,21 +168,6 @@ export class SortedMap<K, V> {
168168
getReverseIteratorFrom(key: K): SortedMapIterator<K, V> {
169169
return new SortedMapIterator<K, V>(this.root, key, this.comparator, true);
170170
}
171-
172-
[Symbol.iterator](): Iterator<Entry<K, V>> {
173-
const it = this.getIterator();
174-
return {
175-
next(): IteratorResult<Entry<K, V>> {
176-
if (it.hasNext()) {
177-
return { done: false, value: it.getNext() };
178-
} else {
179-
// The TypeScript typings don't allow `undefined` for Iterator<T>,
180-
// so we return an empty object instead.
181-
return { done: true, value: {} as Entry<K, V> };
182-
}
183-
}
184-
};
185-
}
186171
} // end SortedMap
187172

188173
// An iterator over an LLRBNode.

packages/firestore/src/util/sorted_set.ts

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -154,21 +154,6 @@ export class SortedSet<T> {
154154
return 'SortedSet(' + result.toString() + ')';
155155
}
156156

157-
[Symbol.iterator](): Iterator<T> {
158-
const it = this.data.getIterator();
159-
return {
160-
next(): IteratorResult<T> {
161-
if (it.hasNext()) {
162-
return { done: false, value: it.getNext().key };
163-
} else {
164-
// The TypeScript typings don't allow `undefined` for Iterator<T>,
165-
// so we return an empty object instead.
166-
return { done: true, value: {} as T };
167-
}
168-
}
169-
};
170-
}
171-
172157
private copy(data: SortedMap<T, boolean>): SortedSet<T> {
173158
const result = new SortedSet(this.comparator);
174159
result.data = data;

packages/firestore/test/unit/local/persistence_promise.test.ts

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
import { expect } from 'chai';
1818
import { PersistencePromise } from '../../../src/local/persistence_promise';
19-
import { Deferred } from '../../../src/util/promise';
2019

2120
import * as chai from 'chai';
2221
import * as chaiAsPromised from 'chai-as-promised';
@@ -236,40 +235,10 @@ describe('PersistencePromise', () => {
236235
if (success) {
237236
return PersistencePromise.resolve();
238237
} else {
239-
return PersistencePromise.reject(new Error('rejected'));
238+
return PersistencePromise.reject<void>(new Error('rejected'));
240239
}
241240
}).toPromise();
242241

243242
return expect(p).to.be.eventually.rejectedWith('rejected');
244243
});
245-
246-
it('maintains order for map()', async () => {
247-
const deferred = new Deferred<void>();
248-
249-
const pending = new PersistencePromise<string>(resolve => {
250-
return deferred.promise.then(() => resolve('first'));
251-
});
252-
const resolved = PersistencePromise.resolve('second');
253-
254-
const p = PersistencePromise.map([pending, resolved]).next(results => {
255-
expect(results).to.deep.eq(['first', 'second']);
256-
return PersistencePromise.resolve();
257-
});
258-
259-
setImmediate(() => {
260-
deferred.resolve();
261-
});
262-
263-
await p.toPromise();
264-
});
265-
266-
it('propagates error for map()', () => {
267-
const resolved = PersistencePromise.resolve('resolved');
268-
const rejected: PersistencePromise<string> = PersistencePromise.reject(
269-
new Error('rejected')
270-
);
271-
272-
const p = PersistencePromise.map([resolved, rejected]).toPromise();
273-
return expect(p).to.be.eventually.rejectedWith('rejected');
274-
});
275244
});

packages/firestore/test/unit/local/remote_document_cache.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ describe('IndexedDbRemoteDocumentCache', () => {
105105
): PersistencePromise<void> {
106106
const changeBuffer = cache.newChangeBuffer();
107107
return PersistencePromise.forEach(docs, doc =>
108-
changeBuffer.getEntry(txn, doc.key).next()
108+
changeBuffer.getEntry(txn, doc.key).next(() => {})
109109
).next(() => {
110110
for (const doc of docs) {
111111
changeBuffer.addEntry(doc);

packages/firestore/test/unit/local/test_remote_document_cache.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export abstract class TestRemoteDocumentCache {
5151
txn => {
5252
const changeBuffer = this.cache.newChangeBuffer();
5353
return PersistencePromise.forEach(maybeDocuments, maybeDocument =>
54-
changeBuffer.getEntry(txn, maybeDocument.key).next()
54+
changeBuffer.getEntry(txn, maybeDocument.key).next(() => {})
5555
).next(() => {
5656
for (const maybeDocument of maybeDocuments) {
5757
changeBuffer.addEntry(maybeDocument);

packages/firestore/test/unit/util/obj_map.test.ts

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -110,39 +110,4 @@ describe('ObjectMap', () => {
110110
expect(map.get(k2)).to.equal(undefined);
111111
expect(map.get(k3)).to.equal(undefined);
112112
});
113-
114-
it('can iterate', () => {
115-
const map = new ObjectMap<TestKey, string>(o => o.mapKey);
116-
const k1 = new TestKey(4, 4);
117-
const k2 = new TestKey(5, 5);
118-
// Test a collision
119-
const k3 = new TestKey(5, 6);
120-
// Test an overwrite
121-
const k4 = new TestKey(-12354, -12354);
122-
const k5 = new TestKey(-12354, -12354);
123-
map.set(k1, 'foo');
124-
map.set(k2, 'bar');
125-
map.set(k3, 'blah');
126-
map.set(k4, 'baz');
127-
map.set(k5, 'boo');
128-
129-
const expectedKeys: TestKey[] = [];
130-
map.forEach(key => {
131-
expectedKeys.push(key);
132-
});
133-
134-
const iterated: Array<{ key: TestKey; value: string }> = [];
135-
const it = map[Symbol.iterator]();
136-
let result = it.next();
137-
while (!result.done) {
138-
iterated.push(result.value);
139-
result = it.next();
140-
}
141-
142-
for (const entry of iterated) {
143-
expect(expectedKeys.indexOf(entry.key)).to.not.equal(-1);
144-
expect(map.get(entry.key)).to.equal(entry.value);
145-
}
146-
expect(iterated.length).to.equal(expectedKeys.length);
147-
});
148113
});

0 commit comments

Comments
 (0)