[idmap/idset] implement forEach and perf improvement on diffingAttributionManager

This commit is contained in:
Kevin Jahns
2025-05-01 16:26:23 +02:00
parent 6e98b3f1f3
commit 00c2646031
3 changed files with 36 additions and 2 deletions

View File

@@ -175,8 +175,20 @@ export class DiffAttributionManager {
this._prevBOH = prevDoc.on('beforeObserverCalls', tr => { this._prevBOH = prevDoc.on('beforeObserverCalls', tr => {
insertIntoIdSet(_prevDocInserts, tr.insertSet) insertIntoIdSet(_prevDocInserts, tr.insertSet)
insertIntoIdSet(prevDocDeletes, tr.deleteSet) insertIntoIdSet(prevDocDeletes, tr.deleteSet)
this.inserts = diffIdMap(this.inserts, tr.insertSet) if (tr.insertSet.clients.size < 2) {
this.deletes = diffIdMap(this.deletes, tr.deleteSet) tr.insertSet.forEach((idrange, client) => {
this.inserts.delete(client, idrange.clock, idrange.len)
})
} else {
this.inserts = diffIdMap(this.inserts, tr.insertSet)
}
if (tr.deleteSet.clients.size < 2) {
tr.deleteSet.forEach((attrRange, client) => {
this.deletes.delete(client, attrRange.clock, attrRange.len)
})
} else {
this.deletes = diffIdMap(this.deletes, tr.deleteSet)
}
// @todo fire update ranges on `tr.insertSet` and `tr.deleteSet` // @todo fire update ranges on `tr.insertSet` and `tr.deleteSet`
}) })
this._destroyHandler = nextDoc.on('destroy', this.destroy.bind(this)) this._destroyHandler = nextDoc.on('destroy', this.destroy.bind(this))

View File

@@ -321,6 +321,17 @@ export class IdMap {
this.attrs = new Set() this.attrs = new Set()
} }
/**
* @param {(attrRange:AttrRange<Attrs>, client:number) => void} f
*/
forEach (f) {
this.clients.forEach((ranges, client) => {
ranges.getIds().forEach((range) => {
f(range, client)
})
})
}
/** /**
* @param {ID} id * @param {ID} id
* @return {boolean} * @return {boolean}

View File

@@ -113,6 +113,17 @@ export class IdSet {
this.clients = new Map() this.clients = new Map()
} }
/**
* @param {(idrange:IdRange, client:number) => void} f
*/
forEach (f) {
this.clients.forEach((ranges, client) => {
ranges.getIds().forEach((range) => {
f(range, client)
})
})
}
/** /**
* @param {ID} id * @param {ID} id
* @return {boolean} * @return {boolean}