@fluidframework/merge-tree 2.1.0-276985 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.cjs +2 -4
- package/CHANGELOG.md +15 -0
- package/README.md +109 -1
- package/api-extractor/api-extractor.current.json +5 -0
- package/api-extractor/api-extractor.legacy.json +1 -1
- package/api-extractor.json +1 -1
- package/api-report/merge-tree.legacy.alpha.api.md +10 -22
- package/api-report/merge-tree.legacy.public.api.md +9 -0
- package/dist/MergeTreeTextHelper.d.ts.map +1 -1
- package/dist/MergeTreeTextHelper.js +1 -1
- package/dist/MergeTreeTextHelper.js.map +1 -1
- package/dist/attributionCollection.d.ts.map +1 -1
- package/dist/attributionCollection.js +65 -17
- package/dist/attributionCollection.js.map +1 -1
- package/dist/attributionPolicy.d.ts +2 -1
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js +10 -3
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.d.ts +3 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +65 -37
- package/dist/client.js.map +1 -1
- package/dist/collections/list.d.ts.map +1 -1
- package/dist/collections/list.js +5 -2
- package/dist/collections/list.js.map +1 -1
- package/dist/collections/rbTree.d.ts +2 -2
- package/dist/collections/rbTree.d.ts.map +1 -1
- package/dist/collections/rbTree.js +23 -35
- package/dist/collections/rbTree.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js +4 -1
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/legacy.d.ts +1 -1
- package/dist/localReference.d.ts +16 -6
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +31 -20
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +0 -1
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +127 -112
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
- package/dist/mergeTreeNodeWalk.js +1 -1
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +6 -5
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +29 -20
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/mergeTreeTracking.js +3 -3
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/opBuilder.d.ts +6 -1
- package/dist/opBuilder.d.ts.map +1 -1
- package/dist/opBuilder.js +5 -0
- package/dist/opBuilder.js.map +1 -1
- package/dist/ops.d.ts.map +1 -1
- package/dist/ops.js.map +1 -1
- package/dist/ordinal.d.ts.map +1 -1
- package/dist/ordinal.js +7 -0
- package/dist/ordinal.js.map +1 -1
- package/dist/partialLengths.d.ts +4 -2
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +101 -53
- package/dist/partialLengths.js.map +1 -1
- package/dist/perspective.d.ts +4 -1
- package/dist/perspective.d.ts.map +1 -1
- package/dist/perspective.js +7 -6
- package/dist/perspective.js.map +1 -1
- package/dist/properties.d.ts +13 -10
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js +22 -11
- package/dist/properties.js.map +1 -1
- package/dist/public.d.ts +1 -1
- package/dist/referencePositions.d.ts +7 -0
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +7 -0
- package/dist/referencePositions.js.map +1 -1
- package/dist/revertibles.d.ts +6 -0
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +50 -21
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +2 -0
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts +7 -3
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js +20 -15
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/snapshotChunks.d.ts.map +1 -1
- package/dist/snapshotChunks.js +10 -5
- package/dist/snapshotChunks.js.map +1 -1
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +14 -10
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +20 -8
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +4 -2
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js +8 -1
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/sortedSet.d.ts.map +1 -1
- package/dist/sortedSet.js +4 -0
- package/dist/sortedSet.js.map +1 -1
- package/dist/test/Insertion.perf.spec.js.map +1 -1
- package/dist/test/Removal.perf.spec.js.map +1 -1
- package/dist/test/Snapshot.perf.spec.js +1 -0
- package/dist/test/Snapshot.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.perf.spec.js +3 -1
- package/dist/test/attributionCollection.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.spec.js +69 -68
- package/dist/test/attributionCollection.spec.js.map +1 -1
- package/dist/test/attributionPolicy.spec.js +29 -27
- package/dist/test/attributionPolicy.spec.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts +1 -4
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js +32 -30
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js +5 -5
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/client.apis.spec.d.ts.map +1 -1
- package/dist/test/client.apis.spec.js +5 -7
- package/dist/test/client.apis.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js +125 -103
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.js +18 -10
- package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.js +13 -8
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.conflictFarm.spec.js +4 -2
- package/dist/test/client.conflictFarm.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js +10 -10
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +111 -104
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js +14 -10
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.rebasePosition.spec.js +12 -12
- package/dist/test/client.rebasePosition.spec.js.map +1 -1
- package/dist/test/client.reconnectFarm.spec.js +12 -9
- package/dist/test/client.reconnectFarm.spec.js.map +1 -1
- package/dist/test/client.replay.spec.js +11 -10
- package/dist/test/client.replay.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js +87 -84
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/client.rollbackFarm.spec.js +3 -1
- package/dist/test/client.rollbackFarm.spec.js.map +1 -1
- package/dist/test/client.searchForMarker.spec.js +122 -112
- package/dist/test/client.searchForMarker.spec.js.map +1 -1
- package/dist/test/client.walkSegments.spec.js +7 -7
- package/dist/test/client.walkSegments.spec.js.map +1 -1
- package/dist/test/collections.list.spec.js +14 -14
- package/dist/test/collections.list.spec.js.map +1 -1
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js +3 -3
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
- package/dist/test/dirname.cjs +1 -0
- package/dist/test/dirname.cjs.map +1 -1
- package/dist/test/dirname.d.cts.map +1 -1
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js +7 -7
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +87 -87
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.insert.deltaCallback.spec.js +6 -6
- package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js +24 -24
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +6 -6
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js +23 -23
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/mergeTree.walk.spec.js +3 -3
- package/dist/test/mergeTree.walk.spec.js.map +1 -1
- package/dist/test/mergeTree.zamboni.spec.js +10 -10
- package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +28 -16
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.spec.js +9 -5
- package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/dist/test/obliterate.concurrent.spec.js +165 -165
- package/dist/test/obliterate.concurrent.spec.js.map +1 -1
- package/dist/test/obliterate.deltaCallback.spec.js +20 -21
- package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/dist/test/obliterate.partialLength.spec.js +7 -7
- package/dist/test/obliterate.partialLength.spec.js.map +1 -1
- package/dist/test/obliterate.reconnect.spec.js +13 -13
- package/dist/test/obliterate.reconnect.spec.js.map +1 -1
- package/dist/test/obliterate.spec.js +9 -9
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/ordinal.spec.js +10 -4
- package/dist/test/ordinal.spec.js.map +1 -1
- package/dist/test/partialLength.spec.js.map +1 -1
- package/dist/test/properties.spec.js +15 -15
- package/dist/test/properties.spec.js.map +1 -1
- package/dist/test/reconnectHelper.d.ts +4 -4
- package/dist/test/reconnectHelper.d.ts.map +1 -1
- package/dist/test/reconnectHelper.js +28 -20
- package/dist/test/reconnectHelper.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js +35 -29
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/revertibleFarm.spec.js +11 -10
- package/dist/test/revertibleFarm.spec.js.map +1 -1
- package/dist/test/revertibles.spec.d.ts.map +1 -1
- package/dist/test/revertibles.spec.js +96 -57
- package/dist/test/revertibles.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js +17 -17
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/snapshot.spec.js +5 -5
- package/dist/test/snapshot.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js +6 -6
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/snapshotlegacy.spec.js +18 -13
- package/dist/test/snapshotlegacy.spec.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js +22 -18
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.d.ts +6 -5
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js +30 -32
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +39 -38
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testSerializer.d.ts +5 -5
- package/dist/test/testSerializer.d.ts.map +1 -1
- package/dist/test/testSerializer.js +0 -1
- package/dist/test/testSerializer.js.map +1 -1
- package/dist/test/testServer.d.ts.map +1 -1
- package/dist/test/testServer.js.map +1 -1
- package/dist/test/testUtils.d.ts +1 -1
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +15 -17
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.d.ts.map +1 -1
- package/dist/test/text.js +1 -1
- package/dist/test/text.js.map +1 -1
- package/dist/test/tracking.spec.js +50 -46
- package/dist/test/tracking.spec.js.map +1 -1
- package/dist/test/wordUnitTests.spec.d.ts.map +1 -1
- package/dist/test/wordUnitTests.spec.js +10 -10
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/dist/textSegment.d.ts +1 -1
- package/dist/textSegment.d.ts.map +1 -1
- package/dist/textSegment.js +3 -3
- package/dist/textSegment.js.map +1 -1
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js +7 -2
- package/dist/zamboni.js.map +1 -1
- package/internal.d.ts +1 -1
- package/legacy.d.ts +1 -1
- package/lib/MergeTreeTextHelper.d.ts.map +1 -1
- package/lib/MergeTreeTextHelper.js +1 -1
- package/lib/MergeTreeTextHelper.js.map +1 -1
- package/lib/attributionCollection.d.ts.map +1 -1
- package/lib/attributionCollection.js +65 -17
- package/lib/attributionCollection.js.map +1 -1
- package/lib/attributionPolicy.d.ts +2 -1
- package/lib/attributionPolicy.d.ts.map +1 -1
- package/lib/attributionPolicy.js +10 -3
- package/lib/attributionPolicy.js.map +1 -1
- package/lib/client.d.ts +3 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +65 -37
- package/lib/client.js.map +1 -1
- package/lib/collections/list.d.ts.map +1 -1
- package/lib/collections/list.js +5 -2
- package/lib/collections/list.js.map +1 -1
- package/lib/collections/rbTree.d.ts +2 -2
- package/lib/collections/rbTree.d.ts.map +1 -1
- package/lib/collections/rbTree.js +23 -35
- package/lib/collections/rbTree.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js +4 -1
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/legacy.d.ts +1 -1
- package/lib/localReference.d.ts +16 -6
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +31 -20
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +0 -1
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +127 -112
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
- package/lib/mergeTreeNodeWalk.js +1 -1
- package/lib/mergeTreeNodeWalk.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +6 -5
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +29 -20
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/mergeTreeTracking.js +3 -3
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/opBuilder.d.ts +6 -1
- package/lib/opBuilder.d.ts.map +1 -1
- package/lib/opBuilder.js +5 -0
- package/lib/opBuilder.js.map +1 -1
- package/lib/ops.d.ts.map +1 -1
- package/lib/ops.js.map +1 -1
- package/lib/ordinal.d.ts.map +1 -1
- package/lib/ordinal.js +7 -0
- package/lib/ordinal.js.map +1 -1
- package/lib/partialLengths.d.ts +4 -2
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +101 -53
- package/lib/partialLengths.js.map +1 -1
- package/lib/perspective.d.ts +4 -1
- package/lib/perspective.d.ts.map +1 -1
- package/lib/perspective.js +7 -6
- package/lib/perspective.js.map +1 -1
- package/lib/properties.d.ts +13 -10
- package/lib/properties.d.ts.map +1 -1
- package/lib/properties.js +22 -11
- package/lib/properties.js.map +1 -1
- package/lib/public.d.ts +1 -1
- package/lib/referencePositions.d.ts +7 -0
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js +7 -0
- package/lib/referencePositions.js.map +1 -1
- package/lib/revertibles.d.ts +6 -0
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +50 -21
- package/lib/revertibles.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +2 -0
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentPropertiesManager.d.ts +7 -3
- package/lib/segmentPropertiesManager.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js +20 -15
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/snapshotChunks.d.ts.map +1 -1
- package/lib/snapshotChunks.js +10 -5
- package/lib/snapshotChunks.js.map +1 -1
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +14 -10
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +20 -8
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +4 -2
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js +8 -1
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/sortedSet.d.ts.map +1 -1
- package/lib/sortedSet.js +4 -0
- package/lib/sortedSet.js.map +1 -1
- package/lib/test/Insertion.perf.spec.js.map +1 -1
- package/lib/test/Removal.perf.spec.js.map +1 -1
- package/lib/test/Snapshot.perf.spec.js +1 -0
- package/lib/test/Snapshot.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.perf.spec.js +3 -1
- package/lib/test/attributionCollection.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.spec.js +3 -2
- package/lib/test/attributionCollection.spec.js.map +1 -1
- package/lib/test/attributionPolicy.spec.js +3 -1
- package/lib/test/attributionPolicy.spec.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts +1 -4
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js +26 -24
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.annotateMarker.spec.js +1 -1
- package/lib/test/client.annotateMarker.spec.js.map +1 -1
- package/lib/test/client.apis.spec.d.ts.map +1 -1
- package/lib/test/client.apis.spec.js +4 -6
- package/lib/test/client.apis.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js +72 -50
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.js +18 -10
- package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.js +12 -7
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.conflictFarm.spec.js +4 -2
- package/lib/test/client.conflictFarm.spec.js.map +1 -1
- package/lib/test/client.getPosition.spec.js +1 -1
- package/lib/test/client.getPosition.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js +14 -7
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.localReferenceFarm.spec.js +13 -9
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
- package/lib/test/client.rebasePosition.spec.js +1 -1
- package/lib/test/client.rebasePosition.spec.js.map +1 -1
- package/lib/test/client.reconnectFarm.spec.js +11 -8
- package/lib/test/client.reconnectFarm.spec.js.map +1 -1
- package/lib/test/client.replay.spec.js +8 -7
- package/lib/test/client.replay.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js +14 -11
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/client.rollbackFarm.spec.js +3 -1
- package/lib/test/client.rollbackFarm.spec.js.map +1 -1
- package/lib/test/client.searchForMarker.spec.js +29 -19
- package/lib/test/client.searchForMarker.spec.js.map +1 -1
- package/lib/test/client.walkSegments.spec.js +1 -1
- package/lib/test/client.walkSegments.spec.js.map +1 -1
- package/lib/test/collections.list.spec.js +1 -1
- package/lib/test/collections.list.spec.js.map +1 -1
- package/lib/test/createInsertOnlyAttributionPolicy.spec.js +1 -1
- package/lib/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
- package/lib/test/dirname.cjs +1 -0
- package/lib/test/dirname.cjs.map +1 -1
- package/lib/test/dirname.d.cts.map +1 -1
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js +1 -1
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/mergeTree.insert.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.insertingWalk.spec.js +8 -8
- package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/lib/test/mergeTree.walk.spec.js +1 -1
- package/lib/test/mergeTree.walk.spec.js.map +1 -1
- package/lib/test/mergeTree.zamboni.spec.js +1 -1
- package/lib/test/mergeTree.zamboni.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js +27 -15
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.spec.js +5 -1
- package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/lib/test/obliterate.concurrent.spec.js +4 -4
- package/lib/test/obliterate.concurrent.spec.js.map +1 -1
- package/lib/test/obliterate.deltaCallback.spec.js +2 -3
- package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/lib/test/obliterate.partialLength.spec.js +1 -1
- package/lib/test/obliterate.partialLength.spec.js.map +1 -1
- package/lib/test/obliterate.reconnect.spec.js +1 -1
- package/lib/test/obliterate.reconnect.spec.js.map +1 -1
- package/lib/test/obliterate.spec.js +1 -1
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/ordinal.spec.js +7 -1
- package/lib/test/ordinal.spec.js.map +1 -1
- package/lib/test/partialLength.spec.js.map +1 -1
- package/lib/test/properties.spec.js +1 -1
- package/lib/test/properties.spec.js.map +1 -1
- package/lib/test/reconnectHelper.d.ts +4 -4
- package/lib/test/reconnectHelper.d.ts.map +1 -1
- package/lib/test/reconnectHelper.js +22 -14
- package/lib/test/reconnectHelper.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js +8 -2
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/revertibleFarm.spec.js +8 -7
- package/lib/test/revertibleFarm.spec.js.map +1 -1
- package/lib/test/revertibles.spec.d.ts.map +1 -1
- package/lib/test/revertibles.spec.js +93 -54
- package/lib/test/revertibles.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js +1 -1
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/snapshot.spec.js +1 -1
- package/lib/test/snapshot.spec.js.map +1 -1
- package/lib/test/snapshot.utils.d.ts.map +1 -1
- package/lib/test/snapshot.utils.js +1 -1
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/snapshotlegacy.spec.js +10 -5
- package/lib/test/snapshotlegacy.spec.js.map +1 -1
- package/lib/test/sortedSegmentSet.spec.js +6 -2
- package/lib/test/sortedSegmentSet.spec.js.map +1 -1
- package/lib/test/testClient.d.ts +6 -5
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js +25 -27
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js +37 -36
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/test/testSerializer.d.ts +5 -5
- package/lib/test/testSerializer.d.ts.map +1 -1
- package/lib/test/testSerializer.js +0 -1
- package/lib/test/testSerializer.js.map +1 -1
- package/lib/test/testServer.d.ts.map +1 -1
- package/lib/test/testServer.js.map +1 -1
- package/lib/test/testUtils.d.ts +1 -1
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js +6 -8
- package/lib/test/testUtils.js.map +1 -1
- package/lib/test/text.d.ts.map +1 -1
- package/lib/test/text.js +1 -1
- package/lib/test/text.js.map +1 -1
- package/lib/test/tracking.spec.js +9 -5
- package/lib/test/tracking.spec.js.map +1 -1
- package/lib/test/wordUnitTests.spec.d.ts.map +1 -1
- package/lib/test/wordUnitTests.spec.js +9 -9
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/lib/textSegment.d.ts +1 -1
- package/lib/textSegment.d.ts.map +1 -1
- package/lib/textSegment.js +3 -3
- package/lib/textSegment.js.map +1 -1
- package/lib/zamboni.d.ts.map +1 -1
- package/lib/zamboni.js +7 -2
- package/lib/zamboni.js.map +1 -1
- package/package.json +29 -27
- package/src/MergeTreeTextHelper.ts +2 -2
- package/src/attributionCollection.ts +71 -28
- package/src/attributionPolicy.ts +14 -9
- package/src/client.ts +120 -71
- package/src/collections/list.ts +9 -6
- package/src/collections/rbTree.ts +62 -71
- package/src/endOfTreeSegment.ts +21 -10
- package/src/localReference.ts +61 -43
- package/src/mergeTree.ts +229 -178
- package/src/mergeTreeNodeWalk.ts +2 -1
- package/src/mergeTreeNodes.ts +59 -46
- package/src/mergeTreeTracking.ts +3 -3
- package/src/opBuilder.ts +6 -1
- package/src/ops.ts +5 -0
- package/src/ordinal.ts +8 -1
- package/src/partialLengths.ts +143 -87
- package/src/perspective.ts +10 -7
- package/src/properties.ts +36 -18
- package/src/referencePositions.ts +7 -0
- package/src/revertibles.ts +71 -41
- package/src/segmentGroupCollection.ts +8 -6
- package/src/segmentPropertiesManager.ts +28 -24
- package/src/snapshotChunks.ts +12 -7
- package/src/snapshotLoader.ts +20 -17
- package/src/snapshotV1.ts +36 -18
- package/src/snapshotlegacy.ts +7 -5
- package/src/sortedSegmentSet.ts +9 -3
- package/src/sortedSet.ts +7 -3
- package/src/textSegment.ts +9 -9
- package/src/zamboni.ts +14 -10
- package/tsconfig.json +0 -1
package/lib/collections/list.js
CHANGED
|
@@ -22,6 +22,8 @@ class HeadNode {
|
|
|
22
22
|
return this.headNode._list;
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
+
// The any is needed for use in the remove function, where the nodes are defined with a generic type.
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
27
|
const DeadHead = new HeadNode(undefined);
|
|
26
28
|
class DataNode extends HeadNode {
|
|
27
29
|
constructor(headNode, data) {
|
|
@@ -34,7 +36,7 @@ function insertAfter(node, items) {
|
|
|
34
36
|
let previousNode = node;
|
|
35
37
|
const oldNext = previousNode._next;
|
|
36
38
|
let newRange;
|
|
37
|
-
|
|
39
|
+
for (const n of items) {
|
|
38
40
|
const newNode = new DataNode(node.headNode, n);
|
|
39
41
|
if (newRange === undefined) {
|
|
40
42
|
newRange = { first: newNode, last: newNode };
|
|
@@ -45,7 +47,7 @@ function insertAfter(node, items) {
|
|
|
45
47
|
newNode._prev = previousNode;
|
|
46
48
|
previousNode._next = newNode;
|
|
47
49
|
previousNode = newNode;
|
|
48
|
-
}
|
|
50
|
+
}
|
|
49
51
|
oldNext._prev = previousNode;
|
|
50
52
|
previousNode._next = oldNext;
|
|
51
53
|
// explicitly prevent newRange from being undefined without casting,
|
|
@@ -153,6 +155,7 @@ export class DoublyLinkedList {
|
|
|
153
155
|
if (this._includes(node)) {
|
|
154
156
|
node._prev._next = node._next;
|
|
155
157
|
node._next._prev = node._prev;
|
|
158
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
156
159
|
node.headNode = node._next = node._prev = DeadHead;
|
|
157
160
|
this._len--;
|
|
158
161
|
return node;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/collections/list.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nexport interface ListNode<T> {\n\treadonly list: DoublyLinkedList<T> | undefined;\n\treadonly data: T;\n\treadonly next: ListNode<T> | undefined;\n\treadonly prev: ListNode<T> | undefined;\n}\n\nexport interface ListNodeRange<T> {\n\tfirst: ListNode<T>;\n\tlast: ListNode<T>;\n}\n\nclass HeadNode<T> {\n\tpublic _next: HeadNode<T> | DataNode<T> = this;\n\tpublic _prev: HeadNode<T> | DataNode<T> = this;\n\tpublic headNode: HeadNode<T> = this;\n\tprivate readonly _list?: DoublyLinkedList<T>;\n\tconstructor(list: DoublyLinkedList<T> | undefined) {\n\t\tif (list) {\n\t\t\tthis._list = list;\n\t\t}\n\t}\n\tpublic get next(): DataNode<T> | undefined {\n\t\treturn this._next === this.headNode ? undefined : (this._next as DataNode<T>);\n\t}\n\tpublic get prev(): DataNode<T> | undefined {\n\t\treturn this._prev === this.headNode ? undefined : (this._prev as DataNode<T>);\n\t}\n\tpublic get list() {\n\t\treturn this.headNode._list;\n\t}\n}\n\nconst DeadHead = new HeadNode<any>(undefined);\n\nclass DataNode<T> extends HeadNode<T> implements ListNode<T> {\n\tconstructor(\n\t\theadNode: HeadNode<T>,\n\t\tpublic readonly data: T,\n\t) {\n\t\tsuper(undefined);\n\t\tthis.headNode = headNode;\n\t}\n}\n\nfunction insertAfter<T>(node: DataNode<T> | HeadNode<T>, items: T[]): ListNodeRange<T> {\n\tlet previousNode = node;\n\tconst oldNext = previousNode._next;\n\tlet newRange: ListNodeRange<T> | undefined;\n\titems.forEach((n) => {\n\t\tconst newNode = new DataNode<T>(node.headNode, n);\n\t\tif (newRange === undefined) {\n\t\t\tnewRange = { first: newNode, last: newNode };\n\t\t} else {\n\t\t\tnewRange.last = newNode;\n\t\t}\n\t\tnewNode._prev = previousNode;\n\t\tpreviousNode._next = newNode;\n\t\tpreviousNode = newNode;\n\t});\n\toldNext._prev = previousNode;\n\tpreviousNode._next = oldNext;\n\t// explicitly prevent newRange from being undefined without casting,\n\t// and without additional conditionals, as this is used in some perf critical areas.\n\t// i could have just asserted, but that throws a non-user friendly error,\n\t// so i went with a more user-friendly error, which describes the\n\t// only condition that could lead to this being undefined in the current code.\n\tif (newRange === undefined) {\n\t\tthrow new UsageError(\"items must not be empty\");\n\t}\n\treturn newRange;\n}\n\nexport class DoublyLinkedList<T>\n\timplements\n\t\tIterable<ListNode<T>>,\n\t\tPartial<ListNodeRange<T>>,\n\t\t// try to match array signature and semantics where possible\n\t\tPick<ListNode<T>[], \"pop\" | \"shift\" | \"length\" | \"includes\">\n{\n\tfind(\n\t\tpredicate: (value: ListNode<T>, obj: DoublyLinkedList<T>) => unknown,\n\t): ListNode<T> | undefined {\n\t\tlet found: ListNode<T> | undefined;\n\t\twalkList(this, (node) => {\n\t\t\tif (predicate(node, this)) {\n\t\t\t\tfound = node;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\treturn found;\n\t}\n\n\tmap<U>(callbackfn: (value: ListNode<T>) => U): Iterable<U> {\n\t\tlet node = this.first;\n\t\tconst iterator: IterableIterator<U> = {\n\t\t\tnext(): IteratorResult<U> {\n\t\t\t\tif (node === undefined) {\n\t\t\t\t\treturn { done: true, value: undefined };\n\t\t\t\t}\n\t\t\t\tconst rtn = { value: callbackfn(node), done: false };\n\t\t\t\tnode = node.next;\n\t\t\t\treturn rtn;\n\t\t\t},\n\t\t\t[Symbol.iterator]() {\n\t\t\t\treturn this;\n\t\t\t},\n\t\t};\n\t\treturn iterator;\n\t}\n\n\tinsertAfter(preceding: ListNode<T>, ...items: T[]): ListNodeRange<T> {\n\t\tif (!this._includes(preceding)) {\n\t\t\tthrow new Error(\"preceding not in list\");\n\t\t}\n\t\tthis._len += items.length;\n\t\treturn insertAfter(preceding, items);\n\t}\n\n\tpop(): ListNode<T> | undefined {\n\t\treturn this.remove(this.last);\n\t}\n\n\tpush(...items: T[]): ListNodeRange<T> {\n\t\tthis._len += items.length;\n\t\tconst start = this.headNode._prev;\n\t\treturn insertAfter(start, items);\n\t}\n\n\t/**\n\t * Remove and return the first element\n\t */\n\tshift(): ListNode<T> | undefined {\n\t\treturn this.remove(this.first);\n\t}\n\n\t/**\n\t * Insert `items` at start of list\n\t */\n\tunshift(...items: T[]): ListNodeRange<T> {\n\t\tthis._len += items.length;\n\t\treturn insertAfter(this.headNode, items);\n\t}\n\n\t/**\n\t * Remove nodes starting at `start` until either the `end` node is reached\n\t * or until `count` nodes have been removed. Returns the removed nodes as\n\t * a separate linked list\n\t */\n\tsplice(start: ListNode<T>, countOrEnd?: ListNode<T> | number): DoublyLinkedList<T> {\n\t\tconst newList = new DoublyLinkedList<T>();\n\t\twalkList(\n\t\t\tthis,\n\t\t\t(node) => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tconst removedNode = this._remove(node)!;\n\t\t\t\t// whats special here is we preserve the node\n\t\t\t\t// this allow looking up the old node in the new list\n\t\t\t\t// when something preserves a reference\n\t\t\t\tremovedNode.headNode = newList.headNode;\n\t\t\t\tremovedNode._next = newList.headNode;\n\t\t\t\tremovedNode._prev = newList.headNode._prev;\n\t\t\t\tnewList.headNode._prev._next = removedNode;\n\t\t\t\tnewList.headNode._prev = removedNode;\n\t\t\t\tnewList._len++;\n\t\t\t\tif (node === countOrEnd || newList.length === countOrEnd) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tstart,\n\t\t);\n\t\treturn newList;\n\t}\n\n\tpublic includes(node: ListNode<T> | undefined): node is ListNode<T> {\n\t\treturn this._includes(node);\n\t}\n\n\tprivate _includes(node: ListNode<T> | undefined): node is DataNode<T> {\n\t\treturn node instanceof DataNode && node.headNode === this.headNode;\n\t}\n\n\tprivate _remove(node: ListNode<T> | undefined): DataNode<T> | undefined {\n\t\tif (this._includes(node)) {\n\t\t\tnode._prev._next = node._next;\n\t\t\tnode._next._prev = node._prev;\n\t\t\tnode.headNode = node._next = node._prev = DeadHead;\n\t\t\tthis._len--;\n\t\t\treturn node;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic remove(node: ListNode<T> | undefined): ListNode<T> | undefined {\n\t\treturn this._remove(node);\n\t}\n\n\tpublic [Symbol.iterator](): IterableIterator<ListNode<T>> {\n\t\tlet value = this.first;\n\t\tconst iterator: IterableIterator<ListNode<T>> = {\n\t\t\tnext(): IteratorResult<ListNode<T>> {\n\t\t\t\tif (value !== undefined) {\n\t\t\t\t\tconst rtn = { value, done: false };\n\t\t\t\t\tvalue = value.next;\n\t\t\t\t\treturn rtn;\n\t\t\t\t}\n\t\t\t\treturn { value: undefined, done: true };\n\t\t\t},\n\t\t\t[Symbol.iterator]() {\n\t\t\t\treturn this;\n\t\t\t},\n\t\t};\n\t\treturn iterator;\n\t}\n\n\tprivate _len: number = 0;\n\tprivate readonly headNode: HeadNode<T> | DataNode<T> = new HeadNode(this);\n\tpublic get length() {\n\t\treturn this._len;\n\t}\n\tpublic get empty() {\n\t\treturn this._len === 0;\n\t}\n\tpublic get first(): ListNode<T> | undefined {\n\t\treturn this.headNode.next;\n\t}\n\n\tpublic get last(): ListNode<T> | undefined {\n\t\treturn this.headNode.prev;\n\t}\n}\n\nexport function walkList<T>(\n\tlist: DoublyLinkedList<T>,\n\tvisitor: (node: ListNode<T>) => boolean | void,\n\tstart?: ListNode<T>,\n\tforward: boolean = true,\n) {\n\tlet current: ListNode<T> | undefined;\n\tif (start) {\n\t\tif (!list.includes(start)) {\n\t\t\tthrow new UsageError(\"start must be in the provided list\");\n\t\t}\n\t\tcurrent = start;\n\t} else {\n\t\tcurrent = forward ? list.first : list.last;\n\t}\n\t// cache the next node, incase the visitor mutates the list\n\t// need this to support splice\n\tlet next = forward ? current?.next : current?.prev;\n\twhile (current !== undefined) {\n\t\tif (visitor(current) === false) {\n\t\t\treturn false;\n\t\t}\n\t\tcurrent = next;\n\t\tnext = forward ? next?.next : next?.prev;\n\t}\n\treturn true;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/collections/list.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nexport interface ListNode<T> {\n\treadonly list: DoublyLinkedList<T> | undefined;\n\treadonly data: T;\n\treadonly next: ListNode<T> | undefined;\n\treadonly prev: ListNode<T> | undefined;\n}\n\nexport interface ListNodeRange<T> {\n\tfirst: ListNode<T>;\n\tlast: ListNode<T>;\n}\n\nclass HeadNode<T> {\n\tpublic _next: HeadNode<T> | DataNode<T> = this;\n\tpublic _prev: HeadNode<T> | DataNode<T> = this;\n\tpublic headNode: HeadNode<T> = this;\n\tprivate readonly _list?: DoublyLinkedList<T>;\n\tconstructor(list: DoublyLinkedList<T> | undefined) {\n\t\tif (list) {\n\t\t\tthis._list = list;\n\t\t}\n\t}\n\tpublic get next(): DataNode<T> | undefined {\n\t\treturn this._next === this.headNode ? undefined : (this._next as DataNode<T>);\n\t}\n\tpublic get prev(): DataNode<T> | undefined {\n\t\treturn this._prev === this.headNode ? undefined : (this._prev as DataNode<T>);\n\t}\n\tpublic get list(): DoublyLinkedList<T> | undefined {\n\t\treturn this.headNode._list;\n\t}\n}\n\n// The any is needed for use in the remove function, where the nodes are defined with a generic type.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst DeadHead = new HeadNode<any>(undefined);\n\nclass DataNode<T> extends HeadNode<T> implements ListNode<T> {\n\tconstructor(\n\t\theadNode: HeadNode<T>,\n\t\tpublic readonly data: T,\n\t) {\n\t\tsuper(undefined);\n\t\tthis.headNode = headNode;\n\t}\n}\n\nfunction insertAfter<T>(node: DataNode<T> | HeadNode<T>, items: T[]): ListNodeRange<T> {\n\tlet previousNode = node;\n\tconst oldNext = previousNode._next;\n\tlet newRange: ListNodeRange<T> | undefined;\n\tfor (const n of items) {\n\t\tconst newNode = new DataNode<T>(node.headNode, n);\n\t\tif (newRange === undefined) {\n\t\t\tnewRange = { first: newNode, last: newNode };\n\t\t} else {\n\t\t\tnewRange.last = newNode;\n\t\t}\n\t\tnewNode._prev = previousNode;\n\t\tpreviousNode._next = newNode;\n\t\tpreviousNode = newNode;\n\t}\n\toldNext._prev = previousNode;\n\tpreviousNode._next = oldNext;\n\t// explicitly prevent newRange from being undefined without casting,\n\t// and without additional conditionals, as this is used in some perf critical areas.\n\t// i could have just asserted, but that throws a non-user friendly error,\n\t// so i went with a more user-friendly error, which describes the\n\t// only condition that could lead to this being undefined in the current code.\n\tif (newRange === undefined) {\n\t\tthrow new UsageError(\"items must not be empty\");\n\t}\n\treturn newRange;\n}\n\nexport class DoublyLinkedList<T>\n\timplements\n\t\tIterable<ListNode<T>>,\n\t\tPartial<ListNodeRange<T>>,\n\t\t// try to match array signature and semantics where possible\n\t\tPick<ListNode<T>[], \"pop\" | \"shift\" | \"length\" | \"includes\">\n{\n\tfind(\n\t\tpredicate: (value: ListNode<T>, obj: DoublyLinkedList<T>) => unknown,\n\t): ListNode<T> | undefined {\n\t\tlet found: ListNode<T> | undefined;\n\t\twalkList(this, (node) => {\n\t\t\tif (predicate(node, this)) {\n\t\t\t\tfound = node;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\treturn found;\n\t}\n\n\tmap<U>(callbackfn: (value: ListNode<T>) => U): Iterable<U> {\n\t\tlet node = this.first;\n\t\tconst iterator: IterableIterator<U> = {\n\t\t\tnext(): IteratorResult<U> {\n\t\t\t\tif (node === undefined) {\n\t\t\t\t\treturn { done: true, value: undefined };\n\t\t\t\t}\n\t\t\t\tconst rtn = { value: callbackfn(node), done: false };\n\t\t\t\tnode = node.next;\n\t\t\t\treturn rtn;\n\t\t\t},\n\t\t\t[Symbol.iterator]() {\n\t\t\t\treturn this;\n\t\t\t},\n\t\t};\n\t\treturn iterator;\n\t}\n\n\tinsertAfter(preceding: ListNode<T>, ...items: T[]): ListNodeRange<T> {\n\t\tif (!this._includes(preceding)) {\n\t\t\tthrow new Error(\"preceding not in list\");\n\t\t}\n\t\tthis._len += items.length;\n\t\treturn insertAfter(preceding, items);\n\t}\n\n\tpop(): ListNode<T> | undefined {\n\t\treturn this.remove(this.last);\n\t}\n\n\tpush(...items: T[]): ListNodeRange<T> {\n\t\tthis._len += items.length;\n\t\tconst start = this.headNode._prev;\n\t\treturn insertAfter(start, items);\n\t}\n\n\t/**\n\t * Remove and return the first element\n\t */\n\tshift(): ListNode<T> | undefined {\n\t\treturn this.remove(this.first);\n\t}\n\n\t/**\n\t * Insert `items` at start of list\n\t */\n\tunshift(...items: T[]): ListNodeRange<T> {\n\t\tthis._len += items.length;\n\t\treturn insertAfter(this.headNode, items);\n\t}\n\n\t/**\n\t * Remove nodes starting at `start` until either the `end` node is reached\n\t * or until `count` nodes have been removed. Returns the removed nodes as\n\t * a separate linked list\n\t */\n\tsplice(start: ListNode<T>, countOrEnd?: ListNode<T> | number): DoublyLinkedList<T> {\n\t\tconst newList = new DoublyLinkedList<T>();\n\t\twalkList(\n\t\t\tthis,\n\t\t\t(node) => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tconst removedNode = this._remove(node)!;\n\t\t\t\t// whats special here is we preserve the node\n\t\t\t\t// this allow looking up the old node in the new list\n\t\t\t\t// when something preserves a reference\n\t\t\t\tremovedNode.headNode = newList.headNode;\n\t\t\t\tremovedNode._next = newList.headNode;\n\t\t\t\tremovedNode._prev = newList.headNode._prev;\n\t\t\t\tnewList.headNode._prev._next = removedNode;\n\t\t\t\tnewList.headNode._prev = removedNode;\n\t\t\t\tnewList._len++;\n\t\t\t\tif (node === countOrEnd || newList.length === countOrEnd) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tstart,\n\t\t);\n\t\treturn newList;\n\t}\n\n\tpublic includes(node: ListNode<T> | undefined): node is ListNode<T> {\n\t\treturn this._includes(node);\n\t}\n\n\tprivate _includes(node: ListNode<T> | undefined): node is DataNode<T> {\n\t\treturn node instanceof DataNode && node.headNode === this.headNode;\n\t}\n\n\tprivate _remove(node: ListNode<T> | undefined): DataNode<T> | undefined {\n\t\tif (this._includes(node)) {\n\t\t\tnode._prev._next = node._next;\n\t\t\tnode._next._prev = node._prev;\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\tnode.headNode = node._next = node._prev = DeadHead;\n\t\t\tthis._len--;\n\t\t\treturn node;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic remove(node: ListNode<T> | undefined): ListNode<T> | undefined {\n\t\treturn this._remove(node);\n\t}\n\n\tpublic [Symbol.iterator](): IterableIterator<ListNode<T>> {\n\t\tlet value = this.first;\n\t\tconst iterator: IterableIterator<ListNode<T>> = {\n\t\t\tnext(): IteratorResult<ListNode<T>> {\n\t\t\t\tif (value !== undefined) {\n\t\t\t\t\tconst rtn = { value, done: false };\n\t\t\t\t\tvalue = value.next;\n\t\t\t\t\treturn rtn;\n\t\t\t\t}\n\t\t\t\treturn { value: undefined, done: true };\n\t\t\t},\n\t\t\t[Symbol.iterator]() {\n\t\t\t\treturn this;\n\t\t\t},\n\t\t};\n\t\treturn iterator;\n\t}\n\n\tprivate _len: number = 0;\n\tprivate readonly headNode: HeadNode<T> | DataNode<T> = new HeadNode(this);\n\tpublic get length(): number {\n\t\treturn this._len;\n\t}\n\tpublic get empty(): boolean {\n\t\treturn this._len === 0;\n\t}\n\tpublic get first(): ListNode<T> | undefined {\n\t\treturn this.headNode.next;\n\t}\n\n\tpublic get last(): ListNode<T> | undefined {\n\t\treturn this.headNode.prev;\n\t}\n}\n\nexport function walkList<T>(\n\tlist: DoublyLinkedList<T>,\n\tvisitor: (node: ListNode<T>) => boolean | void,\n\tstart?: ListNode<T>,\n\tforward: boolean = true,\n): boolean {\n\tlet current: ListNode<T> | undefined;\n\tif (start) {\n\t\tif (!list.includes(start)) {\n\t\t\tthrow new UsageError(\"start must be in the provided list\");\n\t\t}\n\t\tcurrent = start;\n\t} else {\n\t\tcurrent = forward ? list.first : list.last;\n\t}\n\t// cache the next node, incase the visitor mutates the list\n\t// need this to support splice\n\tlet next = forward ? current?.next : current?.prev;\n\twhile (current !== undefined) {\n\t\tif (visitor(current) === false) {\n\t\t\treturn false;\n\t\t}\n\t\tcurrent = next;\n\t\tnext = forward ? next?.next : next?.prev;\n\t}\n\treturn true;\n}\n"]}
|
|
@@ -123,12 +123,12 @@ export declare class RedBlackTree<TKey, TData> implements SortedDictionary<TKey,
|
|
|
123
123
|
removeExisting(key: TKey): void;
|
|
124
124
|
private nodeRemove;
|
|
125
125
|
/**
|
|
126
|
-
*
|
|
126
|
+
* Finds the largest node that is less than or equal to a given key.
|
|
127
127
|
*/
|
|
128
128
|
floor(key: TKey): RBNode<TKey, TData> | undefined;
|
|
129
129
|
private nodeFloor;
|
|
130
130
|
/**
|
|
131
|
-
*
|
|
131
|
+
* Finds the smallest node that is greater than or equal to a given key.
|
|
132
132
|
*/
|
|
133
133
|
ceil(key: TKey): RBNode<TKey, TData> | undefined;
|
|
134
134
|
private nodeCeil;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rbTree.d.ts","sourceRoot":"","sources":["../../src/collections/rbTree.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"rbTree.d.ts","sourceRoot":"","sources":["../../src/collections/rbTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -124,10 +124,7 @@ export class RedBlackTree {
|
|
|
124
124
|
}
|
|
125
125
|
nodePut(node, key, data, conflict) {
|
|
126
126
|
let _node = node;
|
|
127
|
-
if (
|
|
128
|
-
return this.makeNode(key, data, RBColor.RED, 1);
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
127
|
+
if (_node) {
|
|
131
128
|
const cmp = this.compareKeys(key, _node.key);
|
|
132
129
|
if (cmp < 0) {
|
|
133
130
|
_node.left = this.nodePut(_node.left, key, data, conflict);
|
|
@@ -141,7 +138,7 @@ export class RedBlackTree {
|
|
|
141
138
|
if (kd.key) {
|
|
142
139
|
_node.key = kd.key;
|
|
143
140
|
}
|
|
144
|
-
_node.data = kd.data
|
|
141
|
+
_node.data = kd.data ?? data;
|
|
145
142
|
}
|
|
146
143
|
else {
|
|
147
144
|
_node.data = data;
|
|
@@ -163,6 +160,9 @@ export class RedBlackTree {
|
|
|
163
160
|
}
|
|
164
161
|
return _node;
|
|
165
162
|
}
|
|
163
|
+
else {
|
|
164
|
+
return this.makeNode(key, data, RBColor.RED, 1);
|
|
165
|
+
}
|
|
166
166
|
}
|
|
167
167
|
updateLocal(node) {
|
|
168
168
|
if (this.aug) {
|
|
@@ -243,7 +243,7 @@ export class RedBlackTree {
|
|
|
243
243
|
return this.balance(_node);
|
|
244
244
|
}
|
|
245
245
|
/**
|
|
246
|
-
*
|
|
246
|
+
* Finds the largest node that is less than or equal to a given key.
|
|
247
247
|
*/
|
|
248
248
|
floor(key) {
|
|
249
249
|
if (!this.isEmpty()) {
|
|
@@ -261,12 +261,12 @@ export class RedBlackTree {
|
|
|
261
261
|
}
|
|
262
262
|
else {
|
|
263
263
|
const rightFloor = this.nodeFloor(node.right, key);
|
|
264
|
-
return rightFloor
|
|
264
|
+
return rightFloor ?? node;
|
|
265
265
|
}
|
|
266
266
|
}
|
|
267
267
|
}
|
|
268
268
|
/**
|
|
269
|
-
*
|
|
269
|
+
* Finds the smallest node that is greater than or equal to a given key.
|
|
270
270
|
*/
|
|
271
271
|
ceil(key) {
|
|
272
272
|
if (!this.isEmpty()) {
|
|
@@ -284,7 +284,7 @@ export class RedBlackTree {
|
|
|
284
284
|
}
|
|
285
285
|
else {
|
|
286
286
|
const leftCeil = this.nodeCeil(node.left, key);
|
|
287
|
-
return leftCeil
|
|
287
|
+
return leftCeil ?? node;
|
|
288
288
|
}
|
|
289
289
|
}
|
|
290
290
|
}
|
|
@@ -294,7 +294,7 @@ export class RedBlackTree {
|
|
|
294
294
|
}
|
|
295
295
|
}
|
|
296
296
|
nodeMin(node) {
|
|
297
|
-
return
|
|
297
|
+
return node.left ? this.nodeMin(node.left) : node;
|
|
298
298
|
}
|
|
299
299
|
max() {
|
|
300
300
|
if (this.root) {
|
|
@@ -302,7 +302,7 @@ export class RedBlackTree {
|
|
|
302
302
|
}
|
|
303
303
|
}
|
|
304
304
|
nodeMax(node) {
|
|
305
|
-
return
|
|
305
|
+
return node.right ? this.nodeMax(node.right) : node;
|
|
306
306
|
}
|
|
307
307
|
rotateRight(node) {
|
|
308
308
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
@@ -417,26 +417,20 @@ export class RedBlackTree {
|
|
|
417
417
|
nodeWalk(node, actions) {
|
|
418
418
|
let go = true;
|
|
419
419
|
if (node) {
|
|
420
|
-
if (actions.pre) {
|
|
421
|
-
|
|
422
|
-
go = actions.pre(node);
|
|
423
|
-
}
|
|
420
|
+
if (actions.pre && (!!actions.showStructure || node.color === RBColor.BLACK)) {
|
|
421
|
+
go = actions.pre(node);
|
|
424
422
|
}
|
|
425
423
|
if (node.left) {
|
|
426
424
|
go = this.nodeWalk(node.left, actions);
|
|
427
425
|
}
|
|
428
|
-
if (go && actions.infix) {
|
|
429
|
-
|
|
430
|
-
go = actions.infix(node);
|
|
431
|
-
}
|
|
426
|
+
if (go && actions.infix && (!!actions.showStructure || node.color === RBColor.BLACK)) {
|
|
427
|
+
go = actions.infix(node);
|
|
432
428
|
}
|
|
433
429
|
if (go) {
|
|
434
430
|
go = this.nodeWalk(node.right, actions);
|
|
435
431
|
}
|
|
436
|
-
if (go && actions.post) {
|
|
437
|
-
|
|
438
|
-
go = actions.post(node);
|
|
439
|
-
}
|
|
432
|
+
if (go && actions.post && (!!actions.showStructure || node.color === RBColor.BLACK)) {
|
|
433
|
+
go = actions.post(node);
|
|
440
434
|
}
|
|
441
435
|
}
|
|
442
436
|
return go;
|
|
@@ -444,26 +438,20 @@ export class RedBlackTree {
|
|
|
444
438
|
nodeWalkBackward(node, actions) {
|
|
445
439
|
let go = true;
|
|
446
440
|
if (node) {
|
|
447
|
-
if (actions.pre) {
|
|
448
|
-
|
|
449
|
-
go = actions.pre(node);
|
|
450
|
-
}
|
|
441
|
+
if (actions.pre && (!!actions.showStructure || node.color === RBColor.BLACK)) {
|
|
442
|
+
go = actions.pre(node);
|
|
451
443
|
}
|
|
452
444
|
if (node.right) {
|
|
453
445
|
go = this.nodeWalkBackward(node.right, actions);
|
|
454
446
|
}
|
|
455
|
-
if (go && actions.infix) {
|
|
456
|
-
|
|
457
|
-
go = actions.infix(node);
|
|
458
|
-
}
|
|
447
|
+
if (go && actions.infix && (!!actions.showStructure || node.color === RBColor.BLACK)) {
|
|
448
|
+
go = actions.infix(node);
|
|
459
449
|
}
|
|
460
450
|
if (go) {
|
|
461
451
|
go = this.nodeWalkBackward(node.left, actions);
|
|
462
452
|
}
|
|
463
|
-
if (go && actions.post) {
|
|
464
|
-
|
|
465
|
-
go = actions.post(node);
|
|
466
|
-
}
|
|
453
|
+
if (go && actions.post && (!!actions.showStructure || node.color === RBColor.BLACK)) {
|
|
454
|
+
go = actions.post(node);
|
|
467
455
|
}
|
|
468
456
|
}
|
|
469
457
|
return go;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rbTree.js","sourceRoot":"","sources":["../../src/collections/rbTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * @internal\n */\nexport const RBColor = {\n\tRED: 0,\n\tBLACK: 1,\n} as const;\n\n/**\n * @internal\n */\nexport type RBColor = (typeof RBColor)[keyof typeof RBColor];\n\n/**\n * @internal\n */\nexport interface RBNode<TKey, TData> {\n\tkey: TKey;\n\tdata: TData;\n\tleft: RBNode<TKey, TData> | undefined;\n\tright: RBNode<TKey, TData> | undefined;\n\tcolor: RBColor;\n\tsize: number;\n}\n/**\n * @internal\n */\nexport interface IRBAugmentation<TKey, TData> {\n\tupdate(node: RBNode<TKey, TData>): void;\n}\n/**\n * @internal\n */\nexport interface IRBMatcher<TKey, TData> {\n\tcontinueSubtree(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;\n\tmatchNode(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;\n}\n\n/**\n * @internal\n */\nexport interface RBNodeActions<TKey, TData> {\n\tinfix?(node: RBNode<TKey, TData>): boolean;\n\tpre?(node: RBNode<TKey, TData>): boolean;\n\tpost?(node: RBNode<TKey, TData>): boolean;\n\tshowStructure?: boolean;\n}\n\n/**\n * @internal\n */\nexport interface KeyComparer<TKey> {\n\t// eslint-disable-next-line @typescript-eslint/prefer-function-type\n\t(a: TKey, b: TKey): number;\n}\n\n/**\n * @internal\n */\nexport interface Property<TKey, TData> {\n\tkey: TKey;\n\tdata: TData;\n}\n\n/**\n * @internal\n */\nexport interface PropertyAction<TKey, TData> {\n\t// eslint-disable-next-line @typescript-eslint/prefer-function-type\n\t<TAccum>(p: Property<TKey, TData>, accum?: TAccum): boolean;\n}\n\n/**\n * @internal\n */\nexport interface QProperty<TKey, TData> {\n\tkey?: TKey;\n\tdata?: TData;\n}\n\n/**\n * @internal\n */\nexport type ConflictAction<TKey, TData> = (\n\tkey: TKey,\n\tcurrentKey: TKey,\n\tdata: TData,\n\tcurrentData: TData,\n) => QProperty<TKey, TData>;\n\n/**\n * @internal\n */\nexport interface SortedDictionary<TKey, TData> extends Dictionary<TKey, TData> {\n\tmax(): Property<TKey, TData> | undefined;\n\tmin(): Property<TKey, TData> | undefined;\n\tmapRange<TAccum>(\n\t\taction: PropertyAction<TKey, TData>,\n\t\taccum?: TAccum,\n\t\tstart?: TKey,\n\t\tend?: TKey,\n\t): void;\n}\n\n/**\n * @internal\n */\nexport interface Dictionary<TKey, TData> {\n\tget(key: TKey): Property<TKey, TData> | undefined;\n\tput(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>): void;\n\tremove(key: TKey): void;\n\tmap<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum): void;\n}\n\n/**\n * @internal\n */\nexport class RedBlackTree<TKey, TData> implements SortedDictionary<TKey, TData> {\n\tprivate root: RBNode<TKey, TData> | undefined;\n\n\tconstructor(\n\t\tprivate readonly compareKeys: KeyComparer<TKey>,\n\t\tprivate readonly aug?: IRBAugmentation<TKey, TData>,\n\t) {}\n\n\tprivate makeNode(key: TKey, data: TData, color: RBColor, size: number): RBNode<TKey, TData> {\n\t\treturn { key, data, color, size } as any as RBNode<TKey, TData>;\n\t}\n\n\tprivate isRed(node: RBNode<TKey, TData> | undefined) {\n\t\treturn !!node && node.color === RBColor.RED;\n\t}\n\n\tprivate nodeSize(node: RBNode<TKey, TData> | undefined) {\n\t\treturn node ? node.size : 0;\n\t}\n\tpublic size() {\n\t\treturn this.nodeSize(this.root);\n\t}\n\tpublic isEmpty() {\n\t\treturn !this.root;\n\t}\n\tpublic get(key: TKey) {\n\t\tif (key !== undefined) {\n\t\t\treturn this.nodeGet(this.root, key);\n\t\t}\n\t}\n\tprivate nodeGet(node: RBNode<TKey, TData> | undefined, key: TKey) {\n\t\tlet _node = node;\n\t\twhile (_node) {\n\t\t\tconst cmp = this.compareKeys(key, _node.key);\n\t\t\tif (cmp < 0) {\n\t\t\t\t_node = _node.left;\n\t\t\t} else if (cmp > 0) {\n\t\t\t\t_node = _node.right;\n\t\t\t} else {\n\t\t\t\treturn _node;\n\t\t\t}\n\t\t}\n\t}\n\tprivate contains(key: TKey) {\n\t\treturn this.get(key);\n\t}\n\n\tpublic gather(key: TKey, matcher: IRBMatcher<TKey, TData>) {\n\t\tconst results = [] as RBNode<TKey, TData>[];\n\t\tif (key !== undefined) {\n\t\t\tthis.nodeGather(this.root, results, key, matcher);\n\t\t}\n\t\treturn results;\n\t}\n\n\tprivate nodeGather(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tresults: RBNode<TKey, TData>[],\n\t\tkey: TKey,\n\t\tmatcher: IRBMatcher<TKey, TData>,\n\t) {\n\t\tif (node) {\n\t\t\tif (matcher.continueSubtree(node.left, key)) {\n\t\t\t\tthis.nodeGather(node.left, results, key, matcher);\n\t\t\t}\n\t\t\tif (matcher.matchNode(node, key)) {\n\t\t\t\tresults.push(node);\n\t\t\t}\n\t\t\tif (matcher.continueSubtree(node.right, key)) {\n\t\t\t\tthis.nodeGather(node.right, results, key, matcher);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic walkExactMatchesForward(\n\t\tcompareFn: (node: RBNode<TKey, TData>) => number,\n\t\tactionFn: (node: RBNode<TKey, TData>) => void,\n\t\tcontinueLeftFn: (number: number) => boolean,\n\t\tcontinueRightFn: (number: number) => boolean,\n\t) {\n\t\tthis.nodeWalkExactMatchesForward(\n\t\t\tthis.root,\n\t\t\tcompareFn,\n\t\t\tactionFn,\n\t\t\tcontinueLeftFn,\n\t\t\tcontinueRightFn,\n\t\t);\n\t}\n\n\tprivate nodeWalkExactMatchesForward(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tcompareFn: (node: RBNode<TKey, TData>) => number,\n\t\tactionFn: (node: RBNode<TKey, TData>) => void,\n\t\tcontinueLeftFn: (number: number) => boolean,\n\t\tcontinueRightFn: (number: number) => boolean,\n\t) {\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tconst result: number = compareFn(node);\n\t\tif (continueLeftFn(result)) {\n\t\t\tthis.nodeWalkExactMatchesForward(\n\t\t\t\tnode.left,\n\t\t\t\tcompareFn,\n\t\t\t\tactionFn,\n\t\t\t\tcontinueLeftFn,\n\t\t\t\tcontinueRightFn,\n\t\t\t);\n\t\t}\n\t\tif (result === 0) {\n\t\t\tactionFn(node);\n\t\t}\n\t\tif (continueRightFn(result)) {\n\t\t\tthis.nodeWalkExactMatchesForward(\n\t\t\t\tnode.right,\n\t\t\t\tcompareFn,\n\t\t\t\tactionFn,\n\t\t\t\tcontinueLeftFn,\n\t\t\t\tcontinueRightFn,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic walkExactMatchesBackward(\n\t\tcompareFn: (node: RBNode<TKey, TData>) => number,\n\t\tactionFn: (node: RBNode<TKey, TData>) => void,\n\t\tcontinueLeftFn: (number: number) => boolean,\n\t\tcontinueRightFn: (number: number) => boolean,\n\t) {\n\t\tthis.nodeWalkExactMatchesBackward(\n\t\t\tthis.root,\n\t\t\tcompareFn,\n\t\t\tactionFn,\n\t\t\tcontinueLeftFn,\n\t\t\tcontinueRightFn,\n\t\t);\n\t}\n\n\tprivate nodeWalkExactMatchesBackward(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tcompareFn: (node: RBNode<TKey, TData>) => number,\n\t\tactionFn: (node: RBNode<TKey, TData>) => void,\n\t\tcontinueLeftFn: (cmp: number) => boolean,\n\t\tcontinueRightFn: (cmp: number) => boolean,\n\t) {\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tconst result: number = compareFn(node);\n\t\tif (continueRightFn(result)) {\n\t\t\tthis.nodeWalkExactMatchesBackward(\n\t\t\t\tnode.right,\n\t\t\t\tcompareFn,\n\t\t\t\tactionFn,\n\t\t\t\tcontinueLeftFn,\n\t\t\t\tcontinueRightFn,\n\t\t\t);\n\t\t}\n\t\tif (result === 0) {\n\t\t\tactionFn(node);\n\t\t}\n\t\tif (continueLeftFn(result)) {\n\t\t\tthis.nodeWalkExactMatchesBackward(\n\t\t\t\tnode.left,\n\t\t\t\tcompareFn,\n\t\t\t\tactionFn,\n\t\t\t\tcontinueLeftFn,\n\t\t\t\tcontinueRightFn,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic put(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>) {\n\t\tif (key !== undefined) {\n\t\t\tif (data === undefined) {\n\t\t\t\tthis.remove(key);\n\t\t\t} else {\n\t\t\t\tthis.root = this.nodePut(this.root, key, data, conflict);\n\t\t\t\tthis.root.color = RBColor.BLACK;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate nodePut(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tkey: TKey,\n\t\tdata: TData,\n\t\tconflict?: ConflictAction<TKey, TData>,\n\t) {\n\t\tlet _node = node;\n\t\tif (!_node) {\n\t\t\treturn this.makeNode(key, data, RBColor.RED, 1);\n\t\t} else {\n\t\t\tconst cmp = this.compareKeys(key, _node.key);\n\t\t\tif (cmp < 0) {\n\t\t\t\t_node.left = this.nodePut(_node.left, key, data, conflict);\n\t\t\t} else if (cmp > 0) {\n\t\t\t\t_node.right = this.nodePut(_node.right, key, data, conflict);\n\t\t\t} else {\n\t\t\t\tif (conflict) {\n\t\t\t\t\tconst kd = conflict(key, _node.key, data, _node.data);\n\t\t\t\t\tif (kd.key) {\n\t\t\t\t\t\t_node.key = kd.key;\n\t\t\t\t\t}\n\t\t\t\t\t_node.data = kd.data ? kd.data : data;\n\t\t\t\t} else {\n\t\t\t\t\t_node.data = data;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.isRed(_node.right) && !this.isRed(_node.left)) {\n\t\t\t\t_node = this.rotateLeft(_node);\n\t\t\t}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tif (this.isRed(_node.left) && this.isRed(_node.left!.left)) {\n\t\t\t\t_node = this.rotateRight(_node);\n\t\t\t}\n\t\t\tif (this.isRed(_node.left) && this.isRed(_node.right)) {\n\t\t\t\tthis.flipColors(_node);\n\t\t\t}\n\t\t\t_node.size = this.nodeSize(_node.left) + this.nodeSize(_node.right) + 1;\n\t\t\tif (this.aug) {\n\t\t\t\tthis.updateLocal(_node);\n\t\t\t}\n\t\t\treturn _node;\n\t\t}\n\t}\n\n\tprivate updateLocal(node: RBNode<TKey, TData>) {\n\t\tif (this.aug) {\n\t\t\tif (this.isRed(node.left)) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tthis.aug.update(node.left!);\n\t\t\t}\n\t\t\tif (this.isRed(node.right)) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tthis.aug.update(node.right!);\n\t\t\t}\n\t\t\tthis.aug.update(node);\n\t\t}\n\t}\n\n\tprivate nodeRemoveMin(node: RBNode<TKey, TData>) {\n\t\tlet _node = node;\n\t\tif (_node.left) {\n\t\t\tif (!this.isRed(_node.left) && !this.isRed(_node.left.left)) {\n\t\t\t\t_node = this.moveRedLeft(_node);\n\t\t\t}\n\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t_node.left = this.nodeRemoveMin(_node.left!);\n\t\t\treturn this.balance(_node);\n\t\t}\n\t}\n\n\tpublic remove(key: TKey) {\n\t\tif (key !== undefined) {\n\t\t\tif (!this.contains(key)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.removeExisting(key);\n\t\t}\n\t\t// TODO: error on undefined key\n\t}\n\n\tpublic removeExisting(key: TKey) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tif (!this.isRed(this.root!.left) && !this.isRed(this.root!.right)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tthis.root!.color = RBColor.RED;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tthis.root = this.nodeRemove(this.root!, key);\n\t}\n\n\tprivate nodeRemove(node: RBNode<TKey, TData>, key: TKey) {\n\t\tlet _node = node;\n\t\tif (this.compareKeys(key, _node.key) < 0) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tif (!this.isRed(_node.left) && !this.isRed(_node.left!.left)) {\n\t\t\t\t_node = this.moveRedLeft(_node);\n\t\t\t}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t_node.left = this.nodeRemove(_node.left!, key);\n\t\t} else {\n\t\t\tif (this.isRed(_node.left)) {\n\t\t\t\t_node = this.rotateRight(_node);\n\t\t\t}\n\t\t\tif (this.compareKeys(key, _node.key) === 0 && !_node.right) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tif (!this.isRed(_node.right) && !this.isRed(_node.right!.left)) {\n\t\t\t\t_node = this.moveRedRight(_node);\n\t\t\t}\n\t\t\tif (this.compareKeys(key, _node.key) === 0) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tconst subtreeMin = this.nodeMin(_node.right!);\n\t\t\t\t_node.key = subtreeMin.key;\n\t\t\t\t_node.data = subtreeMin.data;\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t_node.right = this.nodeRemoveMin(_node.right!);\n\t\t\t} else {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t_node.right = this.nodeRemove(_node.right!, key);\n\t\t\t}\n\t\t}\n\t\treturn this.balance(_node);\n\t}\n\n\t/**\n\t * @returns The largest node in this tree which compares less than or equal to `key`\n\t */\n\tpublic floor(key: TKey) {\n\t\tif (!this.isEmpty()) {\n\t\t\treturn this.nodeFloor(this.root, key);\n\t\t}\n\t}\n\n\tprivate nodeFloor(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tkey: TKey,\n\t): RBNode<TKey, TData> | undefined {\n\t\tif (node) {\n\t\t\tconst cmp = this.compareKeys(key, node.key);\n\t\t\tif (cmp === 0) {\n\t\t\t\treturn node;\n\t\t\t} else if (cmp < 0) {\n\t\t\t\treturn this.nodeFloor(node.left, key);\n\t\t\t} else {\n\t\t\t\tconst rightFloor = this.nodeFloor(node.right, key);\n\t\t\t\treturn rightFloor ? rightFloor : node;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @returns The smallest node in this tree which compares greater than or equal to `key`\n\t */\n\tpublic ceil(key: TKey) {\n\t\tif (!this.isEmpty()) {\n\t\t\treturn this.nodeCeil(this.root, key);\n\t\t}\n\t}\n\n\tprivate nodeCeil(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tkey: TKey,\n\t): RBNode<TKey, TData> | undefined {\n\t\tif (node) {\n\t\t\tconst cmp = this.compareKeys(key, node.key);\n\t\t\tif (cmp === 0) {\n\t\t\t\treturn node;\n\t\t\t} else if (cmp > 0) {\n\t\t\t\treturn this.nodeCeil(node.right, key);\n\t\t\t} else {\n\t\t\t\tconst leftCeil = this.nodeCeil(node.left, key);\n\t\t\t\treturn leftCeil ? leftCeil : node;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic min() {\n\t\tif (this.root) {\n\t\t\treturn this.nodeMin(this.root);\n\t\t}\n\t}\n\n\tprivate nodeMin(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n\t\treturn !node.left ? node : this.nodeMin(node.left);\n\t}\n\n\tpublic max() {\n\t\tif (this.root) {\n\t\t\treturn this.nodeMax(this.root);\n\t\t}\n\t}\n\n\tprivate nodeMax(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n\t\treturn !node.right ? node : this.nodeMax(node.right);\n\t}\n\n\tprivate rotateRight(node: RBNode<TKey, TData>) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst leftChild = node.left!;\n\t\tnode.left = leftChild.right;\n\t\tleftChild.right = node;\n\t\tleftChild.color = leftChild.right.color;\n\t\tleftChild.right.color = RBColor.RED;\n\t\tleftChild.size = node.size;\n\t\tnode.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n\t\tif (this.aug) {\n\t\t\tthis.updateLocal(node);\n\t\t\tthis.updateLocal(leftChild);\n\t\t}\n\t\treturn leftChild;\n\t}\n\n\tprivate rotateLeft(node: RBNode<TKey, TData>) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst rightChild = node.right!;\n\t\tnode.right = rightChild.left;\n\t\trightChild.left = node;\n\t\trightChild.color = rightChild.left.color;\n\t\trightChild.left.color = RBColor.RED;\n\t\trightChild.size = node.size;\n\t\tnode.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n\t\tif (this.aug) {\n\t\t\tthis.updateLocal(node);\n\t\t\tthis.updateLocal(rightChild);\n\t\t}\n\t\treturn rightChild;\n\t}\n\n\tprivate oppositeColor(c: RBColor) {\n\t\treturn c === RBColor.BLACK ? RBColor.RED : RBColor.BLACK;\n\t}\n\n\tprivate flipColors(node: RBNode<TKey, TData>) {\n\t\tnode.color = this.oppositeColor(node.color);\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tnode.left!.color = this.oppositeColor(node.left!.color);\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tnode.right!.color = this.oppositeColor(node.right!.color);\n\t}\n\n\tprivate moveRedLeft(node: RBNode<TKey, TData>) {\n\t\tlet _node = node;\n\t\tthis.flipColors(_node);\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tif (this.isRed(_node.right!.left)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t_node.right = this.rotateRight(_node.right!);\n\t\t\t_node = this.rotateLeft(_node);\n\t\t\tthis.flipColors(_node);\n\t\t}\n\t\treturn _node;\n\t}\n\n\tprivate moveRedRight(node: RBNode<TKey, TData>) {\n\t\tlet _node = node;\n\t\tthis.flipColors(_node);\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tif (this.isRed(_node.left!.left)) {\n\t\t\t_node = this.rotateRight(_node);\n\t\t\tthis.flipColors(_node);\n\t\t}\n\t\treturn _node;\n\t}\n\n\tprivate balance(input: RBNode<TKey, TData>) {\n\t\tlet node: RBNode<TKey, TData> | undefined = input;\n\t\tif (this.isRed(node.right)) {\n\t\t\tnode = this.rotateLeft(node);\n\t\t}\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tif (this.isRed(node.left) && this.isRed(node.left!.left)) {\n\t\t\tnode = this.rotateRight(node);\n\t\t}\n\t\tif (this.isRed(node.left) && this.isRed(node.right)) {\n\t\t\tthis.flipColors(node);\n\t\t}\n\t\tnode.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n\t\tif (this.aug) {\n\t\t\tthis.aug.update(node);\n\t\t}\n\t\treturn node;\n\t}\n\n\tpublic mapRange<TAccum>(\n\t\taction: PropertyAction<TKey, TData>,\n\t\taccum?: TAccum,\n\t\tstart?: TKey,\n\t\tend?: TKey,\n\t) {\n\t\tthis.nodeMap(this.root, action, accum, start, end);\n\t}\n\n\tpublic map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum) {\n\t\t// TODO: optimize to avoid comparisons\n\t\tthis.nodeMap(this.root, action, accum);\n\t}\n\n\tpublic keys() {\n\t\tconst keyList: TKey[] = [];\n\t\tconst actions: RBNodeActions<TKey, TData> = {\n\t\t\tshowStructure: true,\n\t\t\tinfix: (node) => {\n\t\t\t\tkeyList.push(node.key);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t};\n\t\tthis.walk(actions);\n\t\treturn keyList;\n\t}\n\n\t/**\n\t * Depth-first traversal with custom action; if action returns\n\t * false, traversal is halted.\n\t * @param action - action to apply to each node\n\t */\n\tpublic walk(actions: RBNodeActions<TKey, TData>) {\n\t\tthis.nodeWalk(this.root, actions);\n\t}\n\n\tpublic walkBackward(actions: RBNodeActions<TKey, TData>) {\n\t\tthis.nodeWalkBackward(this.root, actions);\n\t}\n\n\tprivate nodeWalk(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tactions: RBNodeActions<TKey, TData>,\n\t): boolean {\n\t\tlet go = true;\n\t\tif (node) {\n\t\t\tif (actions.pre) {\n\t\t\t\tif (!!actions.showStructure || node.color === RBColor.BLACK) {\n\t\t\t\t\tgo = actions.pre(node);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (node.left) {\n\t\t\t\tgo = this.nodeWalk(node.left, actions);\n\t\t\t}\n\t\t\tif (go && actions.infix) {\n\t\t\t\tif (!!actions.showStructure || node.color === RBColor.BLACK) {\n\t\t\t\t\tgo = actions.infix(node);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (go) {\n\t\t\t\tgo = this.nodeWalk(node.right, actions);\n\t\t\t}\n\t\t\tif (go && actions.post) {\n\t\t\t\tif (!!actions.showStructure || node.color === RBColor.BLACK) {\n\t\t\t\t\tgo = actions.post(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn go;\n\t}\n\n\tprivate nodeWalkBackward(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tactions: RBNodeActions<TKey, TData>,\n\t): boolean {\n\t\tlet go = true;\n\t\tif (node) {\n\t\t\tif (actions.pre) {\n\t\t\t\tif (!!actions.showStructure || node.color === RBColor.BLACK) {\n\t\t\t\t\tgo = actions.pre(node);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (node.right) {\n\t\t\t\tgo = this.nodeWalkBackward(node.right, actions);\n\t\t\t}\n\t\t\tif (go && actions.infix) {\n\t\t\t\tif (!!actions.showStructure || node.color === RBColor.BLACK) {\n\t\t\t\t\tgo = actions.infix(node);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (go) {\n\t\t\t\tgo = this.nodeWalkBackward(node.left, actions);\n\t\t\t}\n\t\t\tif (go && actions.post) {\n\t\t\t\tif (!!actions.showStructure || node.color === RBColor.BLACK) {\n\t\t\t\t\tgo = actions.post(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn go;\n\t}\n\n\tprivate nodeMap<TAccum>(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\taction: PropertyAction<TKey, TData>,\n\t\taccum?: TAccum,\n\t\tstart?: TKey,\n\t\tend?: TKey,\n\t): boolean {\n\t\tlet _start = start;\n\t\tlet _end = end;\n\t\tif (!node) {\n\t\t\treturn true;\n\t\t}\n\t\tif (_start === undefined) {\n\t\t\t_start = this.nodeMin(node).key;\n\t\t}\n\t\tif (_end === undefined) {\n\t\t\t_end = this.nodeMax(node).key;\n\t\t}\n\t\tconst cmpStart = this.compareKeys(_start, node.key);\n\t\tconst cmpEnd = this.compareKeys(_end, node.key);\n\t\tlet go = true;\n\t\tif (cmpStart < 0) {\n\t\t\tgo = this.nodeMap(node.left, action, accum, _start, _end);\n\t\t}\n\t\tif (go && cmpStart <= 0 && cmpEnd >= 0) {\n\t\t\t// REVIEW: test for black node here\n\t\t\tgo = action(node, accum);\n\t\t}\n\t\tif (go && cmpEnd > 0) {\n\t\t\tgo = this.nodeMap(node.right, action, accum, _start, _end);\n\t\t}\n\t\treturn go;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rbTree.js","sourceRoot":"","sources":["../../src/collections/rbTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * @internal\n */\nexport const RBColor = {\n\tRED: 0,\n\tBLACK: 1,\n} as const;\n\n/**\n * @internal\n */\nexport type RBColor = (typeof RBColor)[keyof typeof RBColor];\n\n/**\n * @internal\n */\nexport interface RBNode<TKey, TData> {\n\tkey: TKey;\n\tdata: TData;\n\tleft: RBNode<TKey, TData> | undefined;\n\tright: RBNode<TKey, TData> | undefined;\n\tcolor: RBColor;\n\tsize: number;\n}\n/**\n * @internal\n */\nexport interface IRBAugmentation<TKey, TData> {\n\tupdate(node: RBNode<TKey, TData>): void;\n}\n/**\n * @internal\n */\nexport interface IRBMatcher<TKey, TData> {\n\tcontinueSubtree(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;\n\tmatchNode(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;\n}\n\n/**\n * @internal\n */\nexport interface RBNodeActions<TKey, TData> {\n\tinfix?(node: RBNode<TKey, TData>): boolean;\n\tpre?(node: RBNode<TKey, TData>): boolean;\n\tpost?(node: RBNode<TKey, TData>): boolean;\n\tshowStructure?: boolean;\n}\n\n/**\n * @internal\n */\nexport interface KeyComparer<TKey> {\n\t// eslint-disable-next-line @typescript-eslint/prefer-function-type\n\t(a: TKey, b: TKey): number;\n}\n\n/**\n * @internal\n */\nexport interface Property<TKey, TData> {\n\tkey: TKey;\n\tdata: TData;\n}\n\n/**\n * @internal\n */\nexport interface PropertyAction<TKey, TData> {\n\t// eslint-disable-next-line @typescript-eslint/prefer-function-type\n\t<TAccum>(p: Property<TKey, TData>, accum?: TAccum): boolean;\n}\n\n/**\n * @internal\n */\nexport interface QProperty<TKey, TData> {\n\tkey?: TKey;\n\tdata?: TData;\n}\n\n/**\n * @internal\n */\nexport type ConflictAction<TKey, TData> = (\n\tkey: TKey,\n\tcurrentKey: TKey,\n\tdata: TData,\n\tcurrentData: TData,\n) => QProperty<TKey, TData>;\n\n/**\n * @internal\n */\nexport interface SortedDictionary<TKey, TData> extends Dictionary<TKey, TData> {\n\tmax(): Property<TKey, TData> | undefined;\n\tmin(): Property<TKey, TData> | undefined;\n\tmapRange<TAccum>(\n\t\taction: PropertyAction<TKey, TData>,\n\t\taccum?: TAccum,\n\t\tstart?: TKey,\n\t\tend?: TKey,\n\t): void;\n}\n\n/**\n * @internal\n */\nexport interface Dictionary<TKey, TData> {\n\tget(key: TKey): Property<TKey, TData> | undefined;\n\tput(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>): void;\n\tremove(key: TKey): void;\n\tmap<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum): void;\n}\n\n/**\n * @internal\n */\nexport class RedBlackTree<TKey, TData> implements SortedDictionary<TKey, TData> {\n\tprivate root: RBNode<TKey, TData> | undefined;\n\n\tconstructor(\n\t\tprivate readonly compareKeys: KeyComparer<TKey>,\n\t\tprivate readonly aug?: IRBAugmentation<TKey, TData>,\n\t) {}\n\n\tprivate makeNode(key: TKey, data: TData, color: RBColor, size: number): RBNode<TKey, TData> {\n\t\treturn { key, data, color, size } as unknown as RBNode<TKey, TData>;\n\t}\n\n\tprivate isRed(node: RBNode<TKey, TData> | undefined): boolean {\n\t\treturn !!node && node.color === RBColor.RED;\n\t}\n\n\tprivate nodeSize(node: RBNode<TKey, TData> | undefined): number {\n\t\treturn node ? node.size : 0;\n\t}\n\tpublic size(): number {\n\t\treturn this.nodeSize(this.root);\n\t}\n\tpublic isEmpty(): boolean {\n\t\treturn !this.root;\n\t}\n\tpublic get(key: TKey): RBNode<TKey, TData> | undefined {\n\t\tif (key !== undefined) {\n\t\t\treturn this.nodeGet(this.root, key);\n\t\t}\n\t}\n\tprivate nodeGet(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tkey: TKey,\n\t): RBNode<TKey, TData> | undefined {\n\t\tlet _node = node;\n\t\twhile (_node) {\n\t\t\tconst cmp = this.compareKeys(key, _node.key);\n\t\t\tif (cmp < 0) {\n\t\t\t\t_node = _node.left;\n\t\t\t} else if (cmp > 0) {\n\t\t\t\t_node = _node.right;\n\t\t\t} else {\n\t\t\t\treturn _node;\n\t\t\t}\n\t\t}\n\t}\n\tprivate contains(key: TKey): RBNode<TKey, TData> | undefined {\n\t\treturn this.get(key);\n\t}\n\n\tpublic gather(key: TKey, matcher: IRBMatcher<TKey, TData>): RBNode<TKey, TData>[] {\n\t\tconst results = [] as RBNode<TKey, TData>[];\n\t\tif (key !== undefined) {\n\t\t\tthis.nodeGather(this.root, results, key, matcher);\n\t\t}\n\t\treturn results;\n\t}\n\n\tprivate nodeGather(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tresults: RBNode<TKey, TData>[],\n\t\tkey: TKey,\n\t\tmatcher: IRBMatcher<TKey, TData>,\n\t): void {\n\t\tif (node) {\n\t\t\tif (matcher.continueSubtree(node.left, key)) {\n\t\t\t\tthis.nodeGather(node.left, results, key, matcher);\n\t\t\t}\n\t\t\tif (matcher.matchNode(node, key)) {\n\t\t\t\tresults.push(node);\n\t\t\t}\n\t\t\tif (matcher.continueSubtree(node.right, key)) {\n\t\t\t\tthis.nodeGather(node.right, results, key, matcher);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic walkExactMatchesForward(\n\t\tcompareFn: (node: RBNode<TKey, TData>) => number,\n\t\tactionFn: (node: RBNode<TKey, TData>) => void,\n\t\tcontinueLeftFn: (number: number) => boolean,\n\t\tcontinueRightFn: (number: number) => boolean,\n\t): void {\n\t\tthis.nodeWalkExactMatchesForward(\n\t\t\tthis.root,\n\t\t\tcompareFn,\n\t\t\tactionFn,\n\t\t\tcontinueLeftFn,\n\t\t\tcontinueRightFn,\n\t\t);\n\t}\n\n\tprivate nodeWalkExactMatchesForward(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tcompareFn: (node: RBNode<TKey, TData>) => number,\n\t\tactionFn: (node: RBNode<TKey, TData>) => void,\n\t\tcontinueLeftFn: (number: number) => boolean,\n\t\tcontinueRightFn: (number: number) => boolean,\n\t): void {\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tconst result: number = compareFn(node);\n\t\tif (continueLeftFn(result)) {\n\t\t\tthis.nodeWalkExactMatchesForward(\n\t\t\t\tnode.left,\n\t\t\t\tcompareFn,\n\t\t\t\tactionFn,\n\t\t\t\tcontinueLeftFn,\n\t\t\t\tcontinueRightFn,\n\t\t\t);\n\t\t}\n\t\tif (result === 0) {\n\t\t\tactionFn(node);\n\t\t}\n\t\tif (continueRightFn(result)) {\n\t\t\tthis.nodeWalkExactMatchesForward(\n\t\t\t\tnode.right,\n\t\t\t\tcompareFn,\n\t\t\t\tactionFn,\n\t\t\t\tcontinueLeftFn,\n\t\t\t\tcontinueRightFn,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic walkExactMatchesBackward(\n\t\tcompareFn: (node: RBNode<TKey, TData>) => number,\n\t\tactionFn: (node: RBNode<TKey, TData>) => void,\n\t\tcontinueLeftFn: (number: number) => boolean,\n\t\tcontinueRightFn: (number: number) => boolean,\n\t): void {\n\t\tthis.nodeWalkExactMatchesBackward(\n\t\t\tthis.root,\n\t\t\tcompareFn,\n\t\t\tactionFn,\n\t\t\tcontinueLeftFn,\n\t\t\tcontinueRightFn,\n\t\t);\n\t}\n\n\tprivate nodeWalkExactMatchesBackward(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tcompareFn: (node: RBNode<TKey, TData>) => number,\n\t\tactionFn: (node: RBNode<TKey, TData>) => void,\n\t\tcontinueLeftFn: (cmp: number) => boolean,\n\t\tcontinueRightFn: (cmp: number) => boolean,\n\t): void {\n\t\tif (!node) {\n\t\t\treturn;\n\t\t}\n\t\tconst result: number = compareFn(node);\n\t\tif (continueRightFn(result)) {\n\t\t\tthis.nodeWalkExactMatchesBackward(\n\t\t\t\tnode.right,\n\t\t\t\tcompareFn,\n\t\t\t\tactionFn,\n\t\t\t\tcontinueLeftFn,\n\t\t\t\tcontinueRightFn,\n\t\t\t);\n\t\t}\n\t\tif (result === 0) {\n\t\t\tactionFn(node);\n\t\t}\n\t\tif (continueLeftFn(result)) {\n\t\t\tthis.nodeWalkExactMatchesBackward(\n\t\t\t\tnode.left,\n\t\t\t\tcompareFn,\n\t\t\t\tactionFn,\n\t\t\t\tcontinueLeftFn,\n\t\t\t\tcontinueRightFn,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic put(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>): void {\n\t\tif (key !== undefined) {\n\t\t\tif (data === undefined) {\n\t\t\t\tthis.remove(key);\n\t\t\t} else {\n\t\t\t\tthis.root = this.nodePut(this.root, key, data, conflict);\n\t\t\t\tthis.root.color = RBColor.BLACK;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate nodePut(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tkey: TKey,\n\t\tdata: TData,\n\t\tconflict?: ConflictAction<TKey, TData>,\n\t): RBNode<TKey, TData> {\n\t\tlet _node = node;\n\t\tif (_node) {\n\t\t\tconst cmp = this.compareKeys(key, _node.key);\n\t\t\tif (cmp < 0) {\n\t\t\t\t_node.left = this.nodePut(_node.left, key, data, conflict);\n\t\t\t} else if (cmp > 0) {\n\t\t\t\t_node.right = this.nodePut(_node.right, key, data, conflict);\n\t\t\t} else {\n\t\t\t\tif (conflict) {\n\t\t\t\t\tconst kd = conflict(key, _node.key, data, _node.data);\n\t\t\t\t\tif (kd.key) {\n\t\t\t\t\t\t_node.key = kd.key;\n\t\t\t\t\t}\n\t\t\t\t\t_node.data = kd.data ?? data;\n\t\t\t\t} else {\n\t\t\t\t\t_node.data = data;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.isRed(_node.right) && !this.isRed(_node.left)) {\n\t\t\t\t_node = this.rotateLeft(_node);\n\t\t\t}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tif (this.isRed(_node.left) && this.isRed(_node.left!.left)) {\n\t\t\t\t_node = this.rotateRight(_node);\n\t\t\t}\n\t\t\tif (this.isRed(_node.left) && this.isRed(_node.right)) {\n\t\t\t\tthis.flipColors(_node);\n\t\t\t}\n\t\t\t_node.size = this.nodeSize(_node.left) + this.nodeSize(_node.right) + 1;\n\t\t\tif (this.aug) {\n\t\t\t\tthis.updateLocal(_node);\n\t\t\t}\n\t\t\treturn _node;\n\t\t} else {\n\t\t\treturn this.makeNode(key, data, RBColor.RED, 1);\n\t\t}\n\t}\n\n\tprivate updateLocal(node: RBNode<TKey, TData>): void {\n\t\tif (this.aug) {\n\t\t\tif (this.isRed(node.left)) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tthis.aug.update(node.left!);\n\t\t\t}\n\t\t\tif (this.isRed(node.right)) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tthis.aug.update(node.right!);\n\t\t\t}\n\t\t\tthis.aug.update(node);\n\t\t}\n\t}\n\n\tprivate nodeRemoveMin(node: RBNode<TKey, TData>): RBNode<TKey, TData> | undefined {\n\t\tlet _node = node;\n\t\tif (_node.left) {\n\t\t\tif (!this.isRed(_node.left) && !this.isRed(_node.left.left)) {\n\t\t\t\t_node = this.moveRedLeft(_node);\n\t\t\t}\n\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t_node.left = this.nodeRemoveMin(_node.left!);\n\t\t\treturn this.balance(_node);\n\t\t}\n\t}\n\n\tpublic remove(key: TKey): void {\n\t\tif (key !== undefined) {\n\t\t\tif (!this.contains(key)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.removeExisting(key);\n\t\t}\n\t\t// TODO: error on undefined key\n\t}\n\n\tpublic removeExisting(key: TKey): void {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tif (!this.isRed(this.root!.left) && !this.isRed(this.root!.right)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tthis.root!.color = RBColor.RED;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tthis.root = this.nodeRemove(this.root!, key);\n\t}\n\n\tprivate nodeRemove(node: RBNode<TKey, TData>, key: TKey): RBNode<TKey, TData> | undefined {\n\t\tlet _node = node;\n\t\tif (this.compareKeys(key, _node.key) < 0) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tif (!this.isRed(_node.left) && !this.isRed(_node.left!.left)) {\n\t\t\t\t_node = this.moveRedLeft(_node);\n\t\t\t}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t_node.left = this.nodeRemove(_node.left!, key);\n\t\t} else {\n\t\t\tif (this.isRed(_node.left)) {\n\t\t\t\t_node = this.rotateRight(_node);\n\t\t\t}\n\t\t\tif (this.compareKeys(key, _node.key) === 0 && !_node.right) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tif (!this.isRed(_node.right) && !this.isRed(_node.right!.left)) {\n\t\t\t\t_node = this.moveRedRight(_node);\n\t\t\t}\n\t\t\tif (this.compareKeys(key, _node.key) === 0) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tconst subtreeMin = this.nodeMin(_node.right!);\n\t\t\t\t_node.key = subtreeMin.key;\n\t\t\t\t_node.data = subtreeMin.data;\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t_node.right = this.nodeRemoveMin(_node.right!);\n\t\t\t} else {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t_node.right = this.nodeRemove(_node.right!, key);\n\t\t\t}\n\t\t}\n\t\treturn this.balance(_node);\n\t}\n\n\t/**\n\t * Finds the largest node that is less than or equal to a given key.\n\t */\n\tpublic floor(key: TKey): RBNode<TKey, TData> | undefined {\n\t\tif (!this.isEmpty()) {\n\t\t\treturn this.nodeFloor(this.root, key);\n\t\t}\n\t}\n\n\tprivate nodeFloor(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tkey: TKey,\n\t): RBNode<TKey, TData> | undefined {\n\t\tif (node) {\n\t\t\tconst cmp = this.compareKeys(key, node.key);\n\t\t\tif (cmp === 0) {\n\t\t\t\treturn node;\n\t\t\t} else if (cmp < 0) {\n\t\t\t\treturn this.nodeFloor(node.left, key);\n\t\t\t} else {\n\t\t\t\tconst rightFloor = this.nodeFloor(node.right, key);\n\t\t\t\treturn rightFloor ?? node;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Finds the smallest node that is greater than or equal to a given key.\n\t */\n\tpublic ceil(key: TKey): RBNode<TKey, TData> | undefined {\n\t\tif (!this.isEmpty()) {\n\t\t\treturn this.nodeCeil(this.root, key);\n\t\t}\n\t}\n\n\tprivate nodeCeil(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tkey: TKey,\n\t): RBNode<TKey, TData> | undefined {\n\t\tif (node) {\n\t\t\tconst cmp = this.compareKeys(key, node.key);\n\t\t\tif (cmp === 0) {\n\t\t\t\treturn node;\n\t\t\t} else if (cmp > 0) {\n\t\t\t\treturn this.nodeCeil(node.right, key);\n\t\t\t} else {\n\t\t\t\tconst leftCeil = this.nodeCeil(node.left, key);\n\t\t\t\treturn leftCeil ?? node;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic min(): RBNode<TKey, TData> | undefined {\n\t\tif (this.root) {\n\t\t\treturn this.nodeMin(this.root);\n\t\t}\n\t}\n\n\tprivate nodeMin(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n\t\treturn node.left ? this.nodeMin(node.left) : node;\n\t}\n\n\tpublic max(): RBNode<TKey, TData> | undefined {\n\t\tif (this.root) {\n\t\t\treturn this.nodeMax(this.root);\n\t\t}\n\t}\n\n\tprivate nodeMax(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n\t\treturn node.right ? this.nodeMax(node.right) : node;\n\t}\n\n\tprivate rotateRight(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst leftChild = node.left!;\n\t\tnode.left = leftChild.right;\n\t\tleftChild.right = node;\n\t\tleftChild.color = leftChild.right.color;\n\t\tleftChild.right.color = RBColor.RED;\n\t\tleftChild.size = node.size;\n\t\tnode.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n\t\tif (this.aug) {\n\t\t\tthis.updateLocal(node);\n\t\t\tthis.updateLocal(leftChild);\n\t\t}\n\t\treturn leftChild;\n\t}\n\n\tprivate rotateLeft(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst rightChild = node.right!;\n\t\tnode.right = rightChild.left;\n\t\trightChild.left = node;\n\t\trightChild.color = rightChild.left.color;\n\t\trightChild.left.color = RBColor.RED;\n\t\trightChild.size = node.size;\n\t\tnode.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n\t\tif (this.aug) {\n\t\t\tthis.updateLocal(node);\n\t\t\tthis.updateLocal(rightChild);\n\t\t}\n\t\treturn rightChild;\n\t}\n\n\tprivate oppositeColor(c: RBColor): RBColor {\n\t\treturn c === RBColor.BLACK ? RBColor.RED : RBColor.BLACK;\n\t}\n\n\tprivate flipColors(node: RBNode<TKey, TData>): void {\n\t\tnode.color = this.oppositeColor(node.color);\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tnode.left!.color = this.oppositeColor(node.left!.color);\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tnode.right!.color = this.oppositeColor(node.right!.color);\n\t}\n\n\tprivate moveRedLeft(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n\t\tlet _node = node;\n\t\tthis.flipColors(_node);\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tif (this.isRed(_node.right!.left)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t_node.right = this.rotateRight(_node.right!);\n\t\t\t_node = this.rotateLeft(_node);\n\t\t\tthis.flipColors(_node);\n\t\t}\n\t\treturn _node;\n\t}\n\n\tprivate moveRedRight(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n\t\tlet _node = node;\n\t\tthis.flipColors(_node);\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tif (this.isRed(_node.left!.left)) {\n\t\t\t_node = this.rotateRight(_node);\n\t\t\tthis.flipColors(_node);\n\t\t}\n\t\treturn _node;\n\t}\n\n\tprivate balance(input: RBNode<TKey, TData>): RBNode<TKey, TData> {\n\t\tlet node: RBNode<TKey, TData> | undefined = input;\n\t\tif (this.isRed(node.right)) {\n\t\t\tnode = this.rotateLeft(node);\n\t\t}\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tif (this.isRed(node.left) && this.isRed(node.left!.left)) {\n\t\t\tnode = this.rotateRight(node);\n\t\t}\n\t\tif (this.isRed(node.left) && this.isRed(node.right)) {\n\t\t\tthis.flipColors(node);\n\t\t}\n\t\tnode.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n\t\tif (this.aug) {\n\t\t\tthis.aug.update(node);\n\t\t}\n\t\treturn node;\n\t}\n\n\tpublic mapRange<TAccum>(\n\t\taction: PropertyAction<TKey, TData>,\n\t\taccum?: TAccum,\n\t\tstart?: TKey,\n\t\tend?: TKey,\n\t): void {\n\t\tthis.nodeMap(this.root, action, accum, start, end);\n\t}\n\n\tpublic map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum): void {\n\t\t// TODO: optimize to avoid comparisons\n\t\tthis.nodeMap(this.root, action, accum);\n\t}\n\n\tpublic keys(): TKey[] {\n\t\tconst keyList: TKey[] = [];\n\t\tconst actions: RBNodeActions<TKey, TData> = {\n\t\t\tshowStructure: true,\n\t\t\tinfix: (node) => {\n\t\t\t\tkeyList.push(node.key);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t};\n\t\tthis.walk(actions);\n\t\treturn keyList;\n\t}\n\n\t/**\n\t * Depth-first traversal with custom action; if action returns\n\t * false, traversal is halted.\n\t * @param action - action to apply to each node\n\t */\n\tpublic walk(actions: RBNodeActions<TKey, TData>): void {\n\t\tthis.nodeWalk(this.root, actions);\n\t}\n\n\tpublic walkBackward(actions: RBNodeActions<TKey, TData>): void {\n\t\tthis.nodeWalkBackward(this.root, actions);\n\t}\n\n\tprivate nodeWalk(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tactions: RBNodeActions<TKey, TData>,\n\t): boolean {\n\t\tlet go = true;\n\t\tif (node) {\n\t\t\tif (actions.pre && (!!actions.showStructure || node.color === RBColor.BLACK)) {\n\t\t\t\tgo = actions.pre(node);\n\t\t\t}\n\t\t\tif (node.left) {\n\t\t\t\tgo = this.nodeWalk(node.left, actions);\n\t\t\t}\n\t\t\tif (go && actions.infix && (!!actions.showStructure || node.color === RBColor.BLACK)) {\n\t\t\t\tgo = actions.infix(node);\n\t\t\t}\n\t\t\tif (go) {\n\t\t\t\tgo = this.nodeWalk(node.right, actions);\n\t\t\t}\n\t\t\tif (go && actions.post && (!!actions.showStructure || node.color === RBColor.BLACK)) {\n\t\t\t\tgo = actions.post(node);\n\t\t\t}\n\t\t}\n\t\treturn go;\n\t}\n\n\tprivate nodeWalkBackward(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\tactions: RBNodeActions<TKey, TData>,\n\t): boolean {\n\t\tlet go = true;\n\t\tif (node) {\n\t\t\tif (actions.pre && (!!actions.showStructure || node.color === RBColor.BLACK)) {\n\t\t\t\tgo = actions.pre(node);\n\t\t\t}\n\t\t\tif (node.right) {\n\t\t\t\tgo = this.nodeWalkBackward(node.right, actions);\n\t\t\t}\n\t\t\tif (go && actions.infix && (!!actions.showStructure || node.color === RBColor.BLACK)) {\n\t\t\t\tgo = actions.infix(node);\n\t\t\t}\n\t\t\tif (go) {\n\t\t\t\tgo = this.nodeWalkBackward(node.left, actions);\n\t\t\t}\n\t\t\tif (go && actions.post && (!!actions.showStructure || node.color === RBColor.BLACK)) {\n\t\t\t\tgo = actions.post(node);\n\t\t\t}\n\t\t}\n\t\treturn go;\n\t}\n\n\tprivate nodeMap<TAccum>(\n\t\tnode: RBNode<TKey, TData> | undefined,\n\t\taction: PropertyAction<TKey, TData>,\n\t\taccum?: TAccum,\n\t\tstart?: TKey,\n\t\tend?: TKey,\n\t): boolean {\n\t\tlet _start = start;\n\t\tlet _end = end;\n\t\tif (!node) {\n\t\t\treturn true;\n\t\t}\n\t\tif (_start === undefined) {\n\t\t\t_start = this.nodeMin(node).key;\n\t\t}\n\t\tif (_end === undefined) {\n\t\t\t_end = this.nodeMax(node).key;\n\t\t}\n\t\tconst cmpStart = this.compareKeys(_start, node.key);\n\t\tconst cmpEnd = this.compareKeys(_end, node.key);\n\t\tlet go = true;\n\t\tif (cmpStart < 0) {\n\t\t\tgo = this.nodeMap(node.left, action, accum, _start, _end);\n\t\t}\n\t\tif (go && cmpStart <= 0 && cmpEnd >= 0) {\n\t\t\t// REVIEW: test for black node here\n\t\t\tgo = action(node, accum);\n\t\t}\n\t\tif (go && cmpEnd > 0) {\n\t\t\tgo = this.nodeMap(node.right, action, accum, _start, _end);\n\t\t}\n\t\treturn go;\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endOfTreeSegment.d.ts","sourceRoot":"","sources":["../src/endOfTreeSegment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAgB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE5F;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,uBAAe,mBAAmB;IACrB,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS;gBAApB,SAAS,EAAE,SAAS;IAOnD,UAAU,EAAE,MAAM,CAAK;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAmB;IAC7C,WAAW,EAAE,SAAS,CAAC;IACvB,eAAe,EAAE,SAAS,CAAC;IAC3B,QAAQ,EAAE,SAAS,CAAC;IACpB,eAAe,EAAE,SAAS,CAAC;IAC3B,UAAU,EAAE,SAAS,CAAC;IACtB,GAAG,SAAK;IACR,QAAQ,SAAiB;IACzB,YAAY,SAAK;IAEjB,MAAM,IAAI,IAAI,IAAI,QAAQ;IAI1B,SAAS,CAAC,QAAQ,CAAC,oBAAoB,IAAI;QAC1C,MAAM,EAAE,UAAU,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACd;IAED,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"endOfTreeSegment.d.ts","sourceRoot":"","sources":["../src/endOfTreeSegment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAgB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE5F;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,uBAAe,mBAAmB;IACrB,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS;gBAApB,SAAS,EAAE,SAAS;IAOnD,UAAU,EAAE,MAAM,CAAK;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAmB;IAC7C,WAAW,EAAE,SAAS,CAAC;IACvB,eAAe,EAAE,SAAS,CAAC;IAC3B,QAAQ,EAAE,SAAS,CAAC;IACpB,eAAe,EAAE,SAAS,CAAC;IAC3B,UAAU,EAAE,SAAS,CAAC;IACtB,GAAG,SAAK;IACR,QAAQ,SAAiB;IACzB,YAAY,SAAK;IAEjB,MAAM,IAAI,IAAI,IAAI,QAAQ;IAI1B,SAAS,CAAC,QAAQ,CAAC,oBAAoB,IAAI;QAC1C,MAAM,EAAE,UAAU,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACd;IAED,IAAI,MAAM,IAAI,UAAU,CAEvB;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC;IAE/B,SAAS,CAAC,EAAE,wBAAwB,CAAC;IAMrC,IAAI,aAAa,IAAI,KAAK,CAEzB;IACD,IAAI,kBAAkB,IAAI,KAAK,CAE9B;IACD,aAAa,cAAgB;IAC7B,KAAK,cAAgB;IACrB,SAAS,cAAgB;IACzB,MAAM,cAAgB;IACtB,OAAO,cAAgB;IACvB,YAAY,cAAgB;IAC5B,GAAG,cAAgB;CACnB;AAMD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,mBAAoB,YAAW,QAAQ,EAAE,YAAY;IAC5F,IAAI,EAAE,MAAM,CAAwB;IACpC,QAAQ,CAAC,YAAY,WAAW;IAEhC;;;OAGG;IACH,SAAS,CAAC,oBAAoB,IAAI;QACjC,MAAM,EAAE,UAAU,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACd;IA2BD,IAAI,OAAO,IAAI,MAAM,CAKpB;CACD;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,mBAAoB,YAAW,QAAQ,EAAE,YAAY;IAC1F,IAAI,EAAE,MAAM,CAAsB;IAClC,QAAQ,CAAC,YAAY,SAAS;IAE9B;;;OAGG;IACH,SAAS,CAAC,oBAAoB,IAAI;QACjC,MAAM,EAAE,UAAU,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACd;IA2BD,IAAI,OAAO,IAAI,MAAM,CAMpB;CACD"}
|
package/lib/endOfTreeSegment.js
CHANGED
|
@@ -104,6 +104,9 @@ export class StartOfTreeSegment extends BaseEndpointSegment {
|
|
|
104
104
|
};
|
|
105
105
|
}
|
|
106
106
|
get ordinal() {
|
|
107
|
+
// Ordinals exist purely for lexicographical sort order and use a small set of valid bytes for each string character.
|
|
108
|
+
// The extra handling fromCodePoint has for things like surrogate pairs is therefore unnecessary.
|
|
109
|
+
// eslint-disable-next-line unicorn/prefer-code-point
|
|
107
110
|
return String.fromCharCode(0x00);
|
|
108
111
|
}
|
|
109
112
|
}
|
|
@@ -144,7 +147,7 @@ export class EndOfTreeSegment extends BaseEndpointSegment {
|
|
|
144
147
|
// we base it on the depth of the tree
|
|
145
148
|
// to ensure it is bigger than all ordinals in
|
|
146
149
|
// the tree, as each layer appends to the previous
|
|
147
|
-
return String.
|
|
150
|
+
return String.fromCodePoint(0xffff).repeat(this.endpointSegmentProps().depth);
|
|
148
151
|
}
|
|
149
152
|
}
|
|
150
153
|
//# sourceMappingURL=endOfTreeSegment.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endOfTreeSegment.js","sourceRoot":"","sources":["../src/endOfTreeSegment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGxE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAe,mBAAmB;IACjC,YAA+B,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;QACnD;;;;;WAKG;QACH,eAAU,GAAW,CAAC,CAAC;QACvB,qBAAgB,GAAa,CAAC,aAAa,CAAC,CAAC;QAM7C,QAAG,GAAG,CAAC,CAAC;QACR,aAAQ,GAAG,aAAa,CAAC;QACzB,iBAAY,GAAG,CAAC,CAAC;QAkCjB,kBAAa,GAAG,YAAY,CAAC;QAC7B,UAAK,GAAG,YAAY,CAAC;QACrB,cAAS,GAAG,YAAY,CAAC;QACzB,WAAM,GAAG,YAAY,CAAC;QACtB,YAAO,GAAG,YAAY,CAAC;QACvB,iBAAY,GAAG,YAAY,CAAC;QAC5B,QAAG,GAAG,YAAY,CAAC;IAxDmC,CAAC;IAkBvD,MAAM;QACL,OAAO,IAAI,CAAC;IACb,CAAC;IAQD,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC,MAAM,CAAC;IAC3C,CAAC;IAED,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC;IAC1C,CAAC;IAMD;;;OAGG;IACH,IAAI,aAAa;QAChB,OAAO,YAAY,EAAE,CAAC;IACvB,CAAC;IACD,IAAI,kBAAkB;QACrB,OAAO,YAAY,EAAE,CAAC;IACvB,CAAC;CAQD;AAED,MAAM,YAAY,GAAG,
|
|
1
|
+
{"version":3,"file":"endOfTreeSegment.js","sourceRoot":"","sources":["../src/endOfTreeSegment.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport { LocalClientId } from \"./constants.js\";\nimport { LocalReferenceCollection } from \"./localReference.js\";\nimport { MergeTree } from \"./mergeTree.js\";\nimport { NodeAction, depthFirstNodeWalk } from \"./mergeTreeNodeWalk.js\";\nimport { IRemovalInfo, ISegment, ISegmentLeaf, type MergeBlock } from \"./mergeTreeNodes.js\";\n\n/**\n * This is a special segment that is not bound or known by the merge tree itself,\n * but the segment itself pretends to be a removed segment at an endpoint of the\n * tree. It is removed so it appears as a undefined/0 length segment. This segment\n * adds the capability to hold local references that have been detached from the\n * real merge tree, and give the appearance that they exist at an endpoint of the\n * tree.\n *\n * This is useful today in 2 cases: detached references and interval stickiness.\n *\n * In general, local references only become detached when the tree becomes empty\n * and the EndOfTreeSegment allows us to gracefully handle that case by giving\n * those references a place to live.\n *\n * In the case of interval stickiness, it is desirable to be able to refer to\n * the position immediately after or before a segment, in order for the endpoint\n * of an interval to be exclusive. This means that in order to support intervals\n * that are exclusive and also include the first or last segment of the tree, it\n * must be possible in some way to refer to a position before or after the tree\n * respectively. The endpoint segments allow us to support such behavior.\n */\nabstract class BaseEndpointSegment {\n\tconstructor(protected readonly mergeTree: MergeTree) {}\n\t/*\n\t * segments must be of at least length one, but\n\t * removed segments will have a calculated length\n\t * of undefined/0. we leverage this to create\n\t * a 0 length segment for an endpoint of the tree\n\t */\n\tremovedSeq: number = 0;\n\tremovedClientIds: number[] = [LocalClientId];\n\tattribution: undefined;\n\tpropertyManager: undefined;\n\tlocalSeq: undefined;\n\tlocalRemovedSeq: undefined;\n\tproperties: undefined;\n\tseq = 0;\n\tclientId = LocalClientId;\n\tcachedLength = 1;\n\n\tisLeaf(): this is ISegment {\n\t\treturn true;\n\t}\n\n\tprotected abstract endpointSegmentProps(): {\n\t\tparent: MergeBlock;\n\t\tindex: number;\n\t\tdepth: number;\n\t};\n\n\tget parent(): MergeBlock {\n\t\treturn this.endpointSegmentProps().parent;\n\t}\n\n\tget index(): number {\n\t\treturn this.endpointSegmentProps().index;\n\t}\n\n\tabstract get ordinal(): string;\n\n\tlocalRefs?: LocalReferenceCollection;\n\n\t/*\n\t * since this segment isn't real, throw on any segment\n\t * operation that isn't expected\n\t */\n\tget segmentGroups(): never {\n\t\treturn notSupported();\n\t}\n\tget trackingCollection(): never {\n\t\treturn notSupported();\n\t}\n\taddProperties = notSupported;\n\tclone = notSupported;\n\tcanAppend = notSupported;\n\tappend = notSupported;\n\tsplitAt = notSupported;\n\ttoJSONObject = notSupported;\n\tack = notSupported;\n}\n\nconst notSupported = (): never => {\n\tassert(false, 0x3ed /* operation not supported */);\n};\n\n/**\n * The position immediately prior to the start of the tree\n */\nexport class StartOfTreeSegment extends BaseEndpointSegment implements ISegment, IRemovalInfo {\n\ttype: string = \"StartOfTreeSegment\";\n\treadonly endpointType = \"start\";\n\n\t/**\n\t * this segment pretends to be a sibling of the first real segment.\n\t * so compute the necessary properties to pretend to be that segment.\n\t */\n\tprotected endpointSegmentProps(): {\n\t\tparent: MergeBlock;\n\t\tindex: number;\n\t\tdepth: number;\n\t} {\n\t\tlet firstSegment: ISegmentLeaf | undefined;\n\t\tlet depth = 1;\n\t\tconst root = this.mergeTree.root;\n\t\tdepthFirstNodeWalk(\n\t\t\troot,\n\t\t\troot.children[0],\n\t\t\t(node) => {\n\t\t\t\tdepth++;\n\t\t\t\tif (node?.isLeaf()) {\n\t\t\t\t\tfirstSegment = node;\n\t\t\t\t\treturn NodeAction.Exit;\n\t\t\t\t}\n\t\t\t},\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t);\n\t\tconst parent = firstSegment?.parent ?? root;\n\t\tconst index = 0;\n\t\treturn {\n\t\t\tparent,\n\t\t\tindex,\n\t\t\tdepth,\n\t\t};\n\t}\n\n\tget ordinal(): string {\n\t\t// Ordinals exist purely for lexicographical sort order and use a small set of valid bytes for each string character.\n\t\t// The extra handling fromCodePoint has for things like surrogate pairs is therefore unnecessary.\n\t\t// eslint-disable-next-line unicorn/prefer-code-point\n\t\treturn String.fromCharCode(0x00);\n\t}\n}\n\n/**\n * The position immediately after the end of the tree\n */\nexport class EndOfTreeSegment extends BaseEndpointSegment implements ISegment, IRemovalInfo {\n\ttype: string = \"EndOfTreeSegment\";\n\treadonly endpointType = \"end\";\n\n\t/**\n\t * this segment pretends to be a sibling of the last real segment.\n\t * so compute the necessary properties to pretend to be that segment.\n\t */\n\tprotected endpointSegmentProps(): {\n\t\tparent: MergeBlock;\n\t\tindex: number;\n\t\tdepth: number;\n\t} {\n\t\tlet lastSegment: ISegmentLeaf | undefined;\n\t\tlet depth = 1;\n\t\tconst root = this.mergeTree.root;\n\t\tdepthFirstNodeWalk(\n\t\t\troot,\n\t\t\troot.children[root.childCount - 1],\n\t\t\t(node) => {\n\t\t\t\tdepth++;\n\t\t\t\tif (node?.isLeaf()) {\n\t\t\t\t\tlastSegment = node;\n\t\t\t\t\treturn NodeAction.Exit;\n\t\t\t\t}\n\t\t\t},\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t);\n\t\tconst parent = lastSegment?.parent ?? root;\n\t\tconst index = parent.childCount;\n\t\treturn {\n\t\t\tparent,\n\t\t\tindex,\n\t\t\tdepth,\n\t\t};\n\t}\n\n\tget ordinal(): string {\n\t\t// just compute an arbitrarily big ordinal\n\t\t// we base it on the depth of the tree\n\t\t// to ensure it is bigger than all ordinals in\n\t\t// the tree, as each layer appends to the previous\n\t\treturn String.fromCodePoint(0xffff).repeat(this.endpointSegmentProps().depth);\n\t}\n}\n"]}
|
package/lib/legacy.d.ts
CHANGED