@fluidframework/tree 2.22.1 → 2.23.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/.vscode/extensions.json +1 -0
- package/CHANGELOG.md +47 -0
- package/api-report/tree.alpha.api.md +31 -0
- package/dist/alpha.d.ts +1 -0
- package/dist/codec/codec.js +3 -3
- package/dist/codec/codec.js.map +1 -1
- package/dist/codec/discriminatedUnions.d.ts.map +1 -1
- package/dist/codec/discriminatedUnions.js +1 -1
- package/dist/codec/discriminatedUnions.js.map +1 -1
- package/dist/core/schema-stored/schema.d.ts.map +1 -1
- package/dist/core/schema-stored/schema.js +3 -3
- package/dist/core/schema-stored/schema.js.map +1 -1
- package/dist/core/tree/anchorSet.d.ts.map +1 -1
- package/dist/core/tree/anchorSet.js +18 -13
- package/dist/core/tree/anchorSet.js.map +1 -1
- package/dist/core/tree/treeTextFormat.js +1 -1
- package/dist/core/tree/treeTextFormat.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/basicChunk.js +11 -8
- package/dist/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/chunkTree.js +2 -2
- package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/chunkedForest.js +3 -3
- package/dist/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js +2 -2
- package/dist/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js +4 -3
- package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/nodeShape.js +2 -2
- package/dist/feature-libraries/chunked-forest/codec/nodeShape.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncoding.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncoding.js +3 -3
- package/dist/feature-libraries/chunked-forest/codec/schemaBasedEncoding.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/emptyChunk.js +14 -14
- package/dist/feature-libraries/chunked-forest/emptyChunk.js.map +1 -1
- package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
- package/dist/feature-libraries/chunked-forest/uniformChunk.js +6 -4
- package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/dist/feature-libraries/default-schema/schemaChecker.js +1 -1
- package/dist/feature-libraries/default-schema/schemaChecker.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.js +4 -3
- package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyNode.js +5 -4
- package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
- package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -1
- package/dist/feature-libraries/indexing/anchorTreeIndex.js +1 -1
- package/dist/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
- package/dist/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/comparison.js +6 -4
- package/dist/feature-libraries/modular-schema/comparison.js.map +1 -1
- package/dist/feature-libraries/modular-schema/isNeverTree.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/isNeverTree.js +4 -4
- package/dist/feature-libraries/modular-schema/isNeverTree.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +4 -4
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js +10 -11
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/dist/feature-libraries/node-key/mockNodeKeyManager.js +1 -1
- package/dist/feature-libraries/node-key/mockNodeKeyManager.js.map +1 -1
- package/dist/feature-libraries/object-forest/objectForest.js +1 -1
- package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
- package/dist/feature-libraries/schema-index/codec.js +1 -1
- package/dist/feature-libraries/schema-index/codec.js.map +1 -1
- package/dist/feature-libraries/sequence-field/compose.js +1 -1
- package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
- package/dist/feature-libraries/sequence-field/invert.js +1 -1
- package/dist/feature-libraries/sequence-field/invert.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
- package/dist/feature-libraries/sequence-field/utils.js +1 -1
- package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
- package/dist/feature-libraries/treeCursorUtils.d.ts.map +1 -1
- package/dist/feature-libraries/treeCursorUtils.js +6 -4
- package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/jsonDomainSchema.d.ts +113 -0
- package/dist/jsonDomainSchema.d.ts.map +1 -0
- package/dist/jsonDomainSchema.js +101 -0
- package/dist/jsonDomainSchema.js.map +1 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/serializableDomainSchema.d.ts +108 -0
- package/dist/serializableDomainSchema.d.ts.map +1 -0
- package/dist/serializableDomainSchema.js +90 -0
- package/dist/serializableDomainSchema.js.map +1 -0
- package/dist/shared-tree/index.d.ts +1 -1
- package/dist/shared-tree/index.d.ts.map +1 -1
- package/dist/shared-tree/index.js.map +1 -1
- package/dist/shared-tree/schematizeTree.js +1 -1
- package/dist/shared-tree/schematizeTree.js.map +1 -1
- package/dist/shared-tree/sharedTree.d.ts +37 -20
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +17 -17
- package/dist/shared-tree/sharedTree.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeFamily.js +1 -1
- package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
- package/dist/shared-tree/treeApiAlpha.d.ts.map +1 -1
- package/dist/shared-tree/treeApiAlpha.js +4 -4
- package/dist/shared-tree/treeApiAlpha.js.map +1 -1
- package/dist/shared-tree/treeCheckout.js +1 -1
- package/dist/shared-tree/treeCheckout.js.map +1 -1
- package/dist/shared-tree-core/editManager.d.ts +11 -2
- package/dist/shared-tree-core/editManager.d.ts.map +1 -1
- package/dist/shared-tree-core/editManager.js +70 -34
- package/dist/shared-tree-core/editManager.js.map +1 -1
- package/dist/shared-tree-core/resubmitMachine.d.ts +2 -0
- package/dist/shared-tree-core/resubmitMachine.d.ts.map +1 -1
- package/dist/shared-tree-core/resubmitMachine.js.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.d.ts +10 -3
- package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.js +42 -7
- package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/dist/simple-tree/api/customTree.js +3 -3
- package/dist/simple-tree/api/customTree.js.map +1 -1
- package/dist/simple-tree/api/schemaCreationUtilities.js +1 -1
- package/dist/simple-tree/api/schemaCreationUtilities.js.map +1 -1
- package/dist/simple-tree/api/schemaFactoryRecursive.d.ts +1 -1
- package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
- package/dist/simple-tree/api/simpleTreeIndex.js +3 -3
- package/dist/simple-tree/api/simpleTreeIndex.js.map +1 -1
- package/dist/simple-tree/api/tree.js +1 -1
- package/dist/simple-tree/api/tree.js.map +1 -1
- package/dist/simple-tree/api/treeNodeApi.d.ts.map +1 -1
- package/dist/simple-tree/api/treeNodeApi.js +9 -5
- package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
- package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
- package/dist/simple-tree/api/verboseTree.js +5 -4
- package/dist/simple-tree/api/verboseTree.js.map +1 -1
- package/dist/simple-tree/api/view.js +1 -1
- package/dist/simple-tree/api/view.js.map +1 -1
- package/dist/simple-tree/arrayNode.js +2 -2
- package/dist/simple-tree/arrayNode.js.map +1 -1
- package/dist/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
- package/dist/simple-tree/core/getOrCreateNode.js +1 -1
- package/dist/simple-tree/core/getOrCreateNode.js.map +1 -1
- package/dist/simple-tree/core/schemaCaching.js +1 -1
- package/dist/simple-tree/core/schemaCaching.js.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.js +6 -6
- package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
- package/dist/simple-tree/core/unhydratedFlexTree.js +5 -5
- package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
- package/dist/simple-tree/objectNode.js +2 -2
- package/dist/simple-tree/objectNode.js.map +1 -1
- package/dist/simple-tree/proxies.js +1 -1
- package/dist/simple-tree/proxies.js.map +1 -1
- package/dist/simple-tree/toMapTree.js +3 -3
- package/dist/simple-tree/toMapTree.js.map +1 -1
- package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/dist/simple-tree/toStoredSchema.js +2 -1
- package/dist/simple-tree/toStoredSchema.js.map +1 -1
- package/dist/simple-tree/treeNodeValid.d.ts.map +1 -1
- package/dist/simple-tree/treeNodeValid.js +5 -2
- package/dist/simple-tree/treeNodeValid.js.map +1 -1
- package/dist/util/idAllocator.js +1 -1
- package/dist/util/idAllocator.js.map +1 -1
- package/dist/util/index.d.ts +2 -2
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js +5 -4
- package/dist/util/index.js.map +1 -1
- package/dist/util/nestedMap.d.ts +2 -10
- package/dist/util/nestedMap.d.ts.map +1 -1
- package/dist/util/nestedMap.js +9 -28
- package/dist/util/nestedMap.js.map +1 -1
- package/dist/util/utils.d.ts +23 -6
- package/dist/util/utils.d.ts.map +1 -1
- package/dist/util/utils.js +46 -13
- package/dist/util/utils.js.map +1 -1
- package/lib/alpha.d.ts +1 -0
- package/lib/codec/codec.js +3 -3
- package/lib/codec/codec.js.map +1 -1
- package/lib/codec/discriminatedUnions.d.ts.map +1 -1
- package/lib/codec/discriminatedUnions.js +1 -1
- package/lib/codec/discriminatedUnions.js.map +1 -1
- package/lib/core/schema-stored/schema.d.ts.map +1 -1
- package/lib/core/schema-stored/schema.js +3 -3
- package/lib/core/schema-stored/schema.js.map +1 -1
- package/lib/core/tree/anchorSet.d.ts.map +1 -1
- package/lib/core/tree/anchorSet.js +19 -14
- package/lib/core/tree/anchorSet.js.map +1 -1
- package/lib/core/tree/treeTextFormat.js +1 -1
- package/lib/core/tree/treeTextFormat.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/basicChunk.js +11 -8
- package/lib/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/chunkTree.js +2 -2
- package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/chunkedForest.js +3 -3
- package/lib/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js +2 -2
- package/lib/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +4 -3
- package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/nodeShape.js +2 -2
- package/lib/feature-libraries/chunked-forest/codec/nodeShape.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncoding.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncoding.js +3 -3
- package/lib/feature-libraries/chunked-forest/codec/schemaBasedEncoding.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/emptyChunk.js +14 -14
- package/lib/feature-libraries/chunked-forest/emptyChunk.js.map +1 -1
- package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
- package/lib/feature-libraries/chunked-forest/uniformChunk.js +6 -4
- package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/lib/feature-libraries/default-schema/schemaChecker.js +1 -1
- package/lib/feature-libraries/default-schema/schemaChecker.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.js +4 -3
- package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyNode.js +5 -4
- package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
- package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -1
- package/lib/feature-libraries/indexing/anchorTreeIndex.js +1 -1
- package/lib/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
- package/lib/feature-libraries/modular-schema/comparison.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/comparison.js +6 -4
- package/lib/feature-libraries/modular-schema/comparison.js.map +1 -1
- package/lib/feature-libraries/modular-schema/isNeverTree.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/isNeverTree.js +4 -4
- package/lib/feature-libraries/modular-schema/isNeverTree.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +4 -4
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js +11 -12
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/lib/feature-libraries/node-key/mockNodeKeyManager.js +1 -1
- package/lib/feature-libraries/node-key/mockNodeKeyManager.js.map +1 -1
- package/lib/feature-libraries/object-forest/objectForest.js +1 -1
- package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
- package/lib/feature-libraries/schema-index/codec.js +1 -1
- package/lib/feature-libraries/schema-index/codec.js.map +1 -1
- package/lib/feature-libraries/sequence-field/compose.js +1 -1
- package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
- package/lib/feature-libraries/sequence-field/invert.js +1 -1
- package/lib/feature-libraries/sequence-field/invert.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
- package/lib/feature-libraries/sequence-field/utils.js +1 -1
- package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
- package/lib/feature-libraries/treeCursorUtils.d.ts.map +1 -1
- package/lib/feature-libraries/treeCursorUtils.js +6 -4
- package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/jsonDomainSchema.d.ts +113 -0
- package/lib/jsonDomainSchema.d.ts.map +1 -0
- package/lib/jsonDomainSchema.js +98 -0
- package/lib/jsonDomainSchema.js.map +1 -0
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/serializableDomainSchema.d.ts +108 -0
- package/lib/serializableDomainSchema.d.ts.map +1 -0
- package/lib/serializableDomainSchema.js +87 -0
- package/lib/serializableDomainSchema.js.map +1 -0
- package/lib/shared-tree/index.d.ts +1 -1
- package/lib/shared-tree/index.d.ts.map +1 -1
- package/lib/shared-tree/index.js.map +1 -1
- package/lib/shared-tree/schematizeTree.js +1 -1
- package/lib/shared-tree/schematizeTree.js.map +1 -1
- package/lib/shared-tree/sharedTree.d.ts +37 -20
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +18 -18
- package/lib/shared-tree/sharedTree.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeFamily.js +1 -1
- package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
- package/lib/shared-tree/treeApiAlpha.d.ts.map +1 -1
- package/lib/shared-tree/treeApiAlpha.js +4 -4
- package/lib/shared-tree/treeApiAlpha.js.map +1 -1
- package/lib/shared-tree/treeCheckout.js +1 -1
- package/lib/shared-tree/treeCheckout.js.map +1 -1
- package/lib/shared-tree-core/editManager.d.ts +11 -2
- package/lib/shared-tree-core/editManager.d.ts.map +1 -1
- package/lib/shared-tree-core/editManager.js +70 -34
- package/lib/shared-tree-core/editManager.js.map +1 -1
- package/lib/shared-tree-core/resubmitMachine.d.ts +2 -0
- package/lib/shared-tree-core/resubmitMachine.d.ts.map +1 -1
- package/lib/shared-tree-core/resubmitMachine.js.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.d.ts +10 -3
- package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.js +42 -7
- package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/lib/simple-tree/api/customTree.js +3 -3
- package/lib/simple-tree/api/customTree.js.map +1 -1
- package/lib/simple-tree/api/schemaCreationUtilities.js +1 -1
- package/lib/simple-tree/api/schemaCreationUtilities.js.map +1 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.d.ts +1 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
- package/lib/simple-tree/api/simpleTreeIndex.js +3 -3
- package/lib/simple-tree/api/simpleTreeIndex.js.map +1 -1
- package/lib/simple-tree/api/tree.js +1 -1
- package/lib/simple-tree/api/tree.js.map +1 -1
- package/lib/simple-tree/api/treeNodeApi.d.ts.map +1 -1
- package/lib/simple-tree/api/treeNodeApi.js +9 -5
- package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
- package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
- package/lib/simple-tree/api/verboseTree.js +5 -4
- package/lib/simple-tree/api/verboseTree.js.map +1 -1
- package/lib/simple-tree/api/view.js +1 -1
- package/lib/simple-tree/api/view.js.map +1 -1
- package/lib/simple-tree/arrayNode.js +2 -2
- package/lib/simple-tree/arrayNode.js.map +1 -1
- package/lib/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
- package/lib/simple-tree/core/getOrCreateNode.js +1 -1
- package/lib/simple-tree/core/getOrCreateNode.js.map +1 -1
- package/lib/simple-tree/core/schemaCaching.js +1 -1
- package/lib/simple-tree/core/schemaCaching.js.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.js +6 -6
- package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
- package/lib/simple-tree/core/unhydratedFlexTree.js +5 -5
- package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
- package/lib/simple-tree/objectNode.js +2 -2
- package/lib/simple-tree/objectNode.js.map +1 -1
- package/lib/simple-tree/proxies.js +1 -1
- package/lib/simple-tree/proxies.js.map +1 -1
- package/lib/simple-tree/toMapTree.js +3 -3
- package/lib/simple-tree/toMapTree.js.map +1 -1
- package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
- package/lib/simple-tree/toStoredSchema.js +2 -1
- package/lib/simple-tree/toStoredSchema.js.map +1 -1
- package/lib/simple-tree/treeNodeValid.d.ts.map +1 -1
- package/lib/simple-tree/treeNodeValid.js +5 -2
- package/lib/simple-tree/treeNodeValid.js.map +1 -1
- package/lib/util/idAllocator.js +1 -1
- package/lib/util/idAllocator.js.map +1 -1
- package/lib/util/index.d.ts +2 -2
- package/lib/util/index.d.ts.map +1 -1
- package/lib/util/index.js +2 -2
- package/lib/util/index.js.map +1 -1
- package/lib/util/nestedMap.d.ts +2 -10
- package/lib/util/nestedMap.d.ts.map +1 -1
- package/lib/util/nestedMap.js +5 -23
- package/lib/util/nestedMap.js.map +1 -1
- package/lib/util/utils.d.ts +23 -6
- package/lib/util/utils.d.ts.map +1 -1
- package/lib/util/utils.js +42 -11
- package/lib/util/utils.js.map +1 -1
- package/package.json +22 -22
- package/src/codec/codec.ts +3 -3
- package/src/codec/discriminatedUnions.ts +2 -1
- package/src/core/schema-stored/schema.ts +5 -3
- package/src/core/tree/anchorSet.ts +37 -26
- package/src/core/tree/treeTextFormat.ts +1 -1
- package/src/feature-libraries/chunked-forest/basicChunk.ts +11 -8
- package/src/feature-libraries/chunked-forest/chunkTree.ts +2 -2
- package/src/feature-libraries/chunked-forest/chunkedForest.ts +3 -3
- package/src/feature-libraries/chunked-forest/codec/chunkEncodingGeneric.ts +2 -2
- package/src/feature-libraries/chunked-forest/codec/compressedEncode.ts +4 -3
- package/src/feature-libraries/chunked-forest/codec/nodeShape.ts +2 -2
- package/src/feature-libraries/chunked-forest/codec/schemaBasedEncoding.ts +4 -3
- package/src/feature-libraries/chunked-forest/emptyChunk.ts +14 -14
- package/src/feature-libraries/chunked-forest/uniformChunk.ts +6 -4
- package/src/feature-libraries/default-schema/defaultFieldKinds.ts +1 -1
- package/src/feature-libraries/default-schema/schemaChecker.ts +1 -1
- package/src/feature-libraries/flex-tree/lazyField.ts +6 -8
- package/src/feature-libraries/flex-tree/lazyNode.ts +6 -4
- package/src/feature-libraries/indexing/anchorTreeIndex.ts +2 -1
- package/src/feature-libraries/modular-schema/comparison.ts +7 -5
- package/src/feature-libraries/modular-schema/isNeverTree.ts +6 -4
- package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +4 -4
- package/src/feature-libraries/modular-schema/modularChangeFamily.ts +16 -12
- package/src/feature-libraries/node-key/mockNodeKeyManager.ts +1 -1
- package/src/feature-libraries/object-forest/objectForest.ts +1 -1
- package/src/feature-libraries/schema-index/codec.ts +1 -1
- package/src/feature-libraries/sequence-field/compose.ts +1 -1
- package/src/feature-libraries/sequence-field/invert.ts +1 -1
- package/src/feature-libraries/sequence-field/sequenceFieldCodecV1.ts +1 -1
- package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +1 -1
- package/src/feature-libraries/sequence-field/utils.ts +1 -1
- package/src/feature-libraries/treeCursorUtils.ts +6 -4
- package/src/index.ts +3 -1
- package/src/jsonDomainSchema.ts +129 -0
- package/src/packageVersion.ts +1 -1
- package/src/serializableDomainSchema.ts +121 -0
- package/src/shared-tree/index.ts +0 -1
- package/src/shared-tree/schematizeTree.ts +1 -1
- package/src/shared-tree/sharedTree.ts +31 -41
- package/src/shared-tree/sharedTreeChangeFamily.ts +1 -1
- package/src/shared-tree/treeApiAlpha.ts +12 -4
- package/src/shared-tree/treeCheckout.ts +1 -1
- package/src/shared-tree-core/editManager.ts +85 -47
- package/src/shared-tree-core/resubmitMachine.ts +2 -0
- package/src/shared-tree-core/sharedTreeCore.ts +62 -14
- package/src/simple-tree/api/customTree.ts +3 -3
- package/src/simple-tree/api/schemaCreationUtilities.ts +1 -1
- package/src/simple-tree/api/schemaFactoryRecursive.ts +1 -1
- package/src/simple-tree/api/simpleTreeIndex.ts +3 -3
- package/src/simple-tree/api/tree.ts +1 -1
- package/src/simple-tree/api/treeNodeApi.ts +11 -6
- package/src/simple-tree/api/verboseTree.ts +8 -4
- package/src/simple-tree/api/view.ts +1 -1
- package/src/simple-tree/arrayNode.ts +2 -2
- package/src/simple-tree/core/getOrCreateNode.ts +2 -1
- package/src/simple-tree/core/schemaCaching.ts +1 -1
- package/src/simple-tree/core/treeNodeKernel.ts +9 -6
- package/src/simple-tree/core/unhydratedFlexTree.ts +7 -5
- package/src/simple-tree/objectNode.ts +2 -2
- package/src/simple-tree/proxies.ts +1 -1
- package/src/simple-tree/toMapTree.ts +3 -3
- package/src/simple-tree/toStoredSchema.ts +2 -1
- package/src/simple-tree/treeNodeValid.ts +5 -2
- package/src/util/idAllocator.ts +1 -1
- package/src/util/index.ts +3 -2
- package/src/util/nestedMap.ts +9 -33
- package/src/util/utils.ts +52 -12
|
@@ -184,7 +184,7 @@ export class TreeNodeKernel {
|
|
|
184
184
|
// This can't be cached on this.#hydrated during hydration since initial tree is hydrated before the context is cached on the anchorSet.
|
|
185
185
|
return (
|
|
186
186
|
this.#hydrationState?.anchorNode.anchorSet.slots.get(SimpleContextSlot) ??
|
|
187
|
-
fail(
|
|
187
|
+
fail(0xb40 /* missing simple-tree context */)
|
|
188
188
|
);
|
|
189
189
|
}
|
|
190
190
|
return this.initialContext;
|
|
@@ -303,7 +303,8 @@ export class TreeNodeKernel {
|
|
|
303
303
|
this.#hydrationState.innerNode = flexNode;
|
|
304
304
|
} else {
|
|
305
305
|
// ...otherwise, the flex node must be created
|
|
306
|
-
const context =
|
|
306
|
+
const context =
|
|
307
|
+
anchorNode.anchorSet.slots.get(ContextSlot) ?? fail(0xb41 /* missing context */);
|
|
307
308
|
const cursor = context.checkout.forest.allocateCursor("getFlexNode");
|
|
308
309
|
context.checkout.forest.moveCursorToPath(anchorNode, cursor);
|
|
309
310
|
this.#hydrationState.innerNode = makeTree(context, cursor);
|
|
@@ -332,7 +333,8 @@ export class TreeNodeKernel {
|
|
|
332
333
|
public anchorProxy(anchors: AnchorSet, path: UpPath): AnchorNode {
|
|
333
334
|
assert(!anchorForgetters.has(this.node), 0x91c /* Proxy anchor should not be set twice */);
|
|
334
335
|
const anchor = anchors.track(path);
|
|
335
|
-
const anchorNode =
|
|
336
|
+
const anchorNode =
|
|
337
|
+
anchors.locate(anchor) ?? fail(0xb42 /* Expected anchor node to be present */);
|
|
336
338
|
this.hydrate(anchorNode);
|
|
337
339
|
const forget = (): void => {
|
|
338
340
|
if (anchors.locate(anchor)) {
|
|
@@ -434,9 +436,9 @@ export function getTreeNodeSchemaFromHydratedFlexNode(flexNode: FlexTreeNode): T
|
|
|
434
436
|
|
|
435
437
|
const context =
|
|
436
438
|
flexNode.anchorNode.anchorSet.slots.get(SimpleContextSlot) ??
|
|
437
|
-
fail(
|
|
439
|
+
fail(0xb43 /* Missing SimpleContextSlot */);
|
|
438
440
|
|
|
439
|
-
return context.schema.get(flexNode.schema) ?? fail(
|
|
441
|
+
return context.schema.get(flexNode.schema) ?? fail(0xb44 /* Missing schema */);
|
|
440
442
|
}
|
|
441
443
|
|
|
442
444
|
/**
|
|
@@ -461,7 +463,8 @@ function flexNodeFromAnchor(anchorNode: AnchorNode): FlexTreeNode {
|
|
|
461
463
|
if (flexNode !== undefined) {
|
|
462
464
|
return flexNode; // If it does have a flex node, return it...
|
|
463
465
|
} // ...otherwise, the flex node must be created
|
|
464
|
-
const context =
|
|
466
|
+
const context =
|
|
467
|
+
anchorNode.anchorSet.slots.get(ContextSlot) ?? fail(0xb45 /* missing context */);
|
|
465
468
|
const cursor = context.checkout.forest.allocateCursor("getFlexNode");
|
|
466
469
|
context.checkout.forest.moveCursorToPath(anchorNode, cursor);
|
|
467
470
|
const newFlexNode = makeTree(context, cursor);
|
|
@@ -79,7 +79,9 @@ export class UnhydratedFlexTreeNode implements UnhydratedFlexTreeNode {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
public get storedSchema(): TreeNodeStoredSchema {
|
|
82
|
-
return
|
|
82
|
+
return (
|
|
83
|
+
this.context.schema.nodeSchema.get(this.mapTree.type) ?? fail(0xb46 /* missing schema */)
|
|
84
|
+
);
|
|
83
85
|
}
|
|
84
86
|
|
|
85
87
|
public readonly [flexTreeMarker] = FlexTreeEntityKind.Node as const;
|
|
@@ -215,7 +217,7 @@ export class UnhydratedFlexTreeNode implements UnhydratedFlexTreeNode {
|
|
|
215
217
|
public get anchorNode(): AnchorNode {
|
|
216
218
|
// This API is relevant to `LazyTreeNode`s, but not `UnhydratedFlexTreeNode`s.
|
|
217
219
|
// TODO: Refactor the FlexTreeNode interface so that stubbing this out isn't necessary.
|
|
218
|
-
return fail(
|
|
220
|
+
return fail(0xb47 /* UnhydratedFlexTreeNode does not implement anchorNode */);
|
|
219
221
|
}
|
|
220
222
|
|
|
221
223
|
private walkTree(): void {
|
|
@@ -294,10 +296,10 @@ const unparentedLocation: LocationInField = {
|
|
|
294
296
|
},
|
|
295
297
|
schema: brand(forbiddenFieldKindIdentifier),
|
|
296
298
|
get context(): never {
|
|
297
|
-
return fail(
|
|
299
|
+
return fail(0xb48 /* unsupported */);
|
|
298
300
|
},
|
|
299
301
|
getFieldPath() {
|
|
300
|
-
fail(
|
|
302
|
+
fail(0xb49 /* unsupported */);
|
|
301
303
|
},
|
|
302
304
|
},
|
|
303
305
|
index: -1,
|
|
@@ -489,7 +491,7 @@ export class UnhydratedTreeSequenceField
|
|
|
489
491
|
this.edit((mapTrees) => {
|
|
490
492
|
removed = mapTrees.splice(index, count);
|
|
491
493
|
});
|
|
492
|
-
return removed ?? fail(
|
|
494
|
+
return removed ?? fail(0xb4a /* Expected removed to be set by edit */);
|
|
493
495
|
},
|
|
494
496
|
};
|
|
495
497
|
|
|
@@ -262,7 +262,7 @@ function createProxyHandler(
|
|
|
262
262
|
// For some reason, the getOwnPropertyDescriptor is not passed in the receiver, so use a weak map.
|
|
263
263
|
// If a refactoring is done to associated flex tree data with the target not the proxy, this extra map could be removed,
|
|
264
264
|
// and the design would be more compatible with proxyless nodes.
|
|
265
|
-
const proxy = targetToProxy.get(target) ?? fail(
|
|
265
|
+
const proxy = targetToProxy.get(target) ?? fail(0xadd /* missing proxy */);
|
|
266
266
|
const field = getOrCreateInnerNode(proxy).tryGetField(fieldInfo.storedKey);
|
|
267
267
|
|
|
268
268
|
const p: PropertyDescriptor = {
|
|
@@ -311,7 +311,7 @@ export function setField(
|
|
|
311
311
|
}
|
|
312
312
|
|
|
313
313
|
default:
|
|
314
|
-
fail(
|
|
314
|
+
fail(0xade /* invalid FieldKind */);
|
|
315
315
|
}
|
|
316
316
|
}
|
|
317
317
|
|
|
@@ -196,7 +196,7 @@ function nodeDataToMapTree(
|
|
|
196
196
|
result = objectToMapTree(data, schema);
|
|
197
197
|
break;
|
|
198
198
|
default:
|
|
199
|
-
fail(
|
|
199
|
+
fail(0xae0 /* Unrecognized schema kind */);
|
|
200
200
|
}
|
|
201
201
|
|
|
202
202
|
return result;
|
|
@@ -642,7 +642,7 @@ export function addDefaultsToMapTree(
|
|
|
642
642
|
): void {
|
|
643
643
|
const schema =
|
|
644
644
|
find(normalizeAllowedTypes(allowedTypes), (s) => s.identifier === mapTree.type) ??
|
|
645
|
-
fail(
|
|
645
|
+
fail(0xae1 /* MapTree is incompatible with schema */);
|
|
646
646
|
|
|
647
647
|
if (isObjectNodeSchema(schema)) {
|
|
648
648
|
for (const [_key, fieldInfo] of schema.flexKeyMap) {
|
|
@@ -660,7 +660,7 @@ export function addDefaultsToMapTree(
|
|
|
660
660
|
setFieldValue(mapTree.fields, data, fieldInfo.schema, fieldInfo.storedKey);
|
|
661
661
|
// call addDefaultsToMapTree on newly inserted default values
|
|
662
662
|
for (const child of mapTree.fields.get(fieldInfo.storedKey) ??
|
|
663
|
-
fail(
|
|
663
|
+
fail(0xae2 /* Expected field to be populated */)) {
|
|
664
664
|
addDefaultsToMapTree(child, fieldInfo.schema.allowedTypes, context);
|
|
665
665
|
}
|
|
666
666
|
}
|
|
@@ -71,7 +71,8 @@ export function convertField(schema: ImplicitFieldSchema): TreeFieldStoredSchema
|
|
|
71
71
|
let kind: FieldKindIdentifier;
|
|
72
72
|
let allowedTypes: ImplicitAllowedTypes;
|
|
73
73
|
if (schema instanceof FieldSchema) {
|
|
74
|
-
kind =
|
|
74
|
+
kind =
|
|
75
|
+
convertFieldKind.get(schema.kind)?.identifier ?? fail(0xae3 /* Invalid field kind */);
|
|
75
76
|
allowedTypes = schema.allowedTypes;
|
|
76
77
|
} else {
|
|
77
78
|
kind = FieldKinds.required.identifier;
|
|
@@ -58,7 +58,7 @@ export abstract class TreeNodeValid<TInput> extends TreeNode {
|
|
|
58
58
|
instance: TreeNodeValid<T>,
|
|
59
59
|
input: T,
|
|
60
60
|
): UnhydratedFlexTreeNode {
|
|
61
|
-
return fail(
|
|
61
|
+
return fail(0xae4 /* Schema must override buildRawNode */);
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
/**
|
|
@@ -66,7 +66,7 @@ export abstract class TreeNodeValid<TInput> extends TreeNode {
|
|
|
66
66
|
* This is a good place to perform extra validation and cache schema derived data needed for the implementation of the node.
|
|
67
67
|
*/
|
|
68
68
|
protected static oneTimeSetup<T>(this: typeof TreeNodeValid<T>): Context {
|
|
69
|
-
fail(
|
|
69
|
+
fail(0xae5 /* Missing oneTimeSetup */);
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
/**
|
|
@@ -119,6 +119,9 @@ export abstract class TreeNodeValid<TInput> extends TreeNode {
|
|
|
119
119
|
return this.constructorCached;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
+
// If users trying to diagnose the cause of this error becomes a common issue, more information could be captured.
|
|
123
|
+
// The call stack to when a schema is first marked most derived could be captured in debug builds and stored in the `MostDerivedData` object:
|
|
124
|
+
// This could then be included in the error to aid in debugging this error.
|
|
122
125
|
throw new UsageError(
|
|
123
126
|
`Two schema classes were used (${this.name} and ${
|
|
124
127
|
this.constructorCached.constructor.name
|
package/src/util/idAllocator.ts
CHANGED
|
@@ -44,6 +44,6 @@ export function idAllocatorFromState(state: IdAllocationState): IdAllocator {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
export const fakeIdAllocator: IdAllocator = {
|
|
47
|
-
allocate: () => fail(
|
|
47
|
+
allocate: () => fail(0xae6 /* Should not allocate IDs */),
|
|
48
48
|
getMaxId: () => 0,
|
|
49
49
|
};
|
package/src/util/index.ts
CHANGED
|
@@ -19,8 +19,6 @@ export {
|
|
|
19
19
|
} from "./opaque.js";
|
|
20
20
|
export {
|
|
21
21
|
deleteFromNestedMap,
|
|
22
|
-
getOrAddInMap,
|
|
23
|
-
getOrAddInMapLazy,
|
|
24
22
|
getOrAddInNestedMap,
|
|
25
23
|
getOrDefaultInNestedMap,
|
|
26
24
|
forEachInNestedMap,
|
|
@@ -34,6 +32,7 @@ export {
|
|
|
34
32
|
mapNestedMap,
|
|
35
33
|
nestedMapToFlatList,
|
|
36
34
|
nestedMapFromFlatList,
|
|
35
|
+
getOrCreateInNestedMap,
|
|
37
36
|
} from "./nestedMap.js";
|
|
38
37
|
export { addToNestedSet, type NestedSet, nestedSetContains } from "./nestedSet.js";
|
|
39
38
|
export { type OffsetList, OffsetListFactory } from "./offsetList.js";
|
|
@@ -56,6 +55,7 @@ export type {
|
|
|
56
55
|
export { StackyIterator } from "./stackyIterator.js";
|
|
57
56
|
export {
|
|
58
57
|
asMutable,
|
|
58
|
+
balancedReduce,
|
|
59
59
|
clone,
|
|
60
60
|
compareSets,
|
|
61
61
|
fail,
|
|
@@ -95,6 +95,7 @@ export {
|
|
|
95
95
|
hasSingle,
|
|
96
96
|
defineLazyCachedProperty,
|
|
97
97
|
copyPropertyIfDefined as copyProperty,
|
|
98
|
+
getOrAddInMap,
|
|
98
99
|
} from "./utils.js";
|
|
99
100
|
export { ReferenceCountedBase, type ReferenceCounted } from "./referenceCounting.js";
|
|
100
101
|
|
package/src/util/nestedMap.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import { oob } from "@fluidframework/core-utils/internal";
|
|
7
7
|
|
|
8
|
-
import
|
|
8
|
+
import { getOrAddInMap, getOrCreate } from "./utils.js";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* A dictionary whose values are keyed off of two objects (key1, key2).
|
|
@@ -87,40 +87,16 @@ export function setInNestedMap<Key1, Key2, Value>(
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
/**
|
|
90
|
-
*
|
|
91
|
-
* Returns the value at `key` after setting it.
|
|
92
|
-
* This is equivalent to a get or default that adds the default to the map.
|
|
90
|
+
* {@link getOrCreate} for {@link NestedMap}.
|
|
93
91
|
*/
|
|
94
|
-
export function
|
|
95
|
-
map:
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const currentValue = map.get(key);
|
|
100
|
-
if (currentValue !== undefined) {
|
|
101
|
-
return currentValue;
|
|
102
|
-
}
|
|
103
|
-
map.set(key, value);
|
|
104
|
-
return value;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Sets the value at `key` in `map` to `generateValue()` if not already present.
|
|
109
|
-
* Returns the value at `key` after setting it.
|
|
110
|
-
*/
|
|
111
|
-
export function getOrAddInMapLazy<Key, Value>(
|
|
112
|
-
map: MapGetSet<Key, Value>,
|
|
113
|
-
key: Key,
|
|
114
|
-
generateValue: () => Value,
|
|
92
|
+
export function getOrCreateInNestedMap<Key1, Key2, Value>(
|
|
93
|
+
map: NestedMap<Key1, Key2, Value>,
|
|
94
|
+
key1: Key1,
|
|
95
|
+
key2: Key2,
|
|
96
|
+
defaultValue: (key1: Key1, key2: Key2) => Value,
|
|
115
97
|
): Value {
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
return currentValue;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const value = generateValue();
|
|
122
|
-
map.set(key, value);
|
|
123
|
-
return value;
|
|
98
|
+
const innerMap = getOrAddInMap(map, key1, new Map<Key2, Value>());
|
|
99
|
+
return getOrCreate(innerMap, key2, (): Value => defaultValue(key1, key2));
|
|
124
100
|
}
|
|
125
101
|
|
|
126
102
|
/**
|
package/src/util/utils.ts
CHANGED
|
@@ -47,18 +47,8 @@ export function asMutable<T>(readonly: T): Mutable<T> {
|
|
|
47
47
|
|
|
48
48
|
export const clone = structuredClone;
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
* @remarks
|
|
53
|
-
* Works like {@link @fluidframework/core-utils/internal#assert}.
|
|
54
|
-
*/
|
|
55
|
-
export function fail(message: string | number): never {
|
|
56
|
-
// Declaring this here aliased to a different name avoids the assert tagging objecting to the usages of `assert` below.
|
|
57
|
-
// Since users of `fail` do the assert message tagging instead, suppressing tagging errors here makes sense.
|
|
58
|
-
const assertNoTag: (condition: boolean, message: string | number) => asserts condition =
|
|
59
|
-
assert;
|
|
60
|
-
assertNoTag(false, message);
|
|
61
|
-
}
|
|
50
|
+
// TODO: update usages of this to use @fluidframework/core-utils/internal directly.
|
|
51
|
+
export { fail } from "@fluidframework/core-utils/internal";
|
|
62
52
|
|
|
63
53
|
/**
|
|
64
54
|
* Checks whether or not the given object is a `readonly` array.
|
|
@@ -177,6 +167,24 @@ export function compareSets<T>({
|
|
|
177
167
|
return true;
|
|
178
168
|
}
|
|
179
169
|
|
|
170
|
+
/**
|
|
171
|
+
* Sets the value at `key` in map to value if not already present.
|
|
172
|
+
* Returns the value at `key` after setting it.
|
|
173
|
+
* This is equivalent to a get or default that adds the default to the map.
|
|
174
|
+
*/
|
|
175
|
+
export function getOrAddInMap<Key, Value>(
|
|
176
|
+
map: MapGetSet<Key, Value>,
|
|
177
|
+
key: Key,
|
|
178
|
+
value: Value,
|
|
179
|
+
): Value {
|
|
180
|
+
const currentValue = map.get(key);
|
|
181
|
+
if (currentValue !== undefined) {
|
|
182
|
+
return currentValue;
|
|
183
|
+
}
|
|
184
|
+
map.set(key, value);
|
|
185
|
+
return value;
|
|
186
|
+
}
|
|
187
|
+
|
|
180
188
|
/**
|
|
181
189
|
* Retrieve a value from a map with the given key, or create a new entry if the key is not in the map.
|
|
182
190
|
* @param map - The map to query/update
|
|
@@ -616,3 +624,35 @@ export function copyPropertyIfDefined<
|
|
|
616
624
|
}
|
|
617
625
|
}
|
|
618
626
|
}
|
|
627
|
+
|
|
628
|
+
/**
|
|
629
|
+
* Reduces an array of values into a single value.
|
|
630
|
+
* This is similar to `Array.prototype.reduce`,
|
|
631
|
+
* except that it recursively reduces the left and right halves of the input before reducing their respective reductions.
|
|
632
|
+
*
|
|
633
|
+
* When compared with an approach like reducing all the values left-to-right,
|
|
634
|
+
* this balanced approach is beneficial when the cost of invoking `callbackFn` is proportional to the number reduced values that its parameters collectively represent.
|
|
635
|
+
* For example, if `T` is an array, and `callbackFn` concatenates its inputs,
|
|
636
|
+
* then `balancedReduce` will have O(N*log(N)) time complexity instead of `Array.prototype.reduce`'s O(N²).
|
|
637
|
+
* However, if `callbackFn` is O(1) then both `balancedReduce` and `Array.prototype.reduce` will have O(N) complexity.
|
|
638
|
+
*
|
|
639
|
+
* @param array - The array to reduce.
|
|
640
|
+
* @param callbackFn - The function to execute for each pairwise reduction.
|
|
641
|
+
* @param emptyCase - A factory function that provides the value to return if the input array is empty.
|
|
642
|
+
*/
|
|
643
|
+
export function balancedReduce<T>(
|
|
644
|
+
array: readonly T[],
|
|
645
|
+
callbackFn: (left: T, right: T) => T,
|
|
646
|
+
emptyCase: () => T,
|
|
647
|
+
): T {
|
|
648
|
+
if (hasSingle(array)) {
|
|
649
|
+
return array[0];
|
|
650
|
+
}
|
|
651
|
+
if (!hasSome(array)) {
|
|
652
|
+
return emptyCase();
|
|
653
|
+
}
|
|
654
|
+
const mid = Math.floor(array.length / 2);
|
|
655
|
+
const left = balancedReduce(array.slice(0, mid), callbackFn, emptyCase);
|
|
656
|
+
const right = balancedReduce(array.slice(mid), callbackFn, emptyCase);
|
|
657
|
+
return callbackFn(left, right);
|
|
658
|
+
}
|