doxum 0.1.7 → 0.1.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-DF1q9Gje.js","names":["schemaRoot","address","readAddress","isRecord","anchor.keys","target.bucket","target.belongs","target.same"],"sources":["../core/src/schema.ts","../core/src/address.ts","../core/src/impact-target.ts","../core/src/runtime/contract.ts","../core/src/mutation/anchor.ts","../core/src/access/reader.ts","../core/src/mutation/footprint.ts","../core/src/runtime/access.ts","../core/src/runtime/notification.ts","../core/src/projection/contract.ts","../core/src/projection/scheduler.ts","../core/src/projection/node.ts","../core/src/projection/collection.ts","../core/src/projection/source.ts","../core/src/projection/value.ts","../core/src/projection/runtime.ts"],"sourcesContent":["export type DocumentAddress = readonly string[];\n\nexport type DocumentListConfig<TItem> = {\n readonly keyOf: (item: TItem) => string;\n};\nexport type DocumentTreeNode<TValue> = {\n readonly parentId?: string;\n readonly children: readonly string[];\n readonly value?: TValue;\n};\nexport type DocumentTreeValue<TValue> = {\n readonly rootId?: string;\n readonly nodes: Readonly<Record<string, DocumentTreeNode<TValue>>>;\n};\n\ntype BaseNode<K extends string> = {\n readonly kind: K;\n readonly optional?: boolean;\n};\nexport type FieldNode<T, Optional extends boolean = false> = BaseNode<'field'> & {\n readonly __value?: T;\n} & (Optional extends true ? { readonly optional: true } : { readonly optional?: false });\n/** A node with optional presence. The marker replaces, rather than intersects, a field marker. */\nexport type OptionalNode<TNode extends DocumentNode> =\n TNode extends FieldNode<infer TValue, boolean>\n ? FieldNode<TValue, true>\n : TNode & { readonly optional: true };\nexport interface ObjectShape {\n readonly [key: string]: DocumentNode;\n}\nexport type ObjectNode<TShape extends ObjectShape> = BaseNode<'object'> & {\n readonly shape: TShape;\n};\nexport interface VariantShape {\n readonly [key: string]: ObjectNode<ObjectShape>;\n}\nexport type VariantNode<\n TTag extends string,\n TVariants extends VariantShape,\n> = BaseNode<'variant'> & {\n readonly tag: TTag;\n readonly variants: TVariants;\n};\nexport type TableNode<TValue extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>> =\n BaseNode<'table'> & {\n readonly value: TValue;\n };\nexport type MapNode<TValue extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>> =\n BaseNode<'map'> & {\n readonly value: TValue;\n };\nexport type DictNode<TKey extends string, TValue> = BaseNode<'dict'> & {\n readonly __key?: TKey;\n readonly __value?: TValue;\n};\nexport type ListNode<TItem> = BaseNode<'list'> & {\n readonly __item?: TItem;\n keyOf(item: TItem): string;\n};\nexport type TreeNode<TValue> = BaseNode<'tree'> & {\n readonly __value?: TValue;\n};\n\nexport type DocumentNode =\n | FieldNode<unknown, false>\n | FieldNode<unknown, true>\n | ObjectNode<ObjectShape>\n | VariantNode<string, VariantShape>\n | TableNode<ObjectNode<ObjectShape> | VariantNode<string, VariantShape>>\n | MapNode<ObjectNode<ObjectShape> | VariantNode<string, VariantShape>>\n | DictNode<string, unknown>\n | ListNode<unknown>\n | TreeNode<unknown>;\n\ntype EntityValue<N extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>> =\n N extends ObjectNode<infer S>\n ? DocumentValueOfShape<S>\n : N extends VariantNode<infer T, infer V>\n ? {\n [K in keyof V & string]: { [P in T]: K } & DocumentValueOfShape<\n V[K] extends ObjectNode<infer S> ? S : never\n >;\n }[keyof V & string]\n : never;\n\nexport type DocumentValueOfNode<N> =\n N extends FieldNode<infer T, infer O>\n ? O extends true\n ? T | undefined\n : T\n : N extends ObjectNode<infer S>\n ? DocumentValueOfShape<S>\n : N extends VariantNode<infer T, infer V>\n ? EntityValue<VariantNode<T, V>>\n : N extends TableNode<infer V>\n ? {\n readonly ids: readonly string[];\n readonly byId: Readonly<Record<string, EntityValue<V>>>;\n }\n : N extends MapNode<infer V>\n ? Readonly<Record<string, EntityValue<V>>>\n : N extends DictNode<infer K, infer T>\n ? Readonly<Partial<Record<K, T>>>\n : N extends ListNode<infer I>\n ? readonly I[]\n : N extends TreeNode<infer T>\n ? DocumentTreeValue<T>\n : never;\n\ntype OptionalKeys<S extends ObjectShape> = {\n [K in keyof S]: S[K] extends { readonly optional: true } ? K : never;\n}[keyof S];\ntype RequiredKeys<S extends ObjectShape> = Exclude<keyof S, OptionalKeys<S>>;\nexport type DocumentValueOfShape<S extends ObjectShape> = {\n readonly [K in RequiredKeys<S>]: DocumentValueOfNode<S[K]>;\n} & { readonly [K in OptionalKeys<S>]?: DocumentValueOfNode<S[K]> };\nexport type ReadonlyDocument<S extends DocumentSchema> = DocumentValueOfShape<S['shape']>;\n\nexport type EntitySchemaNode = ObjectNode<ObjectShape> | VariantNode<string, VariantShape>;\n\nexport type CollectionSelector<\n TId extends string = string,\n TNode extends EntitySchemaNode = EntitySchemaNode,\n> = {\n readonly kind: 'collection';\n readonly schema: DocumentSchema;\n readonly address: DocumentAddress;\n readonly __id?: TId;\n /** Compile-time entry schema carried by schema selectors. */\n readonly __node?: TNode;\n};\nexport type ValueSelector<TResult = unknown> = {\n readonly kind: 'value';\n readonly schema: DocumentSchema;\n readonly address: DocumentAddress;\n readonly __value?: TResult;\n};\nexport type ImpactTarget<T = unknown> =\n | { readonly kind: 'value'; readonly at: DocumentAddress }\n | ValueSelector<T>\n | {\n readonly kind: 'collection';\n readonly at: DocumentAddress;\n readonly id?: string;\n }\n | CollectionSelector<string>;\ndeclare const pathValue: unique symbol;\ndeclare const collectionNode: unique symbol;\ntype PathMarker<TValue> = { readonly [pathValue]: TValue };\n\ntype SchemaPathFor<S extends ObjectShape = ObjectShape, TValue = unknown> = {\n readonly [K in keyof S]: PathValue<S[K]>;\n} & PathMarker<TValue>;\n\nexport type DocumentSchema<TShape extends ObjectShape = {}> = {\n readonly kind: 'schema';\n readonly shape: TShape;\n collection<TPath extends CollectionPath>(\n pick: (path: SchemaPath<TShape>) => TPath\n ): CollectionSelector<CollectionId<TPath>, CollectionNode<TPath>>;\n value<TPath extends PathMarker<unknown>>(\n pick: (path: SchemaPath<TShape>) => TPath\n ): ValueSelector<PathValueResult<TPath>>;\n};\n\nexport type SchemaPath<S extends ObjectShape = {}> = SchemaPathFor<S, DocumentValueOfShape<S>>;\n\ntype VariantKeys<V extends VariantShape> = {\n [K in keyof V & string]: keyof (V[K] extends ObjectNode<infer S> ? S : {});\n}[keyof V & string] &\n string;\ntype VariantFieldPath<V extends VariantShape, K extends string> = {\n [P in keyof V & string]: V[P] extends ObjectNode<infer S>\n ? K extends keyof S\n ? PathValue<S[K]>\n : never\n : never;\n}[keyof V & string];\ntype VariantPath<T extends string, V extends VariantShape> = {\n readonly [K in VariantKeys<V>]: VariantFieldPath<V, K>;\n} & { readonly [K in T]: PathMarker<keyof V & string> } & PathMarker<\n EntityValue<VariantNode<T, V>>\n >;\ntype PathNodeValue<N extends DocumentNode> = N extends { readonly optional: true }\n ? DocumentValueOfNode<N> | undefined\n : DocumentValueOfNode<N>;\ntype EntityPath<N extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>> =\n N extends ObjectNode<infer S>\n ? SchemaPathFor<S, PathNodeValue<N>>\n : N extends VariantNode<infer T, infer V>\n ? VariantPath<T, V>\n : never;\nexport type CollectionPath<\n N extends EntitySchemaNode = EntitySchemaNode,\n TValue = unknown,\n> = PathMarker<TValue> & {\n readonly item: (id: string) => EntityPath<N>;\n readonly [collectionNode]: N;\n};\n\ntype PathValue<N extends DocumentNode> =\n N extends ObjectNode<infer S>\n ? SchemaPathFor<S, PathNodeValue<N>>\n : N extends VariantNode<infer TTag, infer V>\n ? VariantPath<TTag, V>\n : N extends TableNode<infer V> | MapNode<infer V>\n ? CollectionPath<V, PathNodeValue<N>>\n : PathMarker<PathNodeValue<N>>;\ntype CollectionInfo<T> = T extends {\n readonly [collectionNode]: infer TNode extends EntitySchemaNode;\n}\n ? { readonly id: string; readonly node: TNode }\n : never;\ntype CollectionId<T> =\n CollectionInfo<T> extends { readonly id: infer TId extends string } ? TId : string;\nexport type CollectionNode<T> =\n CollectionInfo<T> extends { readonly node: infer TNode extends EntitySchemaNode }\n ? TNode\n : EntitySchemaNode;\ntype PathValueResult<T> = T extends PathMarker<infer TValue> ? TValue : unknown;\n\nconst node = <T extends DocumentNode>(value: T): T => Object.freeze(value);\nexport const field = <T>(): FieldNode<T> => node({ kind: 'field' });\ntype OptionalLeaf =\n | FieldNode<unknown, boolean>\n | VariantNode<string, VariantShape>\n | DictNode<string, unknown>\n | ListNode<unknown>\n | TreeNode<unknown>;\nexport const optional = <T extends OptionalLeaf>(value: T): OptionalNode<T> => {\n if (!['field', 'variant', 'dict', 'list', 'tree'].includes(value.kind))\n throw new TypeError(\n 'Only field, variant, dict, list and tree nodes support optional presence.'\n );\n return node({ ...value, optional: true } as OptionalNode<T>);\n};\nexport const object = <S extends ObjectShape>(shape: S): ObjectNode<S> =>\n node({ kind: 'object', shape });\nexport const variant = <T extends string, V extends VariantShape>(\n tag: T,\n variants: V\n): VariantNode<T, V> => node({ kind: 'variant', tag, variants });\nexport const table = <V extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>>(\n value: V\n): TableNode<V> => node({ kind: 'table', value });\nexport const map = <V extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>>(\n value: V\n): MapNode<V> => node({ kind: 'map', value });\nexport const dict = <TKey extends string = string, TValue = unknown>(): DictNode<TKey, TValue> =>\n node({ kind: 'dict' });\nexport const list = <TItem>(config: DocumentListConfig<TItem>): ListNode<TItem> =>\n ({ kind: 'list', keyOf: config.keyOf }) as ListNode<TItem>;\nexport const tree = <TValue = unknown>(): TreeNode<TValue> => node({ kind: 'tree' });\n\nconst paths = new WeakMap<\n object,\n {\n readonly address: DocumentAddress;\n readonly nodes: readonly DocumentNode[];\n readonly owner: object;\n }\n>();\nconst collectionSchemas = new WeakMap<\n object,\n TableNode<EntitySchemaNode> | MapNode<EntitySchemaNode>\n>();\nexport const collectionSchema = (\n selector: CollectionSelector\n): TableNode<EntitySchemaNode> | MapNode<EntitySchemaNode> => {\n const node = collectionSchemas.get(selector);\n if (!node) throw new TypeError('Expected a schema-owned collection selector.');\n return node;\n};\n\nconst pathProxy = (\n nodes: readonly DocumentNode[],\n address: DocumentAddress,\n owner: object\n): object => {\n const proxy = new Proxy(\n {},\n {\n get: (_target, property: string | symbol) => {\n if (typeof property !== 'string') return undefined;\n const collection = nodes.every(node => node.kind === 'table' || node.kind === 'map');\n if (collection && property === 'item')\n return (id: string) => {\n if (typeof id !== 'string') throw new TypeError('Collection keys must be strings.');\n return pathProxy(\n nodes.map(node => (node as TableNode<EntitySchemaNode>).value),\n [...address, id],\n owner\n );\n };\n const children = nodes.flatMap(node => {\n if (node.kind === 'object') return node.shape[property] ? [node.shape[property]] : [];\n if (node.kind !== 'variant') return [];\n if (property === node.tag) return [field<string>()];\n return Object.values(node.variants).flatMap(branch =>\n branch.shape[property] ? [branch.shape[property]] : []\n );\n });\n if (!children.length) throw new TypeError(`Invalid schema path segment: ${property}`);\n return pathProxy(children, [...address, property], owner);\n },\n }\n );\n paths.set(proxy, { nodes, address, owner });\n return proxy;\n};\n\nconst select = <S extends ObjectShape>(\n owner: DocumentSchema<S>,\n kind: 'collection' | 'value',\n pick: (path: SchemaPath<S>) => unknown\n): CollectionSelector | ValueSelector => {\n const scope = {};\n const value = pick(pathProxy([object(owner.shape)], [], scope) as SchemaPath<S>);\n const selected = typeof value === 'object' && value !== null ? paths.get(value) : undefined;\n if (!selected || selected.owner !== scope)\n throw new TypeError('Selector must return a path from its callback.');\n if (\n kind === 'collection' &&\n !selected.nodes.every(node => node.kind === 'table' || node.kind === 'map')\n )\n throw new TypeError('Collection selectors require a table or map path.');\n const result = Object.freeze({\n kind,\n schema: owner,\n address: Object.freeze([...selected.address]),\n }) as CollectionSelector | ValueSelector;\n if (kind === 'collection')\n collectionSchemas.set(\n result,\n selected.nodes[0] as TableNode<EntitySchemaNode> | MapNode<EntitySchemaNode>\n );\n return result;\n};\n\nexport const schema = <S extends ObjectShape>(shape: S): DocumentSchema<S> => {\n const result: DocumentSchema<S> = {\n kind: 'schema',\n shape,\n collection: <TPath extends CollectionPath>(pick: (path: SchemaPath<S>) => TPath) =>\n select(result, 'collection', pick) as CollectionSelector<\n CollectionId<TPath>,\n CollectionNode<TPath>\n >,\n value: <TPath extends PathMarker<unknown>>(pick: (path: SchemaPath<S>) => TPath) =>\n select(result, 'value', pick) as ValueSelector<PathValueResult<TPath>>,\n };\n return Object.freeze(result);\n};\n","import type { DocumentAddress, DocumentNode, DocumentSchema, ObjectShape } from './schema';\nimport { profile } from './profile';\n\n/** The only resolved address representation used inside the runtime. */\nexport type AddressRef = {\n readonly path: number;\n readonly address: DocumentAddress;\n};\n\ntype RegistryNode = {\n readonly static: Map<string, RegistryNode>;\n dynamic?: RegistryNode;\n path?: number;\n};\n\ntype Registry = {\n readonly root: RegistryNode;\n nextPath: number;\n};\n\nconst registries = new WeakMap<object, Registry>();\nconst registryNode = (): RegistryNode => ({ static: new Map() });\nconst registryFor = (schema: DocumentSchema): Registry => {\n const cached = registries.get(schema as object);\n if (cached) return cached;\n const registry: Registry = { root: registryNode(), nextPath: 0 };\n registries.set(schema as object, registry);\n return registry;\n};\n\nconst hashText = (value: string, seed: number): number => {\n let hash = seed;\n for (let index = 0; index < value.length; index += 1)\n hash = Math.imul(hash ^ value.charCodeAt(index), 16_777_619);\n return hash >>> 0;\n};\n\nconst appendAddressHash = (hash: number, segment: string): number =>\n hashText(segment, hashText('/', hash));\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst variantNode = (\n node: Extract<DocumentNode, { kind: 'variant' }>,\n value: unknown\n): DocumentNode | undefined => {\n const tag = isRecord(value) && typeof value[node.tag] === 'string' ? value[node.tag] : undefined;\n return node.variants[String(tag ?? Object.keys(node.variants)[0] ?? '')];\n};\n\nconst schemaRoot = (schema: DocumentSchema): DocumentNode => ({\n kind: 'object',\n shape: schema.shape,\n});\n\ntype Step = {\n readonly node: DocumentNode | undefined;\n readonly dynamic: boolean;\n};\n\nconst step = (nodeInput: DocumentNode | undefined, value: unknown, segment: string): Step => {\n let node = nodeInput;\n if (!node) return { node: undefined, dynamic: false };\n if (node.kind === 'variant') {\n node = variantNode(node, value);\n }\n if (!node) return { node: undefined, dynamic: false };\n if (node.kind === 'object') return { node: node.shape[segment], dynamic: false };\n if (node.kind === 'table' || node.kind === 'map') return { node: node.value, dynamic: true };\n // These nodes use operation-specific keys rather than address segments, but\n // accepting a dynamic step keeps address resolution total for user targets.\n if (node.kind === 'dict' || node.kind === 'list' || node.kind === 'tree')\n return { node, dynamic: true };\n return { node: undefined, dynamic: false };\n};\n\nconst pathFor = (\n schema: DocumentSchema,\n address: DocumentAddress,\n document?: unknown\n): number | undefined => {\n const registry = registryFor(schema);\n let trie = registry.root;\n let node: DocumentNode | undefined = schemaRoot(schema);\n let value: unknown = document;\n for (const segment of address) {\n profile.address.schemaStep();\n profile.address.documentStep();\n const resolved = step(node, value, segment);\n if (!resolved.node) return undefined;\n const next = resolved.dynamic\n ? (trie.dynamic ??= registryNode())\n : (() => {\n const existing = trie.static.get(segment);\n if (existing) return existing;\n const created = registryNode();\n trie.static.set(segment, created);\n return created;\n })();\n trie = next;\n node = resolved.node;\n value = readSegment(value, segment);\n }\n if (trie.path === undefined) trie.path = registry.nextPath++;\n return trie.path;\n};\n\nexport const resolveAddress = (\n schema: DocumentSchema,\n address: DocumentAddress,\n document?: unknown\n): AddressRef | undefined => {\n if (!Array.isArray(address)) return undefined;\n for (const segment of address) if (typeof segment !== 'string') return undefined;\n profile.address.arrayCopied();\n const owned = Object.freeze(address.slice()) as DocumentAddress;\n const path = pathFor(schema, owned, document);\n return path === undefined ? undefined : { path, address: owned };\n};\n\nexport const nodeAt = (\n schema: DocumentSchema,\n address: DocumentAddress,\n document?: unknown\n): DocumentNode | undefined => {\n let node: DocumentNode | undefined = schemaRoot(schema);\n let value = document;\n for (const segment of address) {\n const resolved = step(node, value, segment);\n node = resolved.node;\n value = readSegment(value, segment);\n if (!node) return undefined;\n }\n return node;\n};\n\nexport const readSegment = (value: unknown, segment: string): unknown => {\n if (!isRecord(value) && !Array.isArray(value)) return undefined;\n if (isRecord(value) && 'byId' in value && isRecord(value.byId)) {\n const entity = value.byId[segment];\n if (entity !== undefined || Object.prototype.hasOwnProperty.call(value.byId, segment))\n return entity;\n }\n return (value as Record<string, unknown>)[segment];\n};\n\nexport const read = (root: unknown, address: DocumentAddress): unknown => {\n let value = root;\n for (const segment of address) {\n value = readSegment(value, segment);\n if (value === undefined) return undefined;\n }\n return value;\n};\n\nexport type Located = {\n readonly parent: Record<string, unknown> | unknown[];\n readonly key: string | number;\n readonly value: unknown;\n};\n\ntype ResolvedCollection = {\n readonly address: DocumentAddress;\n readonly addressHash: number;\n readonly id: string;\n readonly parent?: ResolvedCollection;\n};\n\nexport type ResolvedAddress = Located & {\n readonly addressHash: number;\n readonly node: DocumentNode;\n readonly collection?: ResolvedCollection;\n};\n\n/** Resolves schema and document location in one address traversal. */\nexport const resolveLocated = (\n schema: DocumentSchema,\n root: unknown,\n address: DocumentAddress\n): ResolvedAddress | undefined => {\n if (address.length === 0) return undefined;\n let node: DocumentNode | undefined = schemaRoot(schema);\n let current: unknown = root;\n let collection: ResolvedCollection | undefined;\n let addressHash = 2_166_136_261;\n for (let index = 0; index < address.length - 1; index += 1) {\n profile.address.schemaStep();\n profile.address.documentStep();\n const resolved = step(node, current, address[index]);\n if (!resolved.node) return undefined;\n if (node?.kind === 'table' || node?.kind === 'map')\n collection = {\n address: address.slice(0, index),\n addressHash,\n id: address[index],\n ...(collection ? { parent: collection } : {}),\n };\n addressHash = appendAddressHash(addressHash, address[index]);\n node = resolved.node;\n current = readSegment(current, address[index]);\n if (!node) return undefined;\n }\n profile.address.schemaStep();\n profile.address.documentStep();\n const last = address[address.length - 1];\n const resolved = step(node, current, last);\n if (!resolved.node || (!isRecord(current) && !Array.isArray(current))) return undefined;\n if (node?.kind === 'table' || node?.kind === 'map')\n collection = {\n address: address.slice(0, -1),\n addressHash,\n id: last,\n ...(collection ? { parent: collection } : {}),\n };\n addressHash = appendAddressHash(addressHash, last);\n if (isRecord(current) && 'byId' in current && isRecord(current.byId) && last in current.byId)\n return {\n addressHash,\n node: resolved.node,\n parent: current.byId,\n key: last,\n value: current.byId[last],\n ...(collection ? { collection } : {}),\n };\n return {\n addressHash,\n node: resolved.node,\n parent: current,\n key: Array.isArray(current) && /^\\d+$/.test(last) ? Number(last) : last,\n value: readSegment(current, last),\n ...(collection ? { collection } : {}),\n };\n};\n\nexport const locate = (root: unknown, address: DocumentAddress): Located | undefined => {\n if (address.length === 0) return undefined;\n let current: unknown = root;\n for (let index = 0; index < address.length - 1; index += 1)\n current = readSegment(current, address[index]);\n if (!isRecord(current) && !Array.isArray(current)) return undefined;\n const last = address[address.length - 1];\n if (isRecord(current) && 'byId' in current && isRecord(current.byId) && last in current.byId)\n return { parent: current.byId, key: last, value: current.byId[last] };\n return {\n parent: current,\n key: Array.isArray(current) && /^\\d+$/.test(last) ? Number(last) : last,\n value: readSegment(current, last),\n };\n};\n\nexport const set = (root: unknown, address: DocumentAddress, value: unknown): boolean => {\n const target = locate(root, address);\n if (!target) return false;\n (target.parent as Record<string | number, unknown>)[target.key] = value;\n return true;\n};\n\nexport const remove = (root: unknown, address: DocumentAddress): boolean => {\n const target = locate(root, address);\n if (!target || !Object.prototype.hasOwnProperty.call(target.parent, target.key)) return false;\n if (Array.isArray(target.parent)) target.parent.splice(Number(target.key), 1);\n else delete target.parent[String(target.key)];\n return true;\n};\n\nexport const contains = (parent: DocumentAddress, child: DocumentAddress): boolean => {\n profile.address.prefixComparison();\n if (parent.length > child.length) return false;\n for (let index = 0; index < parent.length; index += 1) {\n profile.address.segmentCompared();\n if (parent[index] !== child[index]) return false;\n }\n return true;\n};\n\nexport const overlaps = (a: DocumentAddress, b: DocumentAddress): boolean =>\n contains(a, b) || contains(b, a);\n\nexport const debugKey = (address: DocumentAddress): string => {\n let result = '';\n for (let index = 0; index < address.length; index += 1) {\n if (index > 0) result += '/';\n result += address[index].replaceAll('~', '~~').replaceAll('/', '~/');\n }\n return result;\n};\n\nexport const same = (a: AddressRef, b: AddressRef): boolean => {\n if (a.path !== b.path || a.address.length !== b.address.length) return false;\n for (let index = 0; index < a.address.length; index += 1) {\n profile.address.segmentCompared();\n if (a.address[index] !== b.address[index]) return false;\n }\n return true;\n};\n\nexport type { DocumentAddress } from './schema';\n","import type { DocumentAddress, DocumentSchema, ImpactTarget } from './schema';\n\nexport const address = (target: ImpactTarget<unknown>): DocumentAddress =>\n 'at' in target ? target.at : target.address;\n\nexport const id = (target: ImpactTarget<unknown>): string | undefined =>\n target.kind === 'collection' && 'id' in target ? target.id : undefined;\n\nexport const belongs = (target: ImpactTarget<unknown>, schema: DocumentSchema): boolean =>\n !('schema' in target) || target.schema === schema;\n\nexport const same = (left: ImpactTarget<unknown>, right: ImpactTarget<unknown>): boolean => {\n if (left.kind !== right.kind) return false;\n if ('schema' in left && 'schema' in right && left.schema !== right.schema) return false;\n const leftAddress = address(left);\n const rightAddress = address(right);\n if (leftAddress.length !== rightAddress.length) return false;\n for (let index = 0; index < leftAddress.length; index += 1)\n if (leftAddress[index] !== rightAddress[index]) return false;\n return left.kind !== 'collection' || id(left) === id(right);\n};\n\nexport const bucket = (target: ImpactTarget<unknown>): string | undefined => address(target)[0];\n","import type { DocumentAddress, DocumentSchema, ImpactTarget, ReadonlyDocument } from '../schema';\nimport type { AddressRef } from '../address';\nimport type { DocumentOperation } from '../operations';\nimport type { DocumentImpact } from '../impact';\nimport type { DocumentReader } from '../access/reader';\nimport type { DocumentWriter } from '../access/writer';\nimport type { MutationIssue } from '../mutation/issue';\nimport type { CommandFootprint } from '../mutation/footprint';\nimport type { Readable } from '../projection/readable';\n\nexport type Unsubscribe = () => void;\nexport type Synchronous<T> = T extends PromiseLike<unknown> ? never : T;\nexport type CommitSource = 'local' | 'system' | 'history' | 'remote';\n\nexport class DocumentReentrancyError extends Error {\n constructor() {\n super('Document writes cannot be re-entered during an update or notification.');\n this.name = 'DocumentReentrancyError';\n }\n}\n\nexport class DocumentDisposedError extends Error {\n constructor() {\n super('Doxum runtime has been disposed.');\n this.name = 'DocumentDisposedError';\n }\n}\nexport type DocumentCommit<TSchema extends DocumentSchema> = {\n readonly revision: number;\n readonly kind: 'operations' | 'replace';\n readonly source: CommitSource;\n readonly operations: readonly DocumentOperation[];\n readonly inverse: readonly DocumentOperation[];\n readonly impact: DocumentImpact<TSchema>;\n};\nexport type DiagnosticInput = {\n readonly code: string;\n readonly message: string;\n readonly address?: DocumentAddress;\n};\nexport type DocumentDiagnostic = DiagnosticInput & { readonly source: 'application' };\nexport type DocumentProblem = DocumentDiagnostic | MutationIssue;\nexport type ObserverError = {\n readonly phase: 'processor' | 'flush' | 'listener';\n readonly error: unknown;\n};\nexport type TransactionResult<TValue, TCommit> =\n | {\n readonly status: 'committed';\n readonly value: TValue;\n readonly commit: TCommit;\n readonly reports: readonly DocumentDiagnostic[];\n readonly observerErrors: readonly ObserverError[];\n }\n | {\n readonly status: 'unchanged';\n readonly value: TValue;\n readonly revision: number;\n readonly reports: readonly DocumentDiagnostic[];\n }\n | {\n readonly status: 'rejected';\n readonly issues: readonly DocumentProblem[];\n readonly revision: number;\n };\nexport type PreparedUpdateResult<TValue, TSchema extends DocumentSchema> =\n | {\n readonly status: 'prepared';\n readonly value: TValue;\n readonly operations: readonly DocumentOperation[];\n readonly inverse: readonly DocumentOperation[];\n readonly impact: DocumentImpact<TSchema>;\n readonly footprint: CommandFootprint;\n readonly reports: readonly DocumentDiagnostic[];\n }\n | {\n readonly status: 'unchanged';\n readonly value: TValue;\n readonly reports: readonly DocumentDiagnostic[];\n }\n | {\n readonly status: 'rejected';\n readonly issues: readonly DocumentProblem[];\n };\nexport type OperationResult<TCommit> =\n | {\n readonly status: 'committed';\n readonly commit: TCommit;\n readonly observerErrors: readonly ObserverError[];\n }\n | { readonly status: 'unchanged'; readonly revision: number }\n | {\n readonly status: 'rejected';\n readonly issues: readonly MutationIssue[];\n readonly revision: number;\n };\n\nexport type HistoryState = {\n readonly undoDepth: number;\n readonly redoDepth: number;\n};\nexport type LocalHistory<TCommit> = Readable<HistoryState> & {\n undo(): OperationResult<TCommit>;\n redo(): OperationResult<TCommit>;\n clear(): void;\n group(): { end(): void; cancel(): OperationResult<TCommit> };\n};\n\nexport type DocumentTransaction<TSchema extends DocumentSchema> = {\n readonly read: DocumentReader<TSchema>;\n readonly write: DocumentWriter<TSchema>;\n readonly reject: (issue: DiagnosticInput | readonly DiagnosticInput[]) => never;\n readonly report: (issue: DiagnosticInput) => void;\n};\nexport type CommitListener<TSchema extends DocumentSchema> = (\n commit: DocumentCommit<TSchema>\n) => void;\n\nexport type DocumentReadable<TSchema extends DocumentSchema> = {\n readonly address: {\n readonly resolve: (address: DocumentAddress) => AddressRef | undefined;\n readonly read: (address: DocumentAddress) => unknown;\n readonly contains: (parent: DocumentAddress, child: DocumentAddress) => boolean;\n readonly overlaps: (left: DocumentAddress, right: DocumentAddress) => boolean;\n readonly debugKey: (address: DocumentAddress) => string;\n };\n revision(): number;\n subscribe(listener: CommitListener<TSchema>): Unsubscribe;\n subscribe(\n target: ImpactTarget<unknown> | readonly [ImpactTarget<unknown>, ...ImpactTarget<unknown>[]],\n listener: CommitListener<TSchema>\n ): Unsubscribe;\n};\n\nexport type DocumentRuntime<TSchema extends DocumentSchema> = DocumentReadable<TSchema> & {\n /** Schema configuration captured when this runtime was created. */\n readonly schema: TSchema;\n update<TResult>(\n run: (transaction: DocumentTransaction<TSchema>) => Synchronous<TResult>,\n options?: {\n readonly source?: Extract<CommitSource, 'local' | 'system'>;\n readonly history?: boolean;\n }\n ): TransactionResult<TResult, DocumentCommit<TSchema>>;\n prepare<TResult>(\n run: (transaction: DocumentTransaction<TSchema>) => Synchronous<TResult>\n ): PreparedUpdateResult<TResult, TSchema>;\n apply(\n operations: unknown,\n options?: {\n readonly source?: Exclude<CommitSource, 'history'>;\n readonly history?: boolean;\n }\n ): OperationResult<DocumentCommit<TSchema>>;\n replace(\n document: ReadonlyDocument<TSchema>,\n options?: { readonly source?: Extract<CommitSource, 'system' | 'remote'> }\n ): OperationResult<DocumentCommit<TSchema>>;\n snapshot(): ReadonlyDocument<TSchema>;\n readonly history: LocalHistory<DocumentCommit<TSchema>>;\n dispose(): void;\n};\n","import type { DocumentAnchor } from '../operations';\n\nexport type KeyOrder = {\n readonly length: number;\n readonly at: (index: number) => string | undefined;\n readonly index: (key: string) => number;\n};\n\ntype Keys = readonly string[] | KeyOrder;\n\nconst length = (keys: Keys): number => keys.length;\nconst keyAt = (keys: Keys, index: number): string | undefined =>\n Array.isArray(keys) ? keys[index] : keys.at(index);\nconst keyIndex = (keys: Keys, key: string): number =>\n Array.isArray(keys) ? keys.indexOf(key) : (keys as KeyOrder).index(key);\n\nexport const keys = (values: readonly unknown[], keyOf: (value: unknown) => string): KeyOrder => ({\n length: values.length,\n at: index => (index >= 0 && index < values.length ? keyOf(values[index]) : undefined),\n index: key => {\n for (let index = 0; index < values.length; index += 1)\n if (keyOf(values[index]) === key) return index;\n return -1;\n },\n});\n\nexport const index = (keys: Keys, anchor?: DocumentAnchor): number => {\n if (!anchor) return length(keys);\n if ('at' in anchor) return anchor.at === 'start' ? 0 : length(keys);\n if ('before' in anchor) return keyIndex(keys, anchor.before);\n return keyIndex(keys, anchor.after) + 1;\n};\n\nexport const at = (keys: Keys, position: number): DocumentAnchor =>\n position <= 0 ? { at: 'start' } : { after: keyAt(keys, position - 1) as string };\n\nexport const valid = (keys: Keys, anchor?: DocumentAnchor): boolean => {\n if (!anchor) return true;\n if (typeof anchor !== 'object' || anchor === null) return false;\n if (Number('at' in anchor) + Number('before' in anchor) + Number('after' in anchor) !== 1)\n return false;\n if ('at' in anchor) return anchor.at === 'start' || anchor.at === 'end';\n return keyIndex(keys, 'before' in anchor ? anchor.before : anchor.after) >= 0;\n};\n\nexport const afterRemove = (keys: Keys, removedIndex: number, anchor?: DocumentAnchor): number => {\n const position = index(keys, anchor);\n return position > removedIndex ? position - 1 : position;\n};\n\nexport const validPositions = (length: number, positions: readonly number[]): boolean => {\n let previous = -1;\n for (let index = 0; index < positions.length; index += 1) {\n const position = positions[index];\n if (\n !Number.isInteger(position) ||\n position < 0 ||\n position <= previous ||\n position > length + index\n )\n return false;\n previous = position;\n }\n return true;\n};\n\nexport const restore = (\n keys: string[],\n inserted: readonly string[],\n positions: readonly number[]\n): void => {\n const currentLength = keys.length;\n if (inserted.length !== positions.length || !validPositions(currentLength, positions))\n throw new Error('Ordered restore positions are invalid.');\n let readIndex = currentLength - 1;\n let insertedIndex = inserted.length - 1;\n keys.length = currentLength + inserted.length;\n for (let writeIndex = keys.length - 1; writeIndex >= 0; writeIndex -= 1) {\n if (insertedIndex >= 0 && positions[insertedIndex] === writeIndex) {\n keys[writeIndex] = inserted[insertedIndex];\n insertedIndex -= 1;\n } else {\n keys[writeIndex] = keys[readIndex];\n readIndex -= 1;\n }\n }\n};\n","import { object } from '../schema';\nimport type {\n DictNode,\n DocumentAddress,\n DocumentNode,\n DocumentSchema,\n DocumentValueOfNode,\n EntitySchemaNode,\n ImpactTarget,\n ListNode,\n MapNode,\n ObjectNode,\n ReadonlyDocument,\n TableNode,\n TreeNode,\n VariantNode,\n} from '../schema';\nimport { read as readAddress } from '../address';\nimport { cloneValue, isRecord } from '../value/ownership';\nimport { profile } from '../profile';\nimport type { DependencyTracker } from './dependency';\nimport * as anchor from '../mutation/anchor';\n\nexport type FieldReader<T> = { readonly get: () => T };\nexport type DictionaryReader<K extends string, V> = {\n get(key: K): V | undefined;\n has(key: K): boolean;\n keys(): readonly K[];\n values(): Readonly<Partial<Record<K, V>>>;\n};\nexport type CollectionReader<TId, TNode extends EntitySchemaNode> = {\n readonly ids: () => readonly TId[];\n readonly has: (id: TId) => boolean;\n readonly get: (id: TId) => ReaderOfNode<TNode> | undefined;\n};\nexport type ListReader<T> = {\n readonly get: (key: string) => T | undefined;\n readonly has: (key: string) => boolean;\n readonly values: () => readonly T[];\n readonly length: () => number;\n readonly at: (index: number) => T | undefined;\n};\nexport type TreeReader<T> = {\n readonly rootId: () => string | undefined;\n readonly has: (id: string) => boolean;\n readonly value: (id: string) => T | undefined;\n readonly parent: (id: string) => string | undefined;\n readonly children: (id: string) => readonly string[];\n};\n\nexport type ReaderOfNode<TNode extends DocumentNode> = TNode extends {\n kind: 'field';\n}\n ? FieldReader<DocumentValueOfNode<TNode>>\n : TNode extends ObjectNode<infer TShape>\n ? { readonly [K in keyof TShape]: ReaderOfNode<TShape[K]> }\n : TNode extends VariantNode<string, infer _TVariants>\n ? FieldReader<\n | DocumentValueOfNode<TNode>\n | (TNode extends { readonly optional: true } ? undefined : never)\n >\n : TNode extends TableNode<infer TValue>\n ? CollectionReader<string, TValue>\n : TNode extends MapNode<infer TValue>\n ? CollectionReader<string, TValue>\n : TNode extends DictNode<infer TKey, infer TValue>\n ? DictionaryReader<TKey, TValue>\n : TNode extends ListNode<infer TItem>\n ? ListReader<TItem>\n : TNode extends TreeNode<infer TValue>\n ? TreeReader<TValue>\n : FieldReader<DocumentValueOfNode<TNode>>;\nexport type DocumentReader<TSchema extends DocumentSchema> = ReaderOfNode<\n ObjectNode<TSchema['shape']>\n>;\n\nexport type ReaderContext = {\n readonly root: () => unknown;\n readonly active: () => boolean;\n readonly dependencies?: DependencyTracker;\n};\n\nconst schemaRoot = (schema: DocumentSchema): DocumentNode => object(schema.shape);\n\nconst assertActive = (context: ReaderContext): void => {\n if (!context.active()) throw new Error('Document reader is no longer active.');\n};\n\nconst readAt = (context: ReaderContext, address: DocumentAddress): unknown => {\n assertActive(context);\n profile.reader.lookup();\n return readAddress(context.root(), address);\n};\n\nconst collectValue = (context: ReaderContext, address: DocumentAddress): void => {\n context.dependencies?.record({ kind: 'value', at: address });\n};\n\nconst collectCollection = (context: ReaderContext, address: DocumentAddress, id?: string): void => {\n const target: ImpactTarget<unknown> = {\n kind: 'collection',\n at: address,\n ...(id === undefined ? {} : { id }),\n };\n context.dependencies?.record(target);\n};\n\nexport const readerFor = (\n node: DocumentNode,\n context: ReaderContext,\n address: DocumentAddress = []\n): unknown => {\n if (node.kind === 'field')\n return {\n get: () => {\n collectValue(context, address);\n return readAt(context, address);\n },\n };\n if (node.kind === 'dict')\n return {\n get: (key: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n return cloneValue(\n isRecord(value) && Object.prototype.hasOwnProperty.call(value, key)\n ? value[key]\n : undefined,\n 'reader'\n );\n },\n has: (key: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n return isRecord(value) && Object.prototype.hasOwnProperty.call(value, key);\n },\n keys: () => {\n collectValue(context, address);\n const value = readAt(context, address);\n return isRecord(value) ? Object.keys(value) : [];\n },\n values: () => {\n collectValue(context, address);\n profile.reader.structuralSnapshot();\n return cloneValue(readAt(context, address) ?? {}, 'reader');\n },\n };\n if (node.kind === 'list')\n return {\n get: (key: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n if (!Array.isArray(value)) return undefined;\n return cloneValue(value[anchor.keys(value, node.keyOf).index(key)], 'reader');\n },\n has: (key: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n return Array.isArray(value) && anchor.keys(value, node.keyOf).index(key) >= 0;\n },\n values: () => {\n collectValue(context, address);\n const value = readAt(context, address);\n profile.reader.structuralSnapshot();\n return cloneValue(Array.isArray(value) ? value : [], 'reader');\n },\n length: () => {\n collectValue(context, address);\n const value = readAt(context, address);\n return Array.isArray(value) ? value.length : 0;\n },\n at: (index: number) => {\n collectValue(context, address);\n const value = readAt(context, address);\n profile.reader.structuralSnapshot();\n return cloneValue(Array.isArray(value) ? value[index] : undefined, 'reader');\n },\n };\n if (node.kind === 'tree')\n return {\n rootId: () => {\n collectValue(context, address);\n const value = readAt(context, address);\n return isRecord(value) && typeof value.rootId === 'string' ? value.rootId : undefined;\n },\n has: (id: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n return (\n isRecord(value) &&\n isRecord(value.nodes) &&\n Object.prototype.hasOwnProperty.call(value.nodes, id)\n );\n },\n value: (id: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n profile.reader.structuralSnapshot();\n return cloneValue(\n isRecord(value) && isRecord(value.nodes) && isRecord(value.nodes[id])\n ? value.nodes[id].value\n : undefined,\n 'reader'\n );\n },\n parent: (id: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n const entry = isRecord(value) && isRecord(value.nodes) ? value.nodes[id] : undefined;\n return isRecord(entry) && typeof entry.parentId === 'string' ? entry.parentId : undefined;\n },\n children: (id: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n const entry = isRecord(value) && isRecord(value.nodes) ? value.nodes[id] : undefined;\n return isRecord(entry) && Array.isArray(entry.children) ? [...entry.children] : [];\n },\n };\n if (node.kind === 'table' || node.kind === 'map') {\n let items: Map<string, unknown> | undefined;\n return {\n ids: () => {\n collectCollection(context, address);\n const value = readAt(context, address);\n const ids =\n node.kind === 'table' && isRecord(value) && Array.isArray(value.ids)\n ? [...value.ids]\n : isRecord(value)\n ? Object.keys(value)\n : [];\n profile.reader.collectionIds(ids.length);\n return ids;\n },\n has: (id: string) => {\n collectCollection(context, address, id);\n const value = readAt(context, address);\n const byId =\n node.kind === 'table' && isRecord(value) && isRecord(value.byId) ? value.byId : value;\n return isRecord(byId) && Object.prototype.hasOwnProperty.call(byId, id);\n },\n get: (id: string) => {\n collectCollection(context, address, id);\n const value = readAt(context, address);\n const byId =\n node.kind === 'table' && isRecord(value) && isRecord(value.byId) ? value.byId : value;\n if (!isRecord(byId) || !Object.prototype.hasOwnProperty.call(byId, id)) return undefined;\n const cached = items?.get(id);\n if (cached) return cached as ReaderOfNode<typeof node.value>;\n const reader = readerFor(node.value, context, [...address, id]);\n (items ??= new Map()).set(id, reader);\n return reader;\n },\n };\n }\n if (node.kind === 'variant')\n return {\n get: () => {\n collectValue(context, address);\n return cloneValue(readAt(context, address), 'reader');\n },\n };\n\n let children: Map<string, unknown> | undefined;\n return new Proxy(\n {},\n {\n get: (_target, property: string | symbol) => {\n if (typeof property === 'symbol') return undefined;\n const child = node.shape[property];\n if (!child) return undefined;\n const cached = children?.get(property);\n if (cached) return cached;\n const reader = readerFor(child, context, [...address, property]);\n (children ??= new Map()).set(property, reader);\n return reader;\n },\n }\n );\n};\n\nexport const documentReader = <TSchema extends DocumentSchema>(\n schema: TSchema,\n root: () => ReadonlyDocument<TSchema>,\n active: () => boolean,\n dependencies?: DependencyTracker\n): DocumentReader<TSchema> => {\n profile.reader.session();\n return readerFor(schemaRoot(schema), {\n root,\n active,\n dependencies,\n }) as DocumentReader<TSchema>;\n};\n","import type { DocumentAddress } from '../schema';\nimport type { DocumentOperation } from '../operations';\n\nexport type CommandFootprintTarget =\n | { readonly kind: 'value'; readonly at: DocumentAddress }\n | { readonly kind: 'dictionary'; readonly at: DocumentAddress }\n | { readonly kind: 'dictionary-key'; readonly at: DocumentAddress; readonly key: string }\n | { readonly kind: 'collection'; readonly at: DocumentAddress }\n | { readonly kind: 'entity'; readonly at: DocumentAddress; readonly id: string }\n | { readonly kind: 'list'; readonly at: DocumentAddress }\n | { readonly kind: 'list-item'; readonly at: DocumentAddress; readonly key: string }\n | { readonly kind: 'tree'; readonly at: DocumentAddress }\n | { readonly kind: 'tree-node'; readonly at: DocumentAddress; readonly id: string };\n\nexport type CommandFootprint = readonly CommandFootprintTarget[];\n\nconst sameAddress = (left: DocumentAddress, right: DocumentAddress): boolean =>\n left.length === right.length && left.every((segment, index) => segment === right[index]);\n\nconst containsAddress = (parent: DocumentAddress, child: DocumentAddress): boolean =>\n parent.length <= child.length && parent.every((segment, index) => segment === child[index]);\n\nconst address = (value: unknown): DocumentAddress | undefined =>\n Array.isArray(value) && value.every(segment => typeof segment === 'string')\n ? Object.freeze(value.slice())\n : undefined;\n\nconst targetKey = (target: CommandFootprintTarget): string => {\n const at = target.at.join('\\u0000');\n if (target.kind === 'dictionary-key' || target.kind === 'list-item')\n return `${target.kind}:${at}:${target.key}`;\n if (target.kind === 'entity' || target.kind === 'tree-node')\n return `${target.kind}:${at}:${target.id}`;\n return `${target.kind}:${at}`;\n};\n\nconst freezeTarget = (target: CommandFootprintTarget): CommandFootprintTarget =>\n Object.freeze({ ...target, at: Object.freeze(target.at.slice()) }) as CommandFootprintTarget;\n\nconst add = (\n targets: Map<string, CommandFootprintTarget>,\n target: CommandFootprintTarget\n): void => {\n const stable = freezeTarget(target);\n targets.set(targetKey(stable), stable);\n};\n\nexport const commandFootprint = (operations: readonly DocumentOperation[]): CommandFootprint => {\n const targets = new Map<string, CommandFootprintTarget>();\n for (const operation of operations) {\n switch (operation.type) {\n case 'field.set':\n case 'field.clear':\n case 'value.clear':\n case 'variant.replace':\n add(targets, { kind: 'value', at: operation.at });\n break;\n case 'dict.replace':\n add(targets, { kind: 'dictionary', at: operation.at });\n break;\n case 'dict.set':\n case 'dict.delete':\n add(targets, { kind: 'dictionary-key', at: operation.at, key: operation.key });\n break;\n case 'entity.create':\n add(targets, { kind: 'collection', at: operation.at });\n for (const entry of operation.entries)\n add(targets, { kind: 'entity', at: operation.at, id: entry.id });\n break;\n case 'entity.remove':\n add(targets, { kind: 'collection', at: operation.at });\n for (const id of operation.ids) add(targets, { kind: 'entity', at: operation.at, id });\n break;\n case 'entity.move':\n add(targets, { kind: 'collection', at: operation.at });\n add(targets, { kind: 'entity', at: operation.at, id: operation.id });\n break;\n case 'list.insert':\n case 'list.move':\n case 'list.remove':\n add(targets, { kind: 'list', at: operation.at });\n add(targets, { kind: 'list-item', at: operation.at, key: operation.key });\n break;\n case 'list.replace':\n add(targets, { kind: 'list', at: operation.at });\n for (const key of operation.keys)\n add(targets, { kind: 'list-item', at: operation.at, key });\n break;\n case 'tree.insert':\n case 'tree.move':\n case 'tree.remove':\n case 'tree.set':\n add(targets, { kind: 'tree', at: operation.at });\n add(targets, { kind: 'tree-node', at: operation.at, id: operation.treeNodeId });\n break;\n case 'tree.replace':\n add(targets, { kind: 'tree', at: operation.at });\n break;\n }\n }\n return Object.freeze(Array.from(targets.values()));\n};\n\nconst overlapsValueAndEntity = (\n value: Extract<CommandFootprintTarget, { readonly kind: 'value' }>,\n entity: Extract<CommandFootprintTarget, { readonly kind: 'entity' }>\n): boolean =>\n containsAddress([...entity.at, entity.id], value.at) ||\n containsAddress(value.at, [...entity.at, entity.id]);\n\nconst targetsOverlap = (left: CommandFootprintTarget, right: CommandFootprintTarget): boolean => {\n if (left.kind === 'value' && right.kind === 'value')\n return containsAddress(left.at, right.at) || containsAddress(right.at, left.at);\n if (left.kind === 'value' && right.kind === 'entity') return overlapsValueAndEntity(left, right);\n if (left.kind === 'entity' && right.kind === 'value') return overlapsValueAndEntity(right, left);\n if (left.kind === 'dictionary' && right.kind === 'dictionary')\n return sameAddress(left.at, right.at);\n if (left.kind === 'dictionary' && right.kind === 'dictionary-key')\n return sameAddress(left.at, right.at);\n if (left.kind === 'dictionary-key' && right.kind === 'dictionary')\n return sameAddress(left.at, right.at);\n if (left.kind === 'dictionary-key' && right.kind === 'dictionary-key')\n return sameAddress(left.at, right.at) && left.key === right.key;\n if (left.kind === 'collection' && right.kind === 'collection')\n return sameAddress(left.at, right.at);\n if (left.kind === 'collection' && right.kind === 'entity') return sameAddress(left.at, right.at);\n if (left.kind === 'entity' && right.kind === 'collection') return sameAddress(left.at, right.at);\n if (left.kind === 'entity' && right.kind === 'entity')\n return sameAddress(left.at, right.at) && left.id === right.id;\n if (left.kind === 'list' && (right.kind === 'list' || right.kind === 'list-item'))\n return sameAddress(left.at, right.at);\n if (right.kind === 'list' && left.kind === 'list-item') return sameAddress(left.at, right.at);\n if (left.kind === 'list-item' && right.kind === 'list-item')\n return sameAddress(left.at, right.at) && left.key === right.key;\n if (left.kind === 'tree' && (right.kind === 'tree' || right.kind === 'tree-node'))\n return sameAddress(left.at, right.at);\n if (right.kind === 'tree' && left.kind === 'tree-node') return sameAddress(left.at, right.at);\n if (left.kind === 'tree-node' && right.kind === 'tree-node')\n return sameAddress(left.at, right.at) && left.id === right.id;\n return false;\n};\n\nexport const footprintsOverlap = (left: CommandFootprint, right: CommandFootprint): boolean =>\n left.some(leftTarget => right.some(rightTarget => targetsOverlap(leftTarget, rightTarget)));\n\nconst decodedTarget = (value: unknown): CommandFootprintTarget | undefined => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return undefined;\n const record = value as Record<string, unknown>;\n const at = address(record.at);\n if (!at || typeof record.kind !== 'string') return undefined;\n switch (record.kind) {\n case 'value':\n case 'dictionary':\n case 'collection':\n case 'list':\n case 'tree':\n return freezeTarget({ kind: record.kind, at });\n case 'dictionary-key':\n case 'list-item':\n return typeof record.key === 'string'\n ? freezeTarget({ kind: record.kind, at, key: record.key })\n : undefined;\n case 'entity':\n case 'tree-node':\n return typeof record.id === 'string'\n ? freezeTarget({ kind: record.kind, at, id: record.id })\n : undefined;\n default:\n return undefined;\n }\n};\n\nexport const decodeCommandFootprint = (value: unknown): CommandFootprint | undefined => {\n if (!Array.isArray(value)) return undefined;\n const targets = new Map<string, CommandFootprintTarget>();\n for (const entry of value) {\n const target = decodedTarget(entry);\n if (!target) return undefined;\n targets.set(targetKey(target), target);\n }\n return Object.freeze(Array.from(targets.values()));\n};\n","import type { DocumentSchema, ReadonlyDocument } from '../schema';\nimport type { DocumentReader } from '../access/reader';\nimport { documentReader } from '../access/reader';\nimport type { DependencyTracker } from '../access/dependency';\nimport { DocumentDisposedError } from './contract';\nimport type { DocumentReadable } from './contract';\n\nexport type RuntimeAccessState<TSchema extends DocumentSchema> = {\n readonly schema: TSchema;\n document: ReadonlyDocument<TSchema>;\n disposed: boolean;\n projectionLocks?: number;\n};\n\nconst states = new WeakMap<object, RuntimeAccessState<DocumentSchema>>();\n\nexport const bindRuntimeAccess = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>,\n state: RuntimeAccessState<TSchema>\n): void => {\n states.set(runtime as object, state as RuntimeAccessState<DocumentSchema>);\n};\n\nexport const accessOf = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>\n): RuntimeAccessState<TSchema> => {\n const state = states.get(runtime as object);\n if (!state) throw new Error('Unknown Doxum runtime.');\n return state as RuntimeAccessState<TSchema>;\n};\n\nexport const schemaOf = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>\n): TSchema => accessOf(runtime).schema;\n\nexport const documentOf = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>\n): ReadonlyDocument<TSchema> => accessOf(runtime).document;\n\nexport const readWith = <TSchema extends DocumentSchema, TResult>(\n runtime: DocumentReadable<TSchema>,\n run: (read: DocumentReader<TSchema>) => TResult,\n dependencies?: DependencyTracker\n): TResult => {\n const state = accessOf(runtime);\n if (state.disposed) throw new DocumentDisposedError();\n let active = true;\n const reader = documentReader(\n state.schema,\n () => state.document,\n () => active,\n dependencies\n );\n try {\n return run(reader);\n } finally {\n // Readers are transaction-scoped; retaining one cannot expose later\n // mutable canonical state outside the coordinating operation.\n active = false;\n }\n};\n","import type { DocumentSchema, ImpactTarget } from '../schema';\nimport type {\n CommitListener,\n DocumentCommit,\n DocumentReadable,\n DocumentRuntime,\n Unsubscribe,\n ObserverError,\n} from './contract';\nimport * as target from '../impact-target';\n\nexport type ProjectionAttachment<TSchema extends DocumentSchema> = {\n capture(commit: DocumentCommit<TSchema>): void;\n settle(): void;\n flush(): readonly ObserverError[];\n dispose(): void;\n};\ntype ProcessorEntry<TSchema extends DocumentSchema> = {\n readonly processor: ProjectionAttachment<TSchema>;\n active: boolean;\n};\ntype RootEntry<TSchema extends DocumentSchema> = {\n readonly listener: CommitListener<TSchema>;\n active: boolean;\n};\ntype FilteredEntry<TSchema extends DocumentSchema> = {\n readonly targets: readonly ImpactTarget<unknown>[];\n readonly listener: CommitListener<TSchema>;\n active: boolean;\n};\nexport type RuntimeNotification<TSchema extends DocumentSchema> = {\n readonly root: Set<RootEntry<TSchema>>;\n readonly filtered: Set<FilteredEntry<TSchema>>;\n readonly buckets: Map<BucketKey, Set<FilteredEntry<TSchema>>>;\n readonly processors: ProcessorEntry<TSchema>[];\n readonly candidates: Set<FilteredEntry<TSchema>>;\n readonly rootSnapshot: RootEntry<TSchema>[];\n notifying: boolean;\n};\n\nconst ROOT_BUCKET = Symbol('document-root');\ntype BucketKey = string | typeof ROOT_BUCKET;\nconst notifications = new WeakMap<object, RuntimeNotification<DocumentSchema>>();\nconst readableOwners = new WeakMap<object, DocumentReadable<DocumentSchema>>();\n\nexport const bindDocumentReadable = (\n readable: object,\n runtime: DocumentReadable<DocumentSchema>\n): void => {\n readableOwners.set(readable, runtime);\n};\nexport const documentReadableOwner = (\n readable: object\n): DocumentReadable<DocumentSchema> | undefined => readableOwners.get(readable);\n\nconst key = (value: ImpactTarget<unknown>): BucketKey => target.bucket(value) ?? ROOT_BUCKET;\n\nexport const createNotification = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>\n): RuntimeNotification<TSchema> => {\n const notification: RuntimeNotification<TSchema> = {\n root: new Set(),\n filtered: new Set(),\n buckets: new Map(),\n processors: [],\n candidates: new Set(),\n rootSnapshot: [],\n notifying: false,\n };\n notifications.set(runtime as object, notification as RuntimeNotification<DocumentSchema>);\n return notification;\n};\n\nconst notificationOf = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>\n): RuntimeNotification<TSchema> => {\n const value = notifications.get(runtime as object);\n if (!value) throw new Error('Unknown Doxum runtime.');\n return value as RuntimeNotification<TSchema>;\n};\n\nexport const shareNotification = <TSchema extends DocumentSchema>(\n source: DocumentRuntime<TSchema>,\n target: DocumentReadable<TSchema>\n): void => {\n notifications.set(\n target as object,\n notificationOf(source) as RuntimeNotification<DocumentSchema>\n );\n};\n\nexport const attachProjection = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>,\n processor: ProjectionAttachment<TSchema>\n): Unsubscribe => {\n const notification = notificationOf(runtime);\n const entry: ProcessorEntry<TSchema> = { processor, active: true };\n notification.processors.push(entry);\n return () => {\n if (!entry.active) return;\n entry.active = false;\n if (!notification.notifying) {\n const index = notification.processors.indexOf(entry);\n if (index >= 0) notification.processors.splice(index, 1);\n }\n };\n};\n\nexport const subscribeRoot = <TSchema extends DocumentSchema>(\n notification: RuntimeNotification<TSchema>,\n listener: CommitListener<TSchema>\n): Unsubscribe => {\n const entry: RootEntry<TSchema> = { listener, active: true };\n notification.root.add(entry);\n return () => {\n entry.active = false;\n if (!notification.notifying) notification.root.delete(entry);\n };\n};\n\nexport const subscribeTargets = <TSchema extends DocumentSchema>(\n notification: RuntimeNotification<TSchema>,\n targets: readonly ImpactTarget<unknown>[],\n listener: CommitListener<TSchema>\n): Unsubscribe => {\n const entry: FilteredEntry<TSchema> = {\n targets: Object.freeze(targets.slice()),\n listener,\n active: true,\n };\n notification.filtered.add(entry);\n const keys = new Set(targets.map(key));\n keys.forEach(key => {\n const bucket = notification.buckets.get(key) ?? new Set();\n bucket.add(entry);\n notification.buckets.set(key, bucket);\n });\n return () => {\n if (!entry.active) return;\n entry.active = false;\n if (notification.notifying) return;\n notification.filtered.delete(entry);\n keys.forEach(key => {\n const bucket = notification.buckets.get(key);\n bucket?.delete(entry);\n if (bucket?.size === 0) notification.buckets.delete(key);\n });\n };\n};\n\nexport const notify = <TSchema extends DocumentSchema>(\n notification: RuntimeNotification<TSchema>,\n commit: DocumentCommit<TSchema>,\n afterSettle?: () => readonly ObserverError[]\n): readonly ObserverError[] => {\n notification.notifying = true;\n const errors: ObserverError[] = [];\n const call = (listener: CommitListener<TSchema>): void => {\n try {\n listener(commit);\n } catch (error) {\n errors.push(Object.freeze({ phase: 'listener', error }));\n }\n };\n try {\n const processorCount = notification.processors.length;\n for (let index = 0; index < processorCount; index += 1) {\n const entry = notification.processors[index];\n if (!entry?.active) continue;\n try {\n entry.processor.capture(commit);\n } catch (error) {\n errors.push(Object.freeze({ phase: 'processor', error }));\n }\n }\n for (let index = 0; index < processorCount; index += 1) {\n const entry = notification.processors[index];\n if (!entry?.active) continue;\n try {\n entry.processor.settle();\n } catch (error) {\n errors.push(Object.freeze({ phase: 'processor', error }));\n }\n }\n for (let index = 0; index < processorCount; index += 1) {\n const entry = notification.processors[index];\n if (!entry?.active) continue;\n try {\n errors.push(...entry.processor.flush());\n } catch (error) {\n errors.push(Object.freeze({ phase: 'flush', error }));\n }\n }\n\n if (afterSettle) errors.push(...afterSettle());\n const candidates = notification.candidates;\n candidates.clear();\n if (commit.impact.kind === 'reset') {\n notification.filtered.forEach(entry => candidates.add(entry));\n } else {\n for (const operation of commit.operations) {\n const key = operation.at[0] ?? ROOT_BUCKET;\n notification.buckets.get(key)?.forEach(entry => candidates.add(entry));\n notification.buckets.get(ROOT_BUCKET)?.forEach(entry => candidates.add(entry));\n }\n }\n candidates.forEach(entry => {\n if (entry.active && entry.targets.some(commit.impact.affects)) call(entry.listener);\n });\n const rootSnapshot = notification.rootSnapshot;\n rootSnapshot.length = 0;\n notification.root.forEach(entry => rootSnapshot.push(entry));\n for (const entry of rootSnapshot) if (entry.active) call(entry.listener);\n } finally {\n notification.notifying = false;\n let writeIndex = 0;\n for (const entry of notification.processors)\n if (entry.active) notification.processors[writeIndex++] = entry;\n notification.processors.length = writeIndex;\n notification.root.forEach(entry => {\n if (!entry.active) notification.root.delete(entry);\n });\n notification.filtered.forEach(entry => {\n if (!entry.active) notification.filtered.delete(entry);\n });\n notification.buckets.forEach((bucket, key) => {\n bucket.forEach(entry => {\n if (!entry.active) bucket.delete(entry);\n });\n if (bucket.size === 0) notification.buckets.delete(key);\n });\n }\n return Object.freeze(errors);\n};\n\nexport const disposeNotification = <TSchema extends DocumentSchema>(\n notification: RuntimeNotification<TSchema>\n): void => {\n const attachments = notification.processors.slice();\n notification.root.clear();\n notification.filtered.clear();\n notification.buckets.clear();\n notification.processors.length = 0;\n notification.candidates.clear();\n notification.rootSnapshot.length = 0;\n const errors: unknown[] = [];\n attachments.forEach(entry => {\n if (!entry.active) return;\n try {\n entry.processor.dispose();\n } catch (error) {\n errors.push(error);\n }\n });\n if (errors.length) throw new AggregateError(errors, 'Projection disposal notification failed.');\n};\n","import type { CollectionReader, DocumentReader, ReaderOfNode } from '../access/reader';\nimport type { CollectionImpact } from '../impact';\nimport type {\n DocumentCommit,\n DocumentReadable,\n Synchronous,\n Unsubscribe,\n} from '../runtime/contract';\nimport type {\n CollectionNode,\n CollectionPath,\n CollectionSelector,\n DocumentSchema,\n EntitySchemaNode,\n ImpactTarget,\n SchemaPath,\n} from '../schema';\nimport type { Readable } from './readable';\n\ndeclare const sourceContext: unique symbol;\nexport type ProjectionSource<T> = { readonly [sourceContext]: T };\nexport type ProjectionSources = Readonly<Record<string, ProjectionSource<unknown>>>;\nexport type ProjectionInputs<S extends ProjectionSources> = {\n readonly [K in keyof S]: S[K] extends ProjectionSource<infer T> ? T : never;\n};\nexport type DocumentInput<S extends DocumentSchema> = {\n readonly read: DocumentReader<S>;\n readonly revision: number;\n readonly commits: readonly DocumentCommit<S>[];\n readonly reset: boolean;\n};\nexport type DocumentCollectionInput<S extends DocumentSchema, N extends EntitySchemaNode> = {\n readonly read: CollectionReader<string, N>;\n readonly target: CollectionSelector<string, N>;\n readonly revision: number;\n readonly commits: readonly DocumentCommit<S>[];\n readonly reset: boolean;\n readonly candidates: { readonly keys: readonly string[]; readonly orderDirty: boolean };\n};\nexport type DocumentSource<S extends DocumentSchema> = ProjectionSource<DocumentInput<S>> & {\n collection<P extends CollectionPath>(\n pick: (path: SchemaPath<S['shape']>) => P\n ): DocumentCollectionSource<S, CollectionNode<P>>;\n targets(\n ...targets: readonly [ImpactTarget, ...ImpactTarget[]]\n ): ProjectionSource<DocumentInput<S>>;\n};\nexport type DocumentCollectionSource<\n S extends DocumentSchema,\n N extends EntitySchemaNode,\n> = ProjectionSource<DocumentCollectionInput<S, N>>;\nexport type ValueInput<T> = {\n readonly value: T;\n readonly previous: T;\n readonly changed: boolean;\n readonly revision: number;\n readonly reset: boolean;\n};\nexport type ProjectionInput<T> = {\n readonly source: ProjectionSource<ValueInput<T>>;\n set(value: T): void;\n};\nexport type ValueUpdate<T> =\n | { readonly kind: 'unchanged' }\n | { readonly kind: 'changed'; readonly value: T }\n | { readonly kind: 'rebuild' };\nexport type ValueSpec<S extends ProjectionSources, T> = {\n readonly name?: string;\n readonly sources: S;\n readonly build: (sources: ProjectionInputs<S>) => {\n readonly value: T;\n readonly update: (sources: ProjectionInputs<S>) => ValueUpdate<NoInfer<T>>;\n };\n};\nexport type ProjectionValue<T> = Readable<T> &\n ProjectionSource<ValueInput<T>> & { rebuild(): void; dispose(): void };\nexport type CollectionRead<K extends string, V> = {\n get(key: K): V | undefined;\n has(key: K): boolean;\n ids(): readonly K[];\n};\nexport type CollectionInput<K extends string, V> = CollectionRead<K, V> & {\n readonly change: CollectionImpact<K> | undefined;\n readonly revision: number;\n readonly reset: boolean;\n};\nexport type ProjectionCollection<K extends string, V> = ProjectionSource<CollectionInput<K, V>> & {\n readonly ids: Readable<readonly K[]>;\n readonly all: Readable<readonly V[]>;\n item(key: K): Readable<V | undefined>;\n revision(): number;\n subscribe(listener: (change: CollectionImpact<K>) => void): Unsubscribe;\n rebuild(): void;\n dispose(): void;\n};\nexport type ProjectionCollectionWriter<K extends string, V> = {\n set(key: K, value: V): void;\n remove(key: K): void;\n order(ids: readonly K[]): void;\n replace(entries: readonly (readonly [K, V])[]): void;\n};\nexport type CollectionProcess<S extends ProjectionSources, K extends string, V> = {\n readonly sources: ProjectionInputs<S>;\n readonly previous: CollectionRead<K, V>;\n readonly next: CollectionRead<K, V>;\n readonly writer: ProjectionCollectionWriter<K, V>;\n};\nexport type CollectionSpec<S extends ProjectionSources, K extends string, V> = {\n readonly name?: string;\n readonly sources: S;\n readonly isEqual?: (previous: V, next: V) => boolean;\n readonly build: (input: CollectionProcess<S, K, V>) => {\n readonly update: (input: CollectionProcess<S, K, V>) => void | { readonly kind: 'rebuild' };\n };\n};\nexport class ProjectionError extends Error {\n constructor(\n readonly phase: 'processor' | 'listener' | 'source' | 'blocked',\n readonly identity: string,\n readonly revisions: readonly number[],\n cause: unknown\n ) {\n super(`Projection ${phase} failed: ${identity}`, { cause });\n this.name = 'ProjectionError';\n }\n}\nexport class ProjectionDisposedError extends Error {\n constructor() {\n super('Projection has been disposed.');\n this.name = 'ProjectionDisposedError';\n }\n}\nexport type ProjectionRuntime = {\n document<S extends DocumentSchema>(runtime: DocumentReadable<S>): DocumentSource<S>;\n fromReadable<T>(\n readable: Readable<T>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): ProjectionSource<ValueInput<T>>;\n input<T>(\n initial: T,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): ProjectionInput<T>;\n value<S extends ProjectionSources, T>(\n sources: S,\n compute: (sources: ProjectionInputs<S>) => Synchronous<T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ProjectionValue<T>;\n value<S extends ProjectionSources, T>(\n spec: ValueSpec<S, T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ProjectionValue<T>;\n collection<V, K extends string = string>(): <S extends ProjectionSources>(\n spec: CollectionSpec<S, K, V>\n ) => ProjectionCollection<K, V>;\n map<S extends DocumentSchema, N extends EntitySchemaNode, V>(\n source: DocumentCollectionSource<S, N>,\n mapper: (id: string, entry: ReaderOfNode<N>) => Synchronous<V>,\n options?: { readonly isEqual?: (a: V, b: V) => boolean }\n ): ProjectionCollection<string, V>;\n map<K extends string, V, R>(\n source: ProjectionCollection<K, V>,\n mapper: (id: K, entry: V) => Synchronous<R>,\n options?: { readonly isEqual?: (a: NoInfer<R>, b: NoInfer<R>) => boolean }\n ): ProjectionCollection<K, R>;\n batch<T>(run: () => Synchronous<T>): T;\n dispose(): void;\n};\n","import type { ObserverError } from '../runtime/contract';\nimport { ProjectionDisposedError, ProjectionError } from './contract';\nimport { profile } from '../profile';\n\nexport type SourceRecord = {\n readonly consumers: Set<NodeRecord>;\n context(active: () => boolean): unknown;\n revision(): number;\n reset(): boolean;\n fault: ProjectionError | undefined;\n disposed: boolean;\n clear(): void;\n};\nexport type NodeRecord = SourceRecord & {\n readonly order: number;\n readonly name: string;\n readonly sources: readonly SourceRecord[];\n forced: boolean;\n statusChanged: boolean;\n evaluate(build: boolean): boolean;\n publish(): void;\n emit(call: (listener: () => void) => void): void;\n release(): void;\n};\n\n// Sources and nodes share one registry. Public structural lookalikes are never accepted.\nexport const projectionHandles = new WeakSet<object>();\nexport const createScheduler = (onError: (error: ProjectionError) => void) => {\n let disposed = false;\n let depth = 0;\n let phase: 'idle' | 'compute' | 'notify' = 'idle';\n let sequence = 0;\n const records = new Map<object, SourceRecord>();\n const nodes = new Set<NodeRecord>();\n const pending = new Set<SourceRecord>();\n const heap: NodeRecord[] = [];\n const queued = new Set<NodeRecord>();\n const completed: NodeRecord[] = [];\n const emissions = new Set<NodeRecord>();\n const errors: ProjectionError[] = [];\n let reportingFailures: unknown[] = [];\n const guards = new Set<(locked: boolean) => void>();\n const cleanups = new Set<() => void>();\n const assertActive = () => {\n if (disposed) throw new ProjectionDisposedError();\n };\n const assertIdle = () => {\n assertActive();\n if (phase !== 'idle')\n throw new Error('Projection cannot be re-entered during processing or notification.');\n };\n const lock = (value: boolean) => guards.forEach(guard => guard(value));\n const enqueue = (node: NodeRecord) => {\n if (node.disposed || queued.has(node)) return;\n queued.add(node);\n profile.projection('scheduledNodes');\n let i = heap.length;\n heap.push(node);\n while (i > 0) {\n const p = (i - 1) >> 1;\n if (heap[p].order < node.order) break;\n heap[i] = heap[p];\n i = p;\n }\n heap[i] = node;\n };\n const pop = () => {\n const first = heap[0];\n const last = heap.pop()!;\n if (heap.length) {\n let i = 0;\n while (i * 2 + 1 < heap.length) {\n let c = i * 2 + 1;\n if (c + 1 < heap.length && heap[c + 1].order < heap[c].order) c++;\n if (last.order < heap[c].order) break;\n heap[i] = heap[c];\n i = c;\n }\n heap[i] = last;\n }\n return first;\n };\n const errorFor = (\n node: NodeRecord,\n cause: unknown,\n kind: ProjectionError['phase'] = 'processor'\n ) =>\n new ProjectionError(\n kind,\n node.name,\n node.sources.map(source => source.revision()),\n cause\n );\n const capture = (source: SourceRecord) => {\n if (disposed) return;\n if (phase !== 'idle') {\n source.fault = new ProjectionError(\n 'source',\n 'reentrant source',\n [source.revision()],\n new Error('Source changed while projection was running.')\n );\n errors.push(source.fault);\n throw source.fault;\n }\n pending.add(source);\n profile.projection('sourceEvents');\n if (source.fault) errors.push(source.fault);\n };\n const settle = () => {\n if (disposed || depth || phase !== 'idle') return;\n phase = 'compute';\n lock(true);\n try {\n pending.forEach(source => source.consumers.forEach(enqueue));\n while (heap.length) {\n const node = pop();\n if (node.disposed) continue;\n const wasFaulted = node.fault !== undefined;\n profile.projection('processedNodes');\n let changed = false;\n const blocked = node.sources.find(source => source.fault || source.disposed);\n if (blocked) {\n node.fault = errorFor(node, blocked.fault ?? new ProjectionDisposedError(), 'blocked');\n } else {\n const build = node.forced || wasFaulted || node.sources.some(source => source.reset());\n try {\n changed = node.evaluate(build);\n const failure = node.sources.find(source => source.fault)?.fault;\n if (failure) throw failure;\n node.fault = undefined;\n } catch (cause) {\n const error = errorFor(node, cause);\n errors.push(error);\n node.fault = error;\n if (!build) {\n try {\n changed = node.evaluate(true);\n const failure = node.sources.find(source => source.fault)?.fault;\n if (failure) throw failure;\n node.fault = undefined;\n } catch (cause) {\n node.fault = errorFor(node, cause);\n errors.push(node.fault);\n }\n }\n }\n }\n node.forced = false;\n node.statusChanged = wasFaulted !== (node.fault !== undefined);\n completed.push(node);\n if (changed || wasFaulted || node.fault) {\n profile.projection('publishedNodes');\n emissions.add(node);\n node.consumers.forEach(enqueue);\n }\n }\n completed.forEach(node => node.publish());\n } finally {\n lock(false);\n phase = 'idle';\n }\n };\n const flush = (): readonly ObserverError[] => {\n if (disposed || depth) return [];\n if (pending.size || completed.length) profile.projection('flushes');\n phase = 'notify';\n lock(true);\n const reportFailures: unknown[] = [];\n try {\n emissions.forEach(node =>\n node.emit(listener => {\n try {\n listener();\n } catch (cause) {\n errors.push(errorFor(node, cause, 'listener'));\n }\n })\n );\n for (const error of errors.slice()) {\n try {\n onError(error);\n } catch (cause) {\n reportFailures.push(cause);\n }\n }\n return Object.freeze([\n ...errors.map(error =>\n Object.freeze({\n phase: error.phase === 'listener' ? ('listener' as const) : ('processor' as const),\n error,\n })\n ),\n ...reportFailures.map(error => Object.freeze({ phase: 'listener' as const, error })),\n ]);\n } finally {\n pending.forEach(source => source.clear());\n completed.forEach(node => node.clear());\n pending.clear();\n queued.clear();\n completed.length = 0;\n emissions.clear();\n errors.length = 0;\n reportingFailures = reportFailures;\n lock(false);\n phase = 'idle';\n }\n };\n const run = () => {\n settle();\n const result = flush();\n const failures = reportingFailures;\n reportingFailures = [];\n if (failures.length) throw new AggregateError(failures, 'Projection error reporter failed.');\n return result;\n };\n return {\n assertActive,\n assertIdle,\n capture,\n settle,\n flush,\n run,\n records,\n guards,\n cleanups,\n get active() {\n return !disposed;\n },\n register(handle: object, record: SourceRecord) {\n assertIdle();\n records.set(handle, record);\n projectionHandles.add(handle);\n },\n unregisterSource(handle: object) {\n const record = records.get(handle);\n if (record) {\n record.disposed = true;\n pending.delete(record);\n record.clear();\n records.delete(handle);\n }\n },\n source(handle: object) {\n assertActive();\n const source = records.get(handle);\n if (!source || source.disposed)\n throw new Error('Unknown, disposed, or foreign projection source.');\n return source;\n },\n addNode(node: NodeRecord) {\n nodes.add(node);\n node.sources.forEach(source => source.consumers.add(node));\n },\n order: () => sequence++,\n initialize<T>(run: () => T): T {\n assertIdle();\n phase = 'compute';\n lock(true);\n try {\n return run();\n } finally {\n lock(false);\n phase = 'idle';\n }\n },\n rebuild(node: NodeRecord) {\n assertIdle();\n if (node.disposed) throw new ProjectionDisposedError();\n node.forced = true;\n enqueue(node);\n run();\n },\n disposeNode(node: NodeRecord) {\n if (node.disposed) return;\n assertIdle();\n if (node.consumers.size)\n throw new Error('Cannot dispose a projection node with downstream consumers.');\n node.disposed = true;\n node.sources.forEach(source => source.consumers.delete(node));\n nodes.delete(node);\n node.release();\n for (const [handle, record] of records) if (record === node) records.delete(handle);\n },\n batch<T>(callback: () => T): T {\n assertIdle();\n depth++;\n let failed = false;\n try {\n const value = callback();\n assertSynchronous(value);\n return value;\n } catch (error) {\n failed = true;\n throw error;\n } finally {\n depth--;\n if (!depth) {\n if (failed) {\n try {\n run();\n } catch {\n /* The original application error retains priority. */\n }\n } else run();\n }\n }\n },\n dispose() {\n if (disposed) return;\n assertIdle();\n disposed = true;\n const failures: unknown[] = [];\n cleanups.forEach(cleanup => {\n try {\n cleanup();\n } catch (error) {\n failures.push(error);\n }\n });\n cleanups.clear();\n nodes.forEach(node => {\n node.disposed = true;\n node.release();\n node.consumers.clear();\n });\n records.forEach(source => {\n source.disposed = true;\n source.consumers.clear();\n source.clear();\n });\n nodes.clear();\n records.clear();\n pending.clear();\n heap.length = 0;\n completed.length = 0;\n queued.clear();\n emissions.clear();\n guards.clear();\n errors.length = 0;\n reportingFailures = [];\n if (failures.length) throw new AggregateError(failures, 'Projection cleanup failed.');\n },\n debug: () => ({\n nodes: nodes.size,\n sources: records.size - nodes.size,\n subscriptions: cleanups.size,\n pending: pending.size + heap.length,\n }),\n };\n};\nexport type Scheduler = ReturnType<typeof createScheduler>;\nexport const assertSynchronous = (value: unknown): void => {\n if (\n value != null &&\n (typeof value === 'object' || typeof value === 'function') &&\n 'then' in value &&\n typeof value.then === 'function'\n )\n throw new TypeError('Projection callbacks must be synchronous.');\n};\nexport const assertScope = (active: () => boolean) => {\n if (!active()) throw new Error('Projection reader or writer is no longer active.');\n};\n","import type { ProjectionInputs, ProjectionSources } from './contract';\nimport { ProjectionDisposedError } from './contract';\nimport type { NodeRecord, Scheduler } from './scheduler';\n\nexport const createNode = <S extends ProjectionSources>(\n scheduler: Scheduler,\n spec: { name?: string; sources: S },\n behavior: {\n evaluate(sources: ProjectionInputs<S>, build: boolean, active: () => boolean): boolean;\n context(active: () => boolean): unknown;\n revision(): number;\n reset(): boolean;\n publish(): void;\n emit(call: (listener: () => void) => void): void;\n clear(): void;\n release(): void;\n }\n) => {\n scheduler.assertIdle();\n const entries = Object.entries(spec.sources).map(\n ([key, handle]) => [key, scheduler.source(handle)] as const\n );\n const order = scheduler.order();\n const node: NodeRecord = {\n ...behavior,\n publish: () => {\n if (node.fault) behavior.clear();\n else behavior.publish();\n },\n order,\n name: spec.name ? `${spec.name} (${order})` : `projection-${order}`,\n sources: entries.map(([, source]) => source),\n consumers: new Set(),\n disposed: false,\n fault: undefined,\n forced: false,\n statusChanged: false,\n evaluate: build => {\n let active = true;\n try {\n // Heterogeneous source contexts are typed at the registered capability boundary.\n const inputs = Object.fromEntries(\n entries.map(([key, source]) => [key, source.context(() => active)])\n ) as ProjectionInputs<S>;\n return behavior.evaluate(inputs, build, () => active);\n } finally {\n active = false;\n }\n },\n };\n scheduler.initialize(() => {\n const invalid = node.sources.find(source => source.fault || source.disposed);\n if (invalid) throw invalid.fault ?? new ProjectionDisposedError();\n node.evaluate(true);\n node.publish();\n node.clear();\n });\n const check = () => {\n if (node.disposed || !scheduler.active) throw new ProjectionDisposedError();\n if (node.fault) throw node.fault;\n };\n return {\n node,\n check,\n install(handle: object) {\n scheduler.register(handle, node);\n scheduler.addNode(node);\n },\n rebuild: () => scheduler.rebuild(node),\n dispose: () => scheduler.disposeNode(node),\n };\n};\n","import type { CollectionImpact } from '../impact';\nimport { profile } from '../profile';\nimport type {\n CollectionInput,\n CollectionRead,\n CollectionSpec,\n ProjectionCollectionWriter,\n ProjectionCollection,\n ProjectionSources,\n} from './contract';\nimport type { Readable } from './readable';\nimport { createNode } from './node';\nimport { assertScope, assertSynchronous, projectionHandles, type Scheduler } from './scheduler';\n\nexport const collectionHandles = new WeakSet<object>();\n\nconst readonlySet = <T>(values: Iterable<T>): ReadonlySet<T> => {\n const set = new Set(values);\n const view: ReadonlySet<T> = Object.freeze({\n get size() {\n return set.size;\n },\n has: (value: T) => set.has(value),\n entries: () => set.entries(),\n keys: () => set.keys(),\n values: () => set.values(),\n [Symbol.iterator]: () => set.values(),\n forEach: (callback: (value: T, key: T, set: ReadonlySet<T>) => void, thisArg?: unknown) =>\n set.forEach(value => callback.call(thisArg, value, value, view)),\n });\n return view;\n};\ntype Entry<V> = { present: true; value: V } | { present: false };\nexport const createCollection = <S extends ProjectionSources, K extends string, V>(\n scheduler: Scheduler,\n spec: CollectionSpec<S, K, V>\n): ProjectionCollection<K, V> => {\n const values = new Map<K, V>();\n let ids: readonly K[] = Object.freeze([]);\n let staged = new Map<K, Entry<V>>();\n let nextIds = ids;\n let change: CollectionImpact<K> | undefined;\n let instance: ReturnType<typeof spec.build> | undefined;\n let initialized = false;\n let reset = false;\n let revision = 0;\n let idsRevision = 0;\n let all: readonly V[] | undefined;\n const itemVersions = new Map<K, number>();\n const items = new Map<K, Readable<V | undefined>>();\n const itemListeners = new Map<K, Set<() => void>>();\n const idsListeners = new Set<() => void>();\n const allListeners = new Set<() => void>();\n const listeners = new Set<(change: CollectionImpact<K>) => void>();\n const changedKeys = new Set<K>();\n let orderChanged = false;\n const hasNext = (key: K) => (staged.has(key) ? staged.get(key)!.present : values.has(key));\n const getNext = (key: K) => {\n const entry = staged.get(key);\n return entry ? (entry.present ? entry.value : undefined) : values.get(key);\n };\n const owner = createNode(scheduler, spec, {\n evaluate: (sources, build, active) => {\n staged = new Map();\n nextIds = ids;\n change = undefined;\n changedKeys.clear();\n let explicitOrder: readonly K[] | undefined;\n let cleared = false;\n const nextHas = (key: K) =>\n staged.has(key) ? staged.get(key)!.present : !cleared && values.has(key);\n const nextGet = (key: K) => {\n const entry = staged.get(key);\n return entry\n ? entry.present\n ? entry.value\n : undefined\n : cleared\n ? undefined\n : values.get(key);\n };\n const deriveIds = () => {\n const result = cleared ? [] : ids.filter(nextHas);\n for (const [key, entry] of staged)\n if (entry.present && (cleared || !values.has(key))) result.push(key);\n return result;\n };\n const read = (next: boolean): CollectionRead<K, V> => ({\n get: key => {\n assertScope(active);\n return next ? nextGet(key) : values.get(key);\n },\n has: key => {\n assertScope(active);\n return next ? nextHas(key) : values.has(key);\n },\n ids: () => {\n assertScope(active);\n return next ? Object.freeze(explicitOrder ? explicitOrder.slice() : deriveIds()) : ids;\n },\n });\n const writer: ProjectionCollectionWriter<K, V> = {\n set: (key, value) => {\n assertScope(active);\n if (typeof key !== 'string') throw new TypeError('Projection keys must be strings.');\n staged.set(key, { present: true, value });\n },\n remove: key => {\n assertScope(active);\n staged.set(key, { present: false });\n },\n order: order => {\n assertScope(active);\n explicitOrder = order.slice();\n },\n replace: entries => {\n assertScope(active);\n staged.clear();\n cleared = true;\n const order: K[] = [];\n for (const [key, value] of entries) {\n if (staged.has(key)) throw new TypeError('Duplicate projection key.');\n writer.set(key, value);\n order.push(key);\n }\n explicitOrder = order;\n },\n };\n const input = { sources, previous: read(false), next: read(true), writer };\n if (build || !instance) {\n profile.materialized.rebuilt();\n instance = undefined;\n cleared = true;\n const built = spec.build(input);\n assertSynchronous(built);\n instance = built;\n } else {\n profile.materialized.updated();\n const result = instance.update(input);\n assertSynchronous(result);\n if (result?.kind === 'rebuild') {\n staged.clear();\n cleared = true;\n explicitOrder = undefined;\n instance = undefined;\n const built = spec.build(input);\n assertSynchronous(built);\n instance = built;\n build = true;\n }\n }\n if (cleared)\n for (const key of values.keys()) if (!staged.has(key)) staged.set(key, { present: false });\n const added = new Set<K>();\n const removed = new Set<K>();\n const updated = new Set<K>();\n profile.projection('touchedKeys', staged.size);\n for (const [key, entry] of staged) {\n const existed = values.has(key);\n if (entry.present) {\n if (!existed) added.add(key);\n else if (!(spec.isEqual ?? Object.is)(values.get(key) as V, entry.value))\n updated.add(key);\n else staged.delete(key);\n } else if (existed) removed.add(key);\n else staged.delete(key);\n }\n if (explicitOrder || added.size || removed.size) {\n const order = explicitOrder ?? [...ids.filter(key => !removed.has(key)), ...added];\n const seen = new Set(order);\n if (\n seen.size !== order.length ||\n order.length !== values.size + added.size - removed.size ||\n order.some(key => !hasNext(key))\n )\n throw new TypeError('Projection order must contain every key exactly once.');\n nextIds =\n ids.length === order.length && ids.every((key, i) => key === order[i])\n ? ids\n : Object.freeze(order.slice());\n }\n orderChanged = nextIds !== ids;\n if (added.size || removed.size || updated.size || orderChanged) {\n let commonOrderChanged = false;\n if (orderChanged) {\n const before = ids.filter(key => !removed.has(key));\n const after = nextIds.filter(key => !added.has(key));\n commonOrderChanged = before.some((key, i) => after[i] !== key);\n }\n change = Object.freeze({\n kind: 'incremental',\n added: readonlySet(added),\n removed: readonlySet(removed),\n updated: readonlySet(updated),\n orderChanged: commonOrderChanged,\n });\n [...added, ...removed, ...updated].forEach(key => changedKeys.add(key));\n profile.projection('changedKeys', changedKeys.size);\n }\n reset = build;\n return change !== undefined;\n },\n context: active => {\n const input: CollectionInput<K, V> = {\n get: key => {\n assertScope(active);\n return getNext(key);\n },\n has: key => {\n assertScope(active);\n return hasNext(key);\n },\n ids: () => {\n assertScope(active);\n return nextIds;\n },\n change,\n revision: revision + (change ? 1 : 0),\n reset,\n };\n return Object.freeze(input);\n },\n revision: () => revision,\n reset: () => reset,\n publish: () => {\n for (const [key, entry] of staged) {\n if (entry.present) values.set(key, entry.value);\n else values.delete(key);\n }\n if (change) {\n if (initialized) revision++;\n if (orderChanged && initialized) idsRevision++;\n all = undefined;\n changedKeys.forEach(key => {\n if (items.has(key))\n itemVersions.set(key, (itemVersions.get(key) ?? 0) + (initialized ? 1 : 0));\n });\n }\n ids = nextIds;\n initialized = true;\n },\n emit: call => {\n profile.materialized.notification();\n const fault = owner.node.fault !== undefined;\n const resetEvent = Object.freeze({ kind: 'reset' as const });\n Array.from(listeners).forEach(listener => call(() => listener(change ?? resetEvent)));\n if (orderChanged || !change || fault || owner.node.statusChanged)\n Array.from(idsListeners).forEach(listener => call(listener));\n Array.from(allListeners).forEach(listener => call(listener));\n const keys =\n !change || fault || owner.node.statusChanged ? itemListeners.keys() : changedKeys;\n for (const key of keys)\n Array.from(itemListeners.get(key) ?? []).forEach(listener => call(listener));\n },\n clear: () => {\n staged.clear();\n nextIds = ids;\n change = undefined;\n reset = false;\n changedKeys.clear();\n orderChanged = false;\n },\n release: () => {\n values.clear();\n staged.clear();\n items.clear();\n itemVersions.clear();\n itemListeners.clear();\n idsListeners.clear();\n allListeners.clear();\n listeners.clear();\n ids = nextIds = Object.freeze([]);\n all = undefined;\n instance = undefined;\n },\n });\n const handle = {\n ids: {\n current: () => {\n owner.check();\n return ids;\n },\n revision: () => {\n owner.check();\n return idsRevision;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n idsListeners.add(listener);\n return () => {\n idsListeners.delete(listener);\n };\n },\n },\n all: {\n current: () => {\n owner.check();\n if (!all) {\n profile.collectionView.arrayCopied();\n all = Object.freeze(ids.map(key => values.get(key) as V));\n }\n return all;\n },\n revision: () => {\n owner.check();\n return revision;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n allListeners.add(listener);\n return () => {\n allListeners.delete(listener);\n };\n },\n },\n item: (key: K) => {\n owner.check();\n const old = items.get(key);\n if (old) return old;\n itemVersions.set(key, 0);\n const readable: Readable<V | undefined> = Object.freeze({\n current: () => {\n owner.check();\n return values.get(key);\n },\n revision: () => {\n owner.check();\n return itemVersions.get(key) ?? 0;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n const set = itemListeners.get(key) ?? new Set();\n set.add(listener);\n itemListeners.set(key, set);\n return () => {\n set.delete(listener);\n if (!set.size) itemListeners.delete(key);\n };\n },\n });\n projectionHandles.add(readable);\n items.set(key, readable);\n return readable;\n },\n revision: () => {\n owner.check();\n return revision;\n },\n subscribe: (listener: (change: CollectionImpact<K>) => void) => {\n owner.check();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n rebuild: owner.rebuild,\n dispose: owner.dispose,\n } as ProjectionCollection<K, V>;\n projectionHandles.add(handle.ids);\n projectionHandles.add(handle.all);\n collectionHandles.add(handle);\n owner.install(handle);\n return Object.freeze(handle);\n};\n","import { documentReader, readerFor } from '../access/reader';\nimport { nodeAt } from '../address';\nimport * as target from '../impact-target';\nimport { accessOf } from '../runtime/access';\nimport { attachProjection, documentReadableOwner } from '../runtime/notification';\nimport type { DocumentCommit, DocumentReadable } from '../runtime/contract';\nimport type { DocumentSchema, ImpactTarget, CollectionSelector } from '../schema';\nimport { collectionSchema } from '../schema';\nimport type { DocumentSource, ProjectionSource, ValueInput } from './contract';\nimport { ProjectionError } from './contract';\nimport { collectionHandles } from './collection';\nimport type { Readable } from './readable';\nimport { assertScope, projectionHandles, type Scheduler, type SourceRecord } from './scheduler';\n\nexport const createSources = (scheduler: Scheduler) => {\n const documents = new Map<object, object>();\n const readables = new Map<\n object,\n Map<\n object,\n {\n readonly source: object;\n readonly accept: (value: unknown) => void;\n }\n >\n >();\n const collections = new WeakSet<object>();\n const document = <S extends DocumentSchema>(runtime: DocumentReadable<S>): DocumentSource<S> => {\n scheduler.assertIdle();\n const state = accessOf(runtime);\n if (state.disposed) throw new Error('Document has been disposed.');\n const existing = documents.get(state);\n if (existing) return existing as DocumentSource<S>;\n const bindings: { handle: object; targets: readonly ImpactTarget[]; record: SourceRecord }[] =\n [];\n const make = (targets: readonly ImpactTarget[], collection?: CollectionSelector): object => {\n if (state.disposed) throw new Error('Document has been disposed.');\n targets.forEach(value => {\n if (!target.belongs(value, state.schema))\n throw new Error('Projection target belongs to another schema.');\n });\n const old = bindings.find(\n entry =>\n Boolean(collection) === collections.has(entry.handle) &&\n entry.targets.length === targets.length &&\n entry.targets.every((value, i) => target.same(value, targets[i]))\n );\n if (old) return old.handle;\n let commits: DocumentCommit<S>[] = [];\n let reset = false;\n let orderDirty = false;\n const keys = new Set<string>();\n let candidates:\n { readonly keys: readonly string[]; readonly orderDirty: boolean } | undefined;\n const record: SourceRecord = {\n consumers: new Set(),\n disposed: false,\n fault: undefined,\n revision: runtime.revision,\n reset: () => reset,\n clear: () => {\n commits = [];\n reset = orderDirty = false;\n keys.clear();\n candidates = undefined;\n },\n context: active => {\n assertScope(active);\n if (state.disposed) throw new Error('Document has been disposed.');\n const read = collection\n ? readerFor(\n nodeAt(state.schema, collection.address, state.document) ??\n collectionSchema(collection),\n { root: () => state.document, active },\n collection.address\n )\n : documentReader(state.schema, () => state.document, active);\n return Object.freeze({\n read,\n target: collection,\n revision: runtime.revision(),\n commits: Object.freeze(commits.slice()),\n reset: record.reset(),\n ...(collection\n ? {\n candidates: (candidates ??= Object.freeze({\n keys: Object.freeze([...keys]),\n orderDirty,\n })),\n }\n : {}),\n });\n },\n };\n const handle = collection\n ? {}\n : {\n collection: (pick: Parameters<S['collection']>[0]) => {\n scheduler.assertIdle();\n const selector = state.schema.collection(pick);\n return make([selector], selector);\n },\n targets: (...selected: ImpactTarget[]) => {\n scheduler.assertIdle();\n if (!selected.length) throw new TypeError('Expected at least one target.');\n return make(selected);\n },\n };\n Object.freeze(handle);\n bindings.push({ handle, targets, record });\n if (collection) collections.add(handle);\n scheduler.register(handle, record);\n // The attachment delivers to all local bindings without extra document subscriptions.\n receivers.set(record, commit => {\n commits.push(commit);\n reset ||= commit.kind === 'replace';\n if (collection) {\n const change = commit.impact.collection(collection);\n if (change.kind === 'reset') reset = true;\n else {\n change.added.forEach(key => keys.add(key));\n change.removed.forEach(key => keys.add(key));\n change.updated.forEach(key => keys.add(key));\n orderDirty ||= Boolean(change.added.size || change.removed.size || change.orderChanged);\n }\n candidates = undefined;\n }\n });\n return handle;\n };\n const receivers = new Map<SourceRecord, (commit: DocumentCommit<S>) => void>();\n const handle = make([]) as DocumentSource<S>;\n const guard = (locked: boolean) => {\n state.projectionLocks = (state.projectionLocks ?? 0) + (locked ? 1 : -1);\n };\n scheduler.guards.add(guard);\n const unsubscribe = attachProjection(runtime, {\n capture: commit => {\n for (const binding of bindings) {\n if (!binding.targets.length || binding.targets.some(commit.impact.affects)) {\n receivers.get(binding.record)!(commit);\n scheduler.capture(binding.record);\n }\n }\n },\n settle: scheduler.settle,\n flush: scheduler.flush,\n dispose: () => {\n bindings.forEach(({ record }) => {\n record.fault = new ProjectionError(\n 'source',\n 'document disposed',\n [runtime.revision()],\n new Error('Document has been disposed.')\n );\n scheduler.capture(record);\n });\n scheduler.run();\n },\n });\n scheduler.cleanups.add(() => {\n unsubscribe();\n scheduler.guards.delete(guard);\n });\n documents.set(state, handle);\n return handle;\n };\n const valueSource = <T>(initial: T, equal: (a: T, b: T) => boolean) => {\n let value = initial;\n let previous = initial;\n let revision = 0;\n const handle = Object.freeze({}) as ProjectionSource<ValueInput<T>>;\n const record: SourceRecord = {\n consumers: new Set(),\n disposed: false,\n fault: undefined,\n revision: () => revision,\n reset: () => false,\n clear: () => {\n previous = value;\n },\n context: active => {\n assertScope(active);\n return Object.freeze({\n value,\n previous,\n revision,\n changed: !equal(previous, value),\n reset: false,\n });\n },\n };\n scheduler.register(handle, record);\n const accept = (next: T) => {\n scheduler.assertIdle();\n const recovering = record.fault !== undefined;\n if (equal(value, next) && !recovering) return;\n record.fault = undefined;\n value = next;\n revision++;\n scheduler.capture(record);\n };\n return {\n source: handle,\n accept,\n set(next: T) {\n accept(next);\n scheduler.run();\n },\n };\n };\n return {\n dispose: () => {\n documents.clear();\n readables.clear();\n },\n document,\n input: <T>(initial: T, options?: { readonly isEqual?: (a: T, b: T) => boolean }) => {\n const { source, set } = valueSource(initial, options?.isEqual ?? Object.is);\n return Object.freeze({ source, set });\n },\n fromReadable: <T>(\n readable: Readable<T>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): ProjectionSource<ValueInput<T>> => {\n scheduler.assertIdle();\n if (projectionHandles.has(readable))\n throw new Error('Projection nodes must be declared directly as sources.');\n const equal = options?.isEqual ?? Object.is;\n let bindings = readables.get(readable);\n const old = bindings?.get(equal);\n if (old) return old.source as ProjectionSource<ValueInput<T>>;\n const input = valueSource(readable.current(), equal);\n if (bindings) {\n bindings.set(equal, { source: input.source, accept: value => input.accept(value as T) });\n return input.source;\n }\n bindings = new Map([\n [equal, { source: input.source, accept: (value: unknown) => input.accept(value as T) }],\n ]);\n const members = bindings;\n const receive = (settle = true) => {\n if (!scheduler.active) return;\n let value: T;\n try {\n value = readable.current();\n } catch (cause) {\n for (const member of members.values()) {\n const record = scheduler.source(member.source);\n record.fault = new ProjectionError(\n 'source',\n 'external readable',\n [record.revision()],\n cause\n );\n scheduler.capture(record);\n }\n if (settle) scheduler.run();\n return;\n }\n for (const member of members.values()) {\n try {\n member.accept(value);\n } catch (cause) {\n const record = scheduler.source(member.source);\n record.fault = new ProjectionError(\n 'source',\n 'external readable',\n [record.revision()],\n cause\n );\n scheduler.capture(record);\n }\n }\n if (settle) scheduler.run();\n };\n let unsubscribe: (() => void) | undefined;\n let detach: (() => void) | undefined;\n try {\n const owner = documentReadableOwner(readable);\n if (owner) {\n document(owner);\n detach = attachProjection(owner, {\n capture: () => receive(false),\n settle: scheduler.settle,\n flush: scheduler.flush,\n dispose: () => {\n for (const member of members.values()) {\n const record = scheduler.source(member.source);\n record.fault = new ProjectionError(\n 'source',\n 'document readable disposed',\n [record.revision()],\n new Error('Document has been disposed.')\n );\n scheduler.capture(record);\n }\n scheduler.run();\n },\n });\n }\n unsubscribe = readable.subscribe(() => receive());\n input.accept(readable.current());\n } catch (error) {\n try {\n unsubscribe?.();\n detach?.();\n } finally {\n scheduler.unregisterSource(input.source);\n }\n throw error;\n }\n scheduler.cleanups.add(unsubscribe);\n if (detach) scheduler.cleanups.add(detach);\n readables.set(readable, bindings);\n scheduler.run();\n return input.source;\n },\n assertCollection: (handle: object) => {\n scheduler.source(handle);\n if (!collections.has(handle) && !collectionHandles.has(handle))\n throw new Error('map requires a collection source.');\n },\n };\n};\n","import type { ProjectionSources, ProjectionValue, ValueSpec } from './contract';\nimport { createNode } from './node';\nimport { assertScope, assertSynchronous, type Scheduler } from './scheduler';\nimport { profile } from '../profile';\n\nexport const createValue = <S extends ProjectionSources, T>(\n scheduler: Scheduler,\n spec: ValueSpec<S, T>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n): ProjectionValue<T> => {\n let instance: ReturnType<typeof spec.build> | undefined;\n let value!: T;\n let next!: T;\n let previous!: T;\n let initialized = false;\n let revision = 0;\n let changed = false;\n let reset = false;\n const listeners = new Set<() => void>();\n const owner = createNode(scheduler, spec, {\n evaluate: (sources, build) => {\n let candidate: T;\n if (build || !instance) {\n profile.materialized.rebuilt();\n instance = undefined;\n const built = spec.build(sources);\n assertSynchronous(built);\n instance = built;\n candidate = built.value;\n } else {\n profile.materialized.updated();\n const result = instance.update(sources);\n assertSynchronous(result);\n if (result.kind === 'rebuild') {\n instance = undefined;\n const built = spec.build(sources);\n assertSynchronous(built);\n instance = built;\n candidate = built.value;\n build = true;\n } else candidate = result.kind === 'changed' ? result.value : value;\n }\n previous = value;\n changed = !initialized || !(options?.isEqual ?? Object.is)(value, candidate);\n next = changed ? candidate : value;\n reset = build;\n return changed;\n },\n context: active => {\n assertScope(active);\n return Object.freeze({\n value: next,\n previous,\n changed,\n revision: revision + (changed ? 1 : 0),\n reset,\n });\n },\n revision: () => revision,\n reset: () => reset,\n publish: () => {\n if (changed && initialized) revision++;\n value = next;\n initialized = true;\n },\n emit: call => {\n profile.materialized.notification();\n Array.from(listeners).forEach(listener => call(listener));\n },\n clear: () => {\n next = value;\n previous = value;\n changed = false;\n reset = false;\n },\n release: () => {\n listeners.clear();\n instance = undefined;\n value = next = previous = undefined as T;\n },\n });\n const handle = Object.freeze({\n current: () => {\n owner.check();\n return value;\n },\n revision: () => {\n owner.check();\n return revision;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n rebuild: owner.rebuild,\n dispose: owner.dispose,\n }) as ProjectionValue<T>;\n owner.install(handle);\n return handle;\n};\n","import type {\n CollectionInput,\n CollectionRead,\n ProjectionInputs,\n ProjectionRuntime,\n ProjectionSource,\n ProjectionSources,\n ProjectionValue,\n ValueSpec,\n} from './contract';\nimport type { Synchronous } from '../runtime/contract';\nimport { assertSynchronous, createScheduler } from './scheduler';\nimport { createSources } from './source';\nimport { createValue } from './value';\nimport { createCollection } from './collection';\nimport type { ProjectionError } from './contract';\nimport { profile } from '../profile';\n\nconst debug = new WeakMap<\n object,\n () => { nodes: number; sources: number; subscriptions: number; pending: number }\n>();\nexport const projectionDebug = (runtime: ProjectionRuntime) => {\n const read = debug.get(runtime);\n if (!read) throw new Error('Unknown projection runtime.');\n return Object.freeze(read());\n};\nexport const createProjectionRuntime = (options: {\n readonly onError: (error: ProjectionError) => void;\n}): ProjectionRuntime => {\n const scheduler = createScheduler(options.onError);\n const sources = createSources(scheduler);\n function value<S extends ProjectionSources, T>(\n sources: S,\n compute: (sources: ProjectionInputs<S>) => Synchronous<T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ProjectionValue<T>;\n function value<S extends ProjectionSources, T>(\n spec: ValueSpec<S, T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ProjectionValue<T>;\n function value<S extends ProjectionSources, T>(\n input: S | ValueSpec<S, T>,\n computeOrOptions?:\n ((sources: ProjectionInputs<S>) => T) | { readonly isEqual?: (a: T, b: T) => boolean },\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): ProjectionValue<T> {\n if (typeof computeOrOptions !== 'function')\n return createValue(scheduler, input as ValueSpec<S, T>, computeOrOptions);\n const compute = (input: ProjectionInputs<S>) => {\n const result = computeOrOptions(input);\n assertSynchronous(result);\n return result;\n };\n return createValue(\n scheduler,\n {\n sources: input as S,\n build: input => ({\n value: compute(input),\n update: input => ({ kind: 'changed', value: compute(input) }),\n }),\n },\n options\n );\n }\n const map = <K extends string, V, R>(\n source: ProjectionSource<\n | CollectionInput<K, V>\n | {\n readonly read: CollectionRead<K, V>;\n readonly reset: boolean;\n readonly candidates: { readonly keys: readonly K[]; readonly orderDirty: boolean };\n }\n >,\n mapper: (id: K, entry: V) => R,\n options?: { readonly isEqual?: (a: R, b: R) => boolean }\n ) => {\n sources.assertCollection(source);\n const calculate = (id: K, entry: V): R => {\n const value = mapper(id, entry);\n assertSynchronous(value);\n return value;\n };\n return createCollection(scheduler, {\n sources: { source },\n isEqual: options?.isEqual,\n build: ({ sources, writer }) => {\n const input = sources.source;\n const read = 'read' in input ? input.read : input;\n const ids = read.ids();\n profile.collectionView.idsScanned(ids.length);\n for (const id of ids) {\n profile.collectionView.mapped();\n writer.set(id, calculate(id, read.get(id)!));\n }\n writer.order(ids);\n return {\n update: ({ sources, writer }) => {\n const input = sources.source;\n if (input.reset) return { kind: 'rebuild' };\n const read = 'read' in input ? input.read : input;\n let keys: Iterable<K>;\n let structural: boolean;\n if ('candidates' in input) {\n keys = input.candidates.keys;\n structural = input.candidates.orderDirty;\n } else {\n const change = input.change;\n if (!change) return;\n if (change.kind === 'reset') return { kind: 'rebuild' };\n keys = new Set([...change.added, ...change.removed, ...change.updated]);\n structural = Boolean(change.added.size || change.removed.size || change.orderChanged);\n }\n for (const key of keys) {\n if (!read.has(key)) writer.remove(key);\n else {\n profile.collectionView.mapped();\n writer.set(key, calculate(key, read.get(key)!));\n }\n }\n if (structural) {\n const ids = read.ids();\n profile.collectionView.idsScanned(ids.length);\n writer.order(ids);\n }\n },\n };\n },\n });\n };\n const runtime: ProjectionRuntime = {\n document: sources.document,\n input: sources.input,\n fromReadable: sources.fromReadable,\n value,\n collection: () => spec => createCollection(scheduler, spec),\n map,\n batch: scheduler.batch,\n dispose: () => {\n try {\n scheduler.dispose();\n } finally {\n if (!scheduler.active) sources.dispose();\n }\n },\n };\n debug.set(runtime, scheduler.debug);\n return Object.freeze(runtime);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"runtime-DF1q9Gje.js","names":["schemaRoot","address","readAddress","isRecord","anchor.keys","target.bucket","target.belongs","target.same"],"sources":["../core/src/schema.ts","../core/src/address.ts","../core/src/impact-target.ts","../core/src/runtime/contract.ts","../core/src/mutation/anchor.ts","../core/src/access/reader.ts","../core/src/mutation/footprint.ts","../core/src/runtime/access.ts","../core/src/runtime/notification.ts","../core/src/projection/contract.ts","../core/src/projection/scheduler.ts","../core/src/projection/node.ts","../core/src/projection/collection.ts","../core/src/projection/source.ts","../core/src/projection/value.ts","../core/src/projection/runtime.ts"],"sourcesContent":["export type DocumentAddress = readonly string[];\n\nexport type DocumentListConfig<TItem> = {\n readonly keyOf: (item: TItem) => string;\n};\nexport type DocumentTreeNode<TValue> = {\n readonly parentId?: string;\n readonly children: readonly string[];\n readonly value?: TValue;\n};\nexport type DocumentTreeValue<TValue> = {\n readonly rootId?: string;\n readonly nodes: Readonly<Record<string, DocumentTreeNode<TValue>>>;\n};\n\ntype BaseNode<K extends string> = {\n readonly kind: K;\n readonly optional?: boolean;\n};\nexport type FieldNode<T, Optional extends boolean = false> = BaseNode<'field'> & {\n readonly __value?: T;\n} & (Optional extends true ? { readonly optional: true } : { readonly optional?: false });\n/** A node with optional presence. The marker replaces, rather than intersects, a field marker. */\nexport type OptionalNode<TNode extends DocumentNode> =\n TNode extends FieldNode<infer TValue, boolean>\n ? FieldNode<TValue, true>\n : TNode & { readonly optional: true };\nexport interface ObjectShape {\n readonly [key: string]: DocumentNode;\n}\nexport type ObjectNode<TShape extends ObjectShape> = BaseNode<'object'> & {\n readonly shape: TShape;\n};\nexport interface VariantShape {\n readonly [key: string]: ObjectNode<ObjectShape>;\n}\nexport type VariantNode<\n TTag extends string,\n TVariants extends VariantShape,\n> = BaseNode<'variant'> & {\n readonly tag: TTag;\n readonly variants: TVariants;\n};\nexport type TableNode<TValue extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>> =\n BaseNode<'table'> & {\n readonly value: TValue;\n };\nexport type MapNode<TValue extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>> =\n BaseNode<'map'> & {\n readonly value: TValue;\n };\nexport type DictNode<TKey extends string, TValue> = BaseNode<'dict'> & {\n readonly __key?: TKey;\n readonly __value?: TValue;\n};\nexport type ListNode<TItem> = BaseNode<'list'> & {\n readonly __item?: TItem;\n keyOf(item: TItem): string;\n};\nexport type TreeNode<TValue> = BaseNode<'tree'> & {\n readonly __value?: TValue;\n};\n\nexport type DocumentNode =\n | FieldNode<unknown, false>\n | FieldNode<unknown, true>\n | ObjectNode<ObjectShape>\n | VariantNode<string, VariantShape>\n | TableNode<ObjectNode<ObjectShape> | VariantNode<string, VariantShape>>\n | MapNode<ObjectNode<ObjectShape> | VariantNode<string, VariantShape>>\n | DictNode<string, unknown>\n | ListNode<unknown>\n | TreeNode<unknown>;\n\n// Flatten only schema-generated objects; user-supplied field values stay opaque.\ntype SchemaObject<T> = { [K in keyof T]: T[K] } & {};\n\n/** Infer a document or node value, including optional node presence. */\nexport type Infer<T extends DocumentNode | DocumentSchema> =\n T extends DocumentSchema<infer S>\n ? ShapeValue<S>\n : T extends { readonly optional: true }\n ? NodeValue<T> | undefined\n : NodeValue<T>;\n\ntype NodeValue<N> =\n N extends FieldNode<infer T, infer O>\n ? O extends true\n ? T | undefined\n : T\n : N extends ObjectNode<infer S>\n ? ShapeValue<S>\n : N extends VariantNode<infer T, infer V>\n ? {\n [K in keyof V & string]: SchemaObject<{ readonly [P in T]: K } & NodeValue<V[K]>>;\n }[keyof V & string]\n : N extends TableNode<infer V>\n ? {\n readonly ids: readonly string[];\n readonly byId: Readonly<Record<string, NodeValue<V>>>;\n }\n : N extends MapNode<infer V>\n ? Readonly<Record<string, NodeValue<V>>>\n : N extends DictNode<infer K, infer T>\n ? Readonly<Partial<Record<K, T>>>\n : N extends ListNode<infer I>\n ? readonly I[]\n : N extends TreeNode<infer T>\n ? DocumentTreeValue<T>\n : never;\n\ntype OptionalKeys<S extends ObjectShape> = {\n [K in keyof S]: S[K] extends { readonly optional: true } ? K : never;\n}[keyof S];\ntype RequiredKeys<S extends ObjectShape> = Exclude<keyof S, OptionalKeys<S>>;\ntype ShapeValue<S extends ObjectShape> = SchemaObject<\n { readonly [K in RequiredKeys<S>]: NodeValue<S[K]> } & {\n readonly [K in OptionalKeys<S>]?: NodeValue<S[K]>;\n }\n>;\n\nexport type EntitySchemaNode = ObjectNode<ObjectShape> | VariantNode<string, VariantShape>;\n\nexport type CollectionSelector<\n TId extends string = string,\n TNode extends EntitySchemaNode = EntitySchemaNode,\n> = {\n readonly kind: 'collection';\n readonly schema: DocumentSchema;\n readonly address: DocumentAddress;\n readonly __id?: TId;\n /** Compile-time entry schema carried by schema selectors. */\n readonly __node?: TNode;\n};\nexport type ValueSelector<TResult = unknown> = {\n readonly kind: 'value';\n readonly schema: DocumentSchema;\n readonly address: DocumentAddress;\n readonly __value?: TResult;\n};\nexport type ImpactTarget<T = unknown> =\n | { readonly kind: 'value'; readonly at: DocumentAddress }\n | ValueSelector<T>\n | {\n readonly kind: 'collection';\n readonly at: DocumentAddress;\n readonly id?: string;\n }\n | CollectionSelector<string>;\ndeclare const pathValue: unique symbol;\ndeclare const collectionNode: unique symbol;\ntype PathMarker<TValue> = { readonly [pathValue]: TValue };\n\ntype SchemaPathFor<S extends ObjectShape = ObjectShape, TValue = unknown> = {\n readonly [K in keyof S]: PathValue<S[K]>;\n} & PathMarker<TValue>;\n\nexport type DocumentSchema<TShape extends ObjectShape = {}> = {\n readonly kind: 'schema';\n readonly shape: TShape;\n collection<TPath extends CollectionPath>(\n pick: (path: SchemaPath<TShape>) => TPath\n ): CollectionSelector<CollectionId<TPath>, CollectionNode<TPath>>;\n value<TPath extends PathMarker<unknown>>(\n pick: (path: SchemaPath<TShape>) => TPath\n ): ValueSelector<PathValueResult<TPath>>;\n};\n\nexport type SchemaPath<S extends ObjectShape = {}> = SchemaPathFor<S, ShapeValue<S>>;\n\ntype VariantKeys<V extends VariantShape> = {\n [K in keyof V & string]: keyof (V[K] extends ObjectNode<infer S> ? S : {});\n}[keyof V & string] &\n string;\ntype VariantFieldPath<V extends VariantShape, K extends string> = {\n [P in keyof V & string]: V[P] extends ObjectNode<infer S>\n ? K extends keyof S\n ? PathValue<S[K]>\n : never\n : never;\n}[keyof V & string];\ntype VariantPath<T extends string, V extends VariantShape, TValue> = {\n readonly [K in VariantKeys<V>]: VariantFieldPath<V, K>;\n} & { readonly [K in T]: PathMarker<keyof V & string> } & PathMarker<TValue>;\ntype EntityPath<N extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>> =\n N extends ObjectNode<infer S>\n ? SchemaPathFor<S, Infer<N>>\n : N extends VariantNode<infer T, infer V>\n ? VariantPath<T, V, Infer<N>>\n : never;\nexport type CollectionPath<\n N extends EntitySchemaNode = EntitySchemaNode,\n TValue = unknown,\n> = PathMarker<TValue> & {\n readonly item: (id: string) => EntityPath<N>;\n readonly [collectionNode]: N;\n};\n\ntype PathValue<N extends DocumentNode> =\n N extends ObjectNode<infer S>\n ? SchemaPathFor<S, Infer<N>>\n : N extends VariantNode<infer TTag, infer V>\n ? VariantPath<TTag, V, Infer<N>>\n : N extends TableNode<infer V> | MapNode<infer V>\n ? CollectionPath<V, Infer<N>>\n : PathMarker<Infer<N>>;\ntype CollectionInfo<T> = T extends {\n readonly [collectionNode]: infer TNode extends EntitySchemaNode;\n}\n ? { readonly id: string; readonly node: TNode }\n : never;\ntype CollectionId<T> =\n CollectionInfo<T> extends { readonly id: infer TId extends string } ? TId : string;\nexport type CollectionNode<T> =\n CollectionInfo<T> extends { readonly node: infer TNode extends EntitySchemaNode }\n ? TNode\n : EntitySchemaNode;\ntype PathValueResult<T> = T extends PathMarker<infer TValue> ? TValue : unknown;\n\nconst node = <T extends DocumentNode>(value: T): T => Object.freeze(value);\nexport const field = <T>(): FieldNode<T> => node({ kind: 'field' });\ntype OptionalLeaf =\n | FieldNode<unknown, boolean>\n | VariantNode<string, VariantShape>\n | DictNode<string, unknown>\n | ListNode<unknown>\n | TreeNode<unknown>;\nexport const optional = <T extends OptionalLeaf>(value: T): OptionalNode<T> => {\n if (!['field', 'variant', 'dict', 'list', 'tree'].includes(value.kind))\n throw new TypeError(\n 'Only field, variant, dict, list and tree nodes support optional presence.'\n );\n return node({ ...value, optional: true } as OptionalNode<T>);\n};\nexport const object = <S extends ObjectShape>(shape: S): ObjectNode<S> =>\n node({ kind: 'object', shape });\nexport const variant = <T extends string, V extends VariantShape>(\n tag: T,\n variants: V\n): VariantNode<T, V> => node({ kind: 'variant', tag, variants });\nexport const table = <V extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>>(\n value: V\n): TableNode<V> => node({ kind: 'table', value });\nexport const map = <V extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>>(\n value: V\n): MapNode<V> => node({ kind: 'map', value });\nexport const dict = <TKey extends string = string, TValue = unknown>(): DictNode<TKey, TValue> =>\n node({ kind: 'dict' });\nexport const list = <TItem>(config: DocumentListConfig<TItem>): ListNode<TItem> =>\n ({ kind: 'list', keyOf: config.keyOf }) as ListNode<TItem>;\nexport const tree = <TValue = unknown>(): TreeNode<TValue> => node({ kind: 'tree' });\n\nconst paths = new WeakMap<\n object,\n {\n readonly address: DocumentAddress;\n readonly nodes: readonly DocumentNode[];\n readonly owner: object;\n }\n>();\nconst collectionSchemas = new WeakMap<\n object,\n TableNode<EntitySchemaNode> | MapNode<EntitySchemaNode>\n>();\nexport const collectionSchema = (\n selector: CollectionSelector\n): TableNode<EntitySchemaNode> | MapNode<EntitySchemaNode> => {\n const node = collectionSchemas.get(selector);\n if (!node) throw new TypeError('Expected a schema-owned collection selector.');\n return node;\n};\n\nconst pathProxy = (\n nodes: readonly DocumentNode[],\n address: DocumentAddress,\n owner: object\n): object => {\n const proxy = new Proxy(\n {},\n {\n get: (_target, property: string | symbol) => {\n if (typeof property !== 'string') return undefined;\n const collection = nodes.every(node => node.kind === 'table' || node.kind === 'map');\n if (collection && property === 'item')\n return (id: string) => {\n if (typeof id !== 'string') throw new TypeError('Collection keys must be strings.');\n return pathProxy(\n nodes.map(node => (node as TableNode<EntitySchemaNode>).value),\n [...address, id],\n owner\n );\n };\n const children = nodes.flatMap(node => {\n if (node.kind === 'object') return node.shape[property] ? [node.shape[property]] : [];\n if (node.kind !== 'variant') return [];\n if (property === node.tag) return [field<string>()];\n return Object.values(node.variants).flatMap(branch =>\n branch.shape[property] ? [branch.shape[property]] : []\n );\n });\n if (!children.length) throw new TypeError(`Invalid schema path segment: ${property}`);\n return pathProxy(children, [...address, property], owner);\n },\n }\n );\n paths.set(proxy, { nodes, address, owner });\n return proxy;\n};\n\nconst select = <S extends ObjectShape>(\n owner: DocumentSchema<S>,\n kind: 'collection' | 'value',\n pick: (path: SchemaPath<S>) => unknown\n): CollectionSelector | ValueSelector => {\n const scope = {};\n const value = pick(pathProxy([object(owner.shape)], [], scope) as SchemaPath<S>);\n const selected = typeof value === 'object' && value !== null ? paths.get(value) : undefined;\n if (!selected || selected.owner !== scope)\n throw new TypeError('Selector must return a path from its callback.');\n if (\n kind === 'collection' &&\n !selected.nodes.every(node => node.kind === 'table' || node.kind === 'map')\n )\n throw new TypeError('Collection selectors require a table or map path.');\n const result = Object.freeze({\n kind,\n schema: owner,\n address: Object.freeze([...selected.address]),\n }) as CollectionSelector | ValueSelector;\n if (kind === 'collection')\n collectionSchemas.set(\n result,\n selected.nodes[0] as TableNode<EntitySchemaNode> | MapNode<EntitySchemaNode>\n );\n return result;\n};\n\nexport const schema = <S extends ObjectShape>(shape: S): DocumentSchema<S> => {\n const result: DocumentSchema<S> = {\n kind: 'schema',\n shape,\n collection: <TPath extends CollectionPath>(pick: (path: SchemaPath<S>) => TPath) =>\n select(result, 'collection', pick) as CollectionSelector<\n CollectionId<TPath>,\n CollectionNode<TPath>\n >,\n value: <TPath extends PathMarker<unknown>>(pick: (path: SchemaPath<S>) => TPath) =>\n select(result, 'value', pick) as ValueSelector<PathValueResult<TPath>>,\n };\n return Object.freeze(result);\n};\n","import type { DocumentAddress, DocumentNode, DocumentSchema, ObjectShape } from './schema';\nimport { profile } from './profile';\n\n/** The only resolved address representation used inside the runtime. */\nexport type AddressRef = {\n readonly path: number;\n readonly address: DocumentAddress;\n};\n\ntype RegistryNode = {\n readonly static: Map<string, RegistryNode>;\n dynamic?: RegistryNode;\n path?: number;\n};\n\ntype Registry = {\n readonly root: RegistryNode;\n nextPath: number;\n};\n\nconst registries = new WeakMap<object, Registry>();\nconst registryNode = (): RegistryNode => ({ static: new Map() });\nconst registryFor = (schema: DocumentSchema): Registry => {\n const cached = registries.get(schema as object);\n if (cached) return cached;\n const registry: Registry = { root: registryNode(), nextPath: 0 };\n registries.set(schema as object, registry);\n return registry;\n};\n\nconst hashText = (value: string, seed: number): number => {\n let hash = seed;\n for (let index = 0; index < value.length; index += 1)\n hash = Math.imul(hash ^ value.charCodeAt(index), 16_777_619);\n return hash >>> 0;\n};\n\nconst appendAddressHash = (hash: number, segment: string): number =>\n hashText(segment, hashText('/', hash));\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst variantNode = (\n node: Extract<DocumentNode, { kind: 'variant' }>,\n value: unknown\n): DocumentNode | undefined => {\n const tag = isRecord(value) && typeof value[node.tag] === 'string' ? value[node.tag] : undefined;\n return node.variants[String(tag ?? Object.keys(node.variants)[0] ?? '')];\n};\n\nconst schemaRoot = (schema: DocumentSchema): DocumentNode => ({\n kind: 'object',\n shape: schema.shape,\n});\n\ntype Step = {\n readonly node: DocumentNode | undefined;\n readonly dynamic: boolean;\n};\n\nconst step = (nodeInput: DocumentNode | undefined, value: unknown, segment: string): Step => {\n let node = nodeInput;\n if (!node) return { node: undefined, dynamic: false };\n if (node.kind === 'variant') {\n node = variantNode(node, value);\n }\n if (!node) return { node: undefined, dynamic: false };\n if (node.kind === 'object') return { node: node.shape[segment], dynamic: false };\n if (node.kind === 'table' || node.kind === 'map') return { node: node.value, dynamic: true };\n // These nodes use operation-specific keys rather than address segments, but\n // accepting a dynamic step keeps address resolution total for user targets.\n if (node.kind === 'dict' || node.kind === 'list' || node.kind === 'tree')\n return { node, dynamic: true };\n return { node: undefined, dynamic: false };\n};\n\nconst pathFor = (\n schema: DocumentSchema,\n address: DocumentAddress,\n document?: unknown\n): number | undefined => {\n const registry = registryFor(schema);\n let trie = registry.root;\n let node: DocumentNode | undefined = schemaRoot(schema);\n let value: unknown = document;\n for (const segment of address) {\n profile.address.schemaStep();\n profile.address.documentStep();\n const resolved = step(node, value, segment);\n if (!resolved.node) return undefined;\n const next = resolved.dynamic\n ? (trie.dynamic ??= registryNode())\n : (() => {\n const existing = trie.static.get(segment);\n if (existing) return existing;\n const created = registryNode();\n trie.static.set(segment, created);\n return created;\n })();\n trie = next;\n node = resolved.node;\n value = readSegment(value, segment);\n }\n if (trie.path === undefined) trie.path = registry.nextPath++;\n return trie.path;\n};\n\nexport const resolveAddress = (\n schema: DocumentSchema,\n address: DocumentAddress,\n document?: unknown\n): AddressRef | undefined => {\n if (!Array.isArray(address)) return undefined;\n for (const segment of address) if (typeof segment !== 'string') return undefined;\n profile.address.arrayCopied();\n const owned = Object.freeze(address.slice()) as DocumentAddress;\n const path = pathFor(schema, owned, document);\n return path === undefined ? undefined : { path, address: owned };\n};\n\nexport const nodeAt = (\n schema: DocumentSchema,\n address: DocumentAddress,\n document?: unknown\n): DocumentNode | undefined => {\n let node: DocumentNode | undefined = schemaRoot(schema);\n let value = document;\n for (const segment of address) {\n const resolved = step(node, value, segment);\n node = resolved.node;\n value = readSegment(value, segment);\n if (!node) return undefined;\n }\n return node;\n};\n\nexport const readSegment = (value: unknown, segment: string): unknown => {\n if (!isRecord(value) && !Array.isArray(value)) return undefined;\n if (isRecord(value) && 'byId' in value && isRecord(value.byId)) {\n const entity = value.byId[segment];\n if (entity !== undefined || Object.prototype.hasOwnProperty.call(value.byId, segment))\n return entity;\n }\n return (value as Record<string, unknown>)[segment];\n};\n\nexport const read = (root: unknown, address: DocumentAddress): unknown => {\n let value = root;\n for (const segment of address) {\n value = readSegment(value, segment);\n if (value === undefined) return undefined;\n }\n return value;\n};\n\nexport type Located = {\n readonly parent: Record<string, unknown> | unknown[];\n readonly key: string | number;\n readonly value: unknown;\n};\n\ntype ResolvedCollection = {\n readonly address: DocumentAddress;\n readonly addressHash: number;\n readonly id: string;\n readonly parent?: ResolvedCollection;\n};\n\nexport type ResolvedAddress = Located & {\n readonly addressHash: number;\n readonly node: DocumentNode;\n readonly collection?: ResolvedCollection;\n};\n\n/** Resolves schema and document location in one address traversal. */\nexport const resolveLocated = (\n schema: DocumentSchema,\n root: unknown,\n address: DocumentAddress\n): ResolvedAddress | undefined => {\n if (address.length === 0) return undefined;\n let node: DocumentNode | undefined = schemaRoot(schema);\n let current: unknown = root;\n let collection: ResolvedCollection | undefined;\n let addressHash = 2_166_136_261;\n for (let index = 0; index < address.length - 1; index += 1) {\n profile.address.schemaStep();\n profile.address.documentStep();\n const resolved = step(node, current, address[index]);\n if (!resolved.node) return undefined;\n if (node?.kind === 'table' || node?.kind === 'map')\n collection = {\n address: address.slice(0, index),\n addressHash,\n id: address[index],\n ...(collection ? { parent: collection } : {}),\n };\n addressHash = appendAddressHash(addressHash, address[index]);\n node = resolved.node;\n current = readSegment(current, address[index]);\n if (!node) return undefined;\n }\n profile.address.schemaStep();\n profile.address.documentStep();\n const last = address[address.length - 1];\n const resolved = step(node, current, last);\n if (!resolved.node || (!isRecord(current) && !Array.isArray(current))) return undefined;\n if (node?.kind === 'table' || node?.kind === 'map')\n collection = {\n address: address.slice(0, -1),\n addressHash,\n id: last,\n ...(collection ? { parent: collection } : {}),\n };\n addressHash = appendAddressHash(addressHash, last);\n if (isRecord(current) && 'byId' in current && isRecord(current.byId) && last in current.byId)\n return {\n addressHash,\n node: resolved.node,\n parent: current.byId,\n key: last,\n value: current.byId[last],\n ...(collection ? { collection } : {}),\n };\n return {\n addressHash,\n node: resolved.node,\n parent: current,\n key: Array.isArray(current) && /^\\d+$/.test(last) ? Number(last) : last,\n value: readSegment(current, last),\n ...(collection ? { collection } : {}),\n };\n};\n\nexport const locate = (root: unknown, address: DocumentAddress): Located | undefined => {\n if (address.length === 0) return undefined;\n let current: unknown = root;\n for (let index = 0; index < address.length - 1; index += 1)\n current = readSegment(current, address[index]);\n if (!isRecord(current) && !Array.isArray(current)) return undefined;\n const last = address[address.length - 1];\n if (isRecord(current) && 'byId' in current && isRecord(current.byId) && last in current.byId)\n return { parent: current.byId, key: last, value: current.byId[last] };\n return {\n parent: current,\n key: Array.isArray(current) && /^\\d+$/.test(last) ? Number(last) : last,\n value: readSegment(current, last),\n };\n};\n\nexport const set = (root: unknown, address: DocumentAddress, value: unknown): boolean => {\n const target = locate(root, address);\n if (!target) return false;\n (target.parent as Record<string | number, unknown>)[target.key] = value;\n return true;\n};\n\nexport const remove = (root: unknown, address: DocumentAddress): boolean => {\n const target = locate(root, address);\n if (!target || !Object.prototype.hasOwnProperty.call(target.parent, target.key)) return false;\n if (Array.isArray(target.parent)) target.parent.splice(Number(target.key), 1);\n else delete target.parent[String(target.key)];\n return true;\n};\n\nexport const contains = (parent: DocumentAddress, child: DocumentAddress): boolean => {\n profile.address.prefixComparison();\n if (parent.length > child.length) return false;\n for (let index = 0; index < parent.length; index += 1) {\n profile.address.segmentCompared();\n if (parent[index] !== child[index]) return false;\n }\n return true;\n};\n\nexport const overlaps = (a: DocumentAddress, b: DocumentAddress): boolean =>\n contains(a, b) || contains(b, a);\n\nexport const debugKey = (address: DocumentAddress): string => {\n let result = '';\n for (let index = 0; index < address.length; index += 1) {\n if (index > 0) result += '/';\n result += address[index].replaceAll('~', '~~').replaceAll('/', '~/');\n }\n return result;\n};\n\nexport const same = (a: AddressRef, b: AddressRef): boolean => {\n if (a.path !== b.path || a.address.length !== b.address.length) return false;\n for (let index = 0; index < a.address.length; index += 1) {\n profile.address.segmentCompared();\n if (a.address[index] !== b.address[index]) return false;\n }\n return true;\n};\n\nexport type { DocumentAddress } from './schema';\n","import type { DocumentAddress, DocumentSchema, ImpactTarget } from './schema';\n\nexport const address = (target: ImpactTarget<unknown>): DocumentAddress =>\n 'at' in target ? target.at : target.address;\n\nexport const id = (target: ImpactTarget<unknown>): string | undefined =>\n target.kind === 'collection' && 'id' in target ? target.id : undefined;\n\nexport const belongs = (target: ImpactTarget<unknown>, schema: DocumentSchema): boolean =>\n !('schema' in target) || target.schema === schema;\n\nexport const same = (left: ImpactTarget<unknown>, right: ImpactTarget<unknown>): boolean => {\n if (left.kind !== right.kind) return false;\n if ('schema' in left && 'schema' in right && left.schema !== right.schema) return false;\n const leftAddress = address(left);\n const rightAddress = address(right);\n if (leftAddress.length !== rightAddress.length) return false;\n for (let index = 0; index < leftAddress.length; index += 1)\n if (leftAddress[index] !== rightAddress[index]) return false;\n return left.kind !== 'collection' || id(left) === id(right);\n};\n\nexport const bucket = (target: ImpactTarget<unknown>): string | undefined => address(target)[0];\n","import type { DocumentAddress, DocumentSchema, ImpactTarget, Infer } from '../schema';\nimport type { AddressRef } from '../address';\nimport type { DocumentOperation } from '../operations';\nimport type { DocumentImpact } from '../impact';\nimport type { DocumentReader } from '../access/reader';\nimport type { DocumentWriter } from '../access/writer';\nimport type { MutationIssue } from '../mutation/issue';\nimport type { CommandFootprint } from '../mutation/footprint';\nimport type { Readable } from '../projection/readable';\n\nexport type Unsubscribe = () => void;\nexport type Synchronous<T> = T extends PromiseLike<unknown> ? never : T;\nexport type CommitSource = 'local' | 'system' | 'history' | 'remote';\n\nexport class DocumentReentrancyError extends Error {\n constructor() {\n super('Document writes cannot be re-entered during an update or notification.');\n this.name = 'DocumentReentrancyError';\n }\n}\n\nexport class DocumentDisposedError extends Error {\n constructor() {\n super('Doxum runtime has been disposed.');\n this.name = 'DocumentDisposedError';\n }\n}\nexport type DocumentCommit<TSchema extends DocumentSchema> = {\n readonly revision: number;\n readonly kind: 'operations' | 'replace';\n readonly source: CommitSource;\n readonly operations: readonly DocumentOperation[];\n readonly inverse: readonly DocumentOperation[];\n readonly impact: DocumentImpact<TSchema>;\n};\nexport type DiagnosticInput = {\n readonly code: string;\n readonly message: string;\n readonly address?: DocumentAddress;\n};\nexport type DocumentDiagnostic = DiagnosticInput & { readonly source: 'application' };\nexport type DocumentProblem = DocumentDiagnostic | MutationIssue;\nexport type ObserverError = {\n readonly phase: 'processor' | 'flush' | 'listener';\n readonly error: unknown;\n};\nexport type TransactionResult<TValue, TCommit> =\n | {\n readonly status: 'committed';\n readonly value: TValue;\n readonly commit: TCommit;\n readonly reports: readonly DocumentDiagnostic[];\n readonly observerErrors: readonly ObserverError[];\n }\n | {\n readonly status: 'unchanged';\n readonly value: TValue;\n readonly revision: number;\n readonly reports: readonly DocumentDiagnostic[];\n }\n | {\n readonly status: 'rejected';\n readonly issues: readonly DocumentProblem[];\n readonly revision: number;\n };\nexport type PreparedUpdateResult<TValue, TSchema extends DocumentSchema> =\n | {\n readonly status: 'prepared';\n readonly value: TValue;\n readonly operations: readonly DocumentOperation[];\n readonly inverse: readonly DocumentOperation[];\n readonly impact: DocumentImpact<TSchema>;\n readonly footprint: CommandFootprint;\n readonly reports: readonly DocumentDiagnostic[];\n }\n | {\n readonly status: 'unchanged';\n readonly value: TValue;\n readonly reports: readonly DocumentDiagnostic[];\n }\n | {\n readonly status: 'rejected';\n readonly issues: readonly DocumentProblem[];\n };\nexport type OperationResult<TCommit> =\n | {\n readonly status: 'committed';\n readonly commit: TCommit;\n readonly observerErrors: readonly ObserverError[];\n }\n | { readonly status: 'unchanged'; readonly revision: number }\n | {\n readonly status: 'rejected';\n readonly issues: readonly MutationIssue[];\n readonly revision: number;\n };\n\nexport type HistoryState = {\n readonly undoDepth: number;\n readonly redoDepth: number;\n};\nexport type LocalHistory<TCommit> = Readable<HistoryState> & {\n undo(): OperationResult<TCommit>;\n redo(): OperationResult<TCommit>;\n clear(): void;\n group(): { end(): void; cancel(): OperationResult<TCommit> };\n};\n\nexport type DocumentTransaction<TSchema extends DocumentSchema> = {\n readonly read: DocumentReader<TSchema>;\n readonly write: DocumentWriter<TSchema>;\n readonly reject: (issue: DiagnosticInput | readonly DiagnosticInput[]) => never;\n readonly report: (issue: DiagnosticInput) => void;\n};\nexport type CommitListener<TSchema extends DocumentSchema> = (\n commit: DocumentCommit<TSchema>\n) => void;\n\nexport type DocumentReadable<TSchema extends DocumentSchema> = {\n readonly address: {\n readonly resolve: (address: DocumentAddress) => AddressRef | undefined;\n readonly read: (address: DocumentAddress) => unknown;\n readonly contains: (parent: DocumentAddress, child: DocumentAddress) => boolean;\n readonly overlaps: (left: DocumentAddress, right: DocumentAddress) => boolean;\n readonly debugKey: (address: DocumentAddress) => string;\n };\n revision(): number;\n subscribe(listener: CommitListener<TSchema>): Unsubscribe;\n subscribe(\n target: ImpactTarget<unknown> | readonly [ImpactTarget<unknown>, ...ImpactTarget<unknown>[]],\n listener: CommitListener<TSchema>\n ): Unsubscribe;\n};\n\nexport type DocumentRuntime<TSchema extends DocumentSchema> = DocumentReadable<TSchema> & {\n /** Schema configuration captured when this runtime was created. */\n readonly schema: TSchema;\n update<TResult>(\n run: (transaction: DocumentTransaction<TSchema>) => Synchronous<TResult>,\n options?: {\n readonly source?: Extract<CommitSource, 'local' | 'system'>;\n readonly history?: boolean;\n }\n ): TransactionResult<TResult, DocumentCommit<TSchema>>;\n prepare<TResult>(\n run: (transaction: DocumentTransaction<TSchema>) => Synchronous<TResult>\n ): PreparedUpdateResult<TResult, TSchema>;\n apply(\n operations: unknown,\n options?: {\n readonly source?: Exclude<CommitSource, 'history'>;\n readonly history?: boolean;\n }\n ): OperationResult<DocumentCommit<TSchema>>;\n replace(\n document: Infer<TSchema>,\n options?: { readonly source?: Extract<CommitSource, 'system' | 'remote'> }\n ): OperationResult<DocumentCommit<TSchema>>;\n snapshot(): Infer<TSchema>;\n readonly history: LocalHistory<DocumentCommit<TSchema>>;\n dispose(): void;\n};\n","import type { DocumentAnchor } from '../operations';\n\nexport type KeyOrder = {\n readonly length: number;\n readonly at: (index: number) => string | undefined;\n readonly index: (key: string) => number;\n};\n\ntype Keys = readonly string[] | KeyOrder;\n\nconst length = (keys: Keys): number => keys.length;\nconst keyAt = (keys: Keys, index: number): string | undefined =>\n Array.isArray(keys) ? keys[index] : keys.at(index);\nconst keyIndex = (keys: Keys, key: string): number =>\n Array.isArray(keys) ? keys.indexOf(key) : (keys as KeyOrder).index(key);\n\nexport const keys = (values: readonly unknown[], keyOf: (value: unknown) => string): KeyOrder => ({\n length: values.length,\n at: index => (index >= 0 && index < values.length ? keyOf(values[index]) : undefined),\n index: key => {\n for (let index = 0; index < values.length; index += 1)\n if (keyOf(values[index]) === key) return index;\n return -1;\n },\n});\n\nexport const index = (keys: Keys, anchor?: DocumentAnchor): number => {\n if (!anchor) return length(keys);\n if ('at' in anchor) return anchor.at === 'start' ? 0 : length(keys);\n if ('before' in anchor) return keyIndex(keys, anchor.before);\n return keyIndex(keys, anchor.after) + 1;\n};\n\nexport const at = (keys: Keys, position: number): DocumentAnchor =>\n position <= 0 ? { at: 'start' } : { after: keyAt(keys, position - 1) as string };\n\nexport const valid = (keys: Keys, anchor?: DocumentAnchor): boolean => {\n if (!anchor) return true;\n if (typeof anchor !== 'object' || anchor === null) return false;\n if (Number('at' in anchor) + Number('before' in anchor) + Number('after' in anchor) !== 1)\n return false;\n if ('at' in anchor) return anchor.at === 'start' || anchor.at === 'end';\n return keyIndex(keys, 'before' in anchor ? anchor.before : anchor.after) >= 0;\n};\n\nexport const afterRemove = (keys: Keys, removedIndex: number, anchor?: DocumentAnchor): number => {\n const position = index(keys, anchor);\n return position > removedIndex ? position - 1 : position;\n};\n\nexport const validPositions = (length: number, positions: readonly number[]): boolean => {\n let previous = -1;\n for (let index = 0; index < positions.length; index += 1) {\n const position = positions[index];\n if (\n !Number.isInteger(position) ||\n position < 0 ||\n position <= previous ||\n position > length + index\n )\n return false;\n previous = position;\n }\n return true;\n};\n\nexport const restore = (\n keys: string[],\n inserted: readonly string[],\n positions: readonly number[]\n): void => {\n const currentLength = keys.length;\n if (inserted.length !== positions.length || !validPositions(currentLength, positions))\n throw new Error('Ordered restore positions are invalid.');\n let readIndex = currentLength - 1;\n let insertedIndex = inserted.length - 1;\n keys.length = currentLength + inserted.length;\n for (let writeIndex = keys.length - 1; writeIndex >= 0; writeIndex -= 1) {\n if (insertedIndex >= 0 && positions[insertedIndex] === writeIndex) {\n keys[writeIndex] = inserted[insertedIndex];\n insertedIndex -= 1;\n } else {\n keys[writeIndex] = keys[readIndex];\n readIndex -= 1;\n }\n }\n};\n","import { object } from '../schema';\nimport type {\n DictNode,\n DocumentAddress,\n DocumentNode,\n DocumentSchema,\n Infer,\n EntitySchemaNode,\n ImpactTarget,\n ListNode,\n MapNode,\n ObjectNode,\n TableNode,\n TreeNode,\n VariantNode,\n} from '../schema';\nimport { read as readAddress } from '../address';\nimport { cloneValue, isRecord } from '../value/ownership';\nimport { profile } from '../profile';\nimport type { DependencyTracker } from './dependency';\nimport * as anchor from '../mutation/anchor';\n\nexport type FieldReader<T> = { readonly get: () => T };\nexport type DictionaryReader<K extends string, V> = {\n get(key: K): V | undefined;\n has(key: K): boolean;\n keys(): readonly K[];\n values(): Readonly<Partial<Record<K, V>>>;\n};\nexport type CollectionReader<TId, TNode extends EntitySchemaNode> = {\n readonly ids: () => readonly TId[];\n readonly has: (id: TId) => boolean;\n readonly get: (id: TId) => ReaderOfNode<TNode> | undefined;\n};\nexport type ListReader<T> = {\n readonly get: (key: string) => T | undefined;\n readonly has: (key: string) => boolean;\n readonly values: () => readonly T[];\n readonly length: () => number;\n readonly at: (index: number) => T | undefined;\n};\nexport type TreeReader<T> = {\n readonly rootId: () => string | undefined;\n readonly has: (id: string) => boolean;\n readonly value: (id: string) => T | undefined;\n readonly parent: (id: string) => string | undefined;\n readonly children: (id: string) => readonly string[];\n};\n\nexport type ReaderOfNode<TNode extends DocumentNode> = TNode extends {\n kind: 'field';\n}\n ? FieldReader<Infer<TNode>>\n : TNode extends ObjectNode<infer TShape>\n ? { readonly [K in keyof TShape]: ReaderOfNode<TShape[K]> }\n : TNode extends VariantNode<string, infer _TVariants>\n ? FieldReader<Infer<TNode>>\n : TNode extends TableNode<infer TValue>\n ? CollectionReader<string, TValue>\n : TNode extends MapNode<infer TValue>\n ? CollectionReader<string, TValue>\n : TNode extends DictNode<infer TKey, infer TValue>\n ? DictionaryReader<TKey, TValue>\n : TNode extends ListNode<infer TItem>\n ? ListReader<TItem>\n : TNode extends TreeNode<infer TValue>\n ? TreeReader<TValue>\n : FieldReader<Infer<TNode>>;\nexport type DocumentReader<TSchema extends DocumentSchema> = ReaderOfNode<\n ObjectNode<TSchema['shape']>\n>;\n\nexport type ReaderContext = {\n readonly root: () => unknown;\n readonly active: () => boolean;\n readonly dependencies?: DependencyTracker;\n};\n\nconst schemaRoot = (schema: DocumentSchema): DocumentNode => object(schema.shape);\n\nconst assertActive = (context: ReaderContext): void => {\n if (!context.active()) throw new Error('Document reader is no longer active.');\n};\n\nconst readAt = (context: ReaderContext, address: DocumentAddress): unknown => {\n assertActive(context);\n profile.reader.lookup();\n return readAddress(context.root(), address);\n};\n\nconst collectValue = (context: ReaderContext, address: DocumentAddress): void => {\n context.dependencies?.record({ kind: 'value', at: address });\n};\n\nconst collectCollection = (context: ReaderContext, address: DocumentAddress, id?: string): void => {\n const target: ImpactTarget<unknown> = {\n kind: 'collection',\n at: address,\n ...(id === undefined ? {} : { id }),\n };\n context.dependencies?.record(target);\n};\n\nexport const readerFor = (\n node: DocumentNode,\n context: ReaderContext,\n address: DocumentAddress = []\n): unknown => {\n if (node.kind === 'field')\n return {\n get: () => {\n collectValue(context, address);\n return readAt(context, address);\n },\n };\n if (node.kind === 'dict')\n return {\n get: (key: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n return cloneValue(\n isRecord(value) && Object.prototype.hasOwnProperty.call(value, key)\n ? value[key]\n : undefined,\n 'reader'\n );\n },\n has: (key: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n return isRecord(value) && Object.prototype.hasOwnProperty.call(value, key);\n },\n keys: () => {\n collectValue(context, address);\n const value = readAt(context, address);\n return isRecord(value) ? Object.keys(value) : [];\n },\n values: () => {\n collectValue(context, address);\n profile.reader.structuralSnapshot();\n return cloneValue(readAt(context, address) ?? {}, 'reader');\n },\n };\n if (node.kind === 'list')\n return {\n get: (key: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n if (!Array.isArray(value)) return undefined;\n return cloneValue(value[anchor.keys(value, node.keyOf).index(key)], 'reader');\n },\n has: (key: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n return Array.isArray(value) && anchor.keys(value, node.keyOf).index(key) >= 0;\n },\n values: () => {\n collectValue(context, address);\n const value = readAt(context, address);\n profile.reader.structuralSnapshot();\n return cloneValue(Array.isArray(value) ? value : [], 'reader');\n },\n length: () => {\n collectValue(context, address);\n const value = readAt(context, address);\n return Array.isArray(value) ? value.length : 0;\n },\n at: (index: number) => {\n collectValue(context, address);\n const value = readAt(context, address);\n profile.reader.structuralSnapshot();\n return cloneValue(Array.isArray(value) ? value[index] : undefined, 'reader');\n },\n };\n if (node.kind === 'tree')\n return {\n rootId: () => {\n collectValue(context, address);\n const value = readAt(context, address);\n return isRecord(value) && typeof value.rootId === 'string' ? value.rootId : undefined;\n },\n has: (id: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n return (\n isRecord(value) &&\n isRecord(value.nodes) &&\n Object.prototype.hasOwnProperty.call(value.nodes, id)\n );\n },\n value: (id: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n profile.reader.structuralSnapshot();\n return cloneValue(\n isRecord(value) && isRecord(value.nodes) && isRecord(value.nodes[id])\n ? value.nodes[id].value\n : undefined,\n 'reader'\n );\n },\n parent: (id: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n const entry = isRecord(value) && isRecord(value.nodes) ? value.nodes[id] : undefined;\n return isRecord(entry) && typeof entry.parentId === 'string' ? entry.parentId : undefined;\n },\n children: (id: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n const entry = isRecord(value) && isRecord(value.nodes) ? value.nodes[id] : undefined;\n return isRecord(entry) && Array.isArray(entry.children) ? [...entry.children] : [];\n },\n };\n if (node.kind === 'table' || node.kind === 'map') {\n let items: Map<string, unknown> | undefined;\n return {\n ids: () => {\n collectCollection(context, address);\n const value = readAt(context, address);\n const ids =\n node.kind === 'table' && isRecord(value) && Array.isArray(value.ids)\n ? [...value.ids]\n : isRecord(value)\n ? Object.keys(value)\n : [];\n profile.reader.collectionIds(ids.length);\n return ids;\n },\n has: (id: string) => {\n collectCollection(context, address, id);\n const value = readAt(context, address);\n const byId =\n node.kind === 'table' && isRecord(value) && isRecord(value.byId) ? value.byId : value;\n return isRecord(byId) && Object.prototype.hasOwnProperty.call(byId, id);\n },\n get: (id: string) => {\n collectCollection(context, address, id);\n const value = readAt(context, address);\n const byId =\n node.kind === 'table' && isRecord(value) && isRecord(value.byId) ? value.byId : value;\n if (!isRecord(byId) || !Object.prototype.hasOwnProperty.call(byId, id)) return undefined;\n const cached = items?.get(id);\n if (cached) return cached as ReaderOfNode<typeof node.value>;\n const reader = readerFor(node.value, context, [...address, id]);\n (items ??= new Map()).set(id, reader);\n return reader;\n },\n };\n }\n if (node.kind === 'variant')\n return {\n get: () => {\n collectValue(context, address);\n return cloneValue(readAt(context, address), 'reader');\n },\n };\n\n let children: Map<string, unknown> | undefined;\n return new Proxy(\n {},\n {\n get: (_target, property: string | symbol) => {\n if (typeof property === 'symbol') return undefined;\n const child = node.shape[property];\n if (!child) return undefined;\n const cached = children?.get(property);\n if (cached) return cached;\n const reader = readerFor(child, context, [...address, property]);\n (children ??= new Map()).set(property, reader);\n return reader;\n },\n }\n );\n};\n\nexport const documentReader = <TSchema extends DocumentSchema>(\n schema: TSchema,\n root: () => Infer<TSchema>,\n active: () => boolean,\n dependencies?: DependencyTracker\n): DocumentReader<TSchema> => {\n profile.reader.session();\n return readerFor(schemaRoot(schema), {\n root,\n active,\n dependencies,\n }) as DocumentReader<TSchema>;\n};\n","import type { DocumentAddress } from '../schema';\nimport type { DocumentOperation } from '../operations';\n\nexport type CommandFootprintTarget =\n | { readonly kind: 'value'; readonly at: DocumentAddress }\n | { readonly kind: 'dictionary'; readonly at: DocumentAddress }\n | { readonly kind: 'dictionary-key'; readonly at: DocumentAddress; readonly key: string }\n | { readonly kind: 'collection'; readonly at: DocumentAddress }\n | { readonly kind: 'entity'; readonly at: DocumentAddress; readonly id: string }\n | { readonly kind: 'list'; readonly at: DocumentAddress }\n | { readonly kind: 'list-item'; readonly at: DocumentAddress; readonly key: string }\n | { readonly kind: 'tree'; readonly at: DocumentAddress }\n | { readonly kind: 'tree-node'; readonly at: DocumentAddress; readonly id: string };\n\nexport type CommandFootprint = readonly CommandFootprintTarget[];\n\nconst sameAddress = (left: DocumentAddress, right: DocumentAddress): boolean =>\n left.length === right.length && left.every((segment, index) => segment === right[index]);\n\nconst containsAddress = (parent: DocumentAddress, child: DocumentAddress): boolean =>\n parent.length <= child.length && parent.every((segment, index) => segment === child[index]);\n\nconst address = (value: unknown): DocumentAddress | undefined =>\n Array.isArray(value) && value.every(segment => typeof segment === 'string')\n ? Object.freeze(value.slice())\n : undefined;\n\nconst targetKey = (target: CommandFootprintTarget): string => {\n const at = target.at.join('\\u0000');\n if (target.kind === 'dictionary-key' || target.kind === 'list-item')\n return `${target.kind}:${at}:${target.key}`;\n if (target.kind === 'entity' || target.kind === 'tree-node')\n return `${target.kind}:${at}:${target.id}`;\n return `${target.kind}:${at}`;\n};\n\nconst freezeTarget = (target: CommandFootprintTarget): CommandFootprintTarget =>\n Object.freeze({ ...target, at: Object.freeze(target.at.slice()) }) as CommandFootprintTarget;\n\nconst add = (\n targets: Map<string, CommandFootprintTarget>,\n target: CommandFootprintTarget\n): void => {\n const stable = freezeTarget(target);\n targets.set(targetKey(stable), stable);\n};\n\nexport const commandFootprint = (operations: readonly DocumentOperation[]): CommandFootprint => {\n const targets = new Map<string, CommandFootprintTarget>();\n for (const operation of operations) {\n switch (operation.type) {\n case 'field.set':\n case 'field.clear':\n case 'value.clear':\n case 'variant.replace':\n add(targets, { kind: 'value', at: operation.at });\n break;\n case 'dict.replace':\n add(targets, { kind: 'dictionary', at: operation.at });\n break;\n case 'dict.set':\n case 'dict.delete':\n add(targets, { kind: 'dictionary-key', at: operation.at, key: operation.key });\n break;\n case 'entity.create':\n add(targets, { kind: 'collection', at: operation.at });\n for (const entry of operation.entries)\n add(targets, { kind: 'entity', at: operation.at, id: entry.id });\n break;\n case 'entity.remove':\n add(targets, { kind: 'collection', at: operation.at });\n for (const id of operation.ids) add(targets, { kind: 'entity', at: operation.at, id });\n break;\n case 'entity.move':\n add(targets, { kind: 'collection', at: operation.at });\n add(targets, { kind: 'entity', at: operation.at, id: operation.id });\n break;\n case 'list.insert':\n case 'list.move':\n case 'list.remove':\n add(targets, { kind: 'list', at: operation.at });\n add(targets, { kind: 'list-item', at: operation.at, key: operation.key });\n break;\n case 'list.replace':\n add(targets, { kind: 'list', at: operation.at });\n for (const key of operation.keys)\n add(targets, { kind: 'list-item', at: operation.at, key });\n break;\n case 'tree.insert':\n case 'tree.move':\n case 'tree.remove':\n case 'tree.set':\n add(targets, { kind: 'tree', at: operation.at });\n add(targets, { kind: 'tree-node', at: operation.at, id: operation.treeNodeId });\n break;\n case 'tree.replace':\n add(targets, { kind: 'tree', at: operation.at });\n break;\n }\n }\n return Object.freeze(Array.from(targets.values()));\n};\n\nconst overlapsValueAndEntity = (\n value: Extract<CommandFootprintTarget, { readonly kind: 'value' }>,\n entity: Extract<CommandFootprintTarget, { readonly kind: 'entity' }>\n): boolean =>\n containsAddress([...entity.at, entity.id], value.at) ||\n containsAddress(value.at, [...entity.at, entity.id]);\n\nconst targetsOverlap = (left: CommandFootprintTarget, right: CommandFootprintTarget): boolean => {\n if (left.kind === 'value' && right.kind === 'value')\n return containsAddress(left.at, right.at) || containsAddress(right.at, left.at);\n if (left.kind === 'value' && right.kind === 'entity') return overlapsValueAndEntity(left, right);\n if (left.kind === 'entity' && right.kind === 'value') return overlapsValueAndEntity(right, left);\n if (left.kind === 'dictionary' && right.kind === 'dictionary')\n return sameAddress(left.at, right.at);\n if (left.kind === 'dictionary' && right.kind === 'dictionary-key')\n return sameAddress(left.at, right.at);\n if (left.kind === 'dictionary-key' && right.kind === 'dictionary')\n return sameAddress(left.at, right.at);\n if (left.kind === 'dictionary-key' && right.kind === 'dictionary-key')\n return sameAddress(left.at, right.at) && left.key === right.key;\n if (left.kind === 'collection' && right.kind === 'collection')\n return sameAddress(left.at, right.at);\n if (left.kind === 'collection' && right.kind === 'entity') return sameAddress(left.at, right.at);\n if (left.kind === 'entity' && right.kind === 'collection') return sameAddress(left.at, right.at);\n if (left.kind === 'entity' && right.kind === 'entity')\n return sameAddress(left.at, right.at) && left.id === right.id;\n if (left.kind === 'list' && (right.kind === 'list' || right.kind === 'list-item'))\n return sameAddress(left.at, right.at);\n if (right.kind === 'list' && left.kind === 'list-item') return sameAddress(left.at, right.at);\n if (left.kind === 'list-item' && right.kind === 'list-item')\n return sameAddress(left.at, right.at) && left.key === right.key;\n if (left.kind === 'tree' && (right.kind === 'tree' || right.kind === 'tree-node'))\n return sameAddress(left.at, right.at);\n if (right.kind === 'tree' && left.kind === 'tree-node') return sameAddress(left.at, right.at);\n if (left.kind === 'tree-node' && right.kind === 'tree-node')\n return sameAddress(left.at, right.at) && left.id === right.id;\n return false;\n};\n\nexport const footprintsOverlap = (left: CommandFootprint, right: CommandFootprint): boolean =>\n left.some(leftTarget => right.some(rightTarget => targetsOverlap(leftTarget, rightTarget)));\n\nconst decodedTarget = (value: unknown): CommandFootprintTarget | undefined => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return undefined;\n const record = value as Record<string, unknown>;\n const at = address(record.at);\n if (!at || typeof record.kind !== 'string') return undefined;\n switch (record.kind) {\n case 'value':\n case 'dictionary':\n case 'collection':\n case 'list':\n case 'tree':\n return freezeTarget({ kind: record.kind, at });\n case 'dictionary-key':\n case 'list-item':\n return typeof record.key === 'string'\n ? freezeTarget({ kind: record.kind, at, key: record.key })\n : undefined;\n case 'entity':\n case 'tree-node':\n return typeof record.id === 'string'\n ? freezeTarget({ kind: record.kind, at, id: record.id })\n : undefined;\n default:\n return undefined;\n }\n};\n\nexport const decodeCommandFootprint = (value: unknown): CommandFootprint | undefined => {\n if (!Array.isArray(value)) return undefined;\n const targets = new Map<string, CommandFootprintTarget>();\n for (const entry of value) {\n const target = decodedTarget(entry);\n if (!target) return undefined;\n targets.set(targetKey(target), target);\n }\n return Object.freeze(Array.from(targets.values()));\n};\n","import type { DocumentSchema, Infer } from '../schema';\nimport type { DocumentReader } from '../access/reader';\nimport { documentReader } from '../access/reader';\nimport type { DependencyTracker } from '../access/dependency';\nimport { DocumentDisposedError } from './contract';\nimport type { DocumentReadable } from './contract';\n\nexport type RuntimeAccessState<TSchema extends DocumentSchema> = {\n readonly schema: TSchema;\n document: Infer<TSchema>;\n disposed: boolean;\n projectionLocks?: number;\n};\n\nconst states = new WeakMap<object, RuntimeAccessState<DocumentSchema>>();\n\nexport const bindRuntimeAccess = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>,\n state: RuntimeAccessState<TSchema>\n): void => {\n states.set(runtime as object, state as RuntimeAccessState<DocumentSchema>);\n};\n\nexport const accessOf = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>\n): RuntimeAccessState<TSchema> => {\n const state = states.get(runtime as object);\n if (!state) throw new Error('Unknown Doxum runtime.');\n return state as RuntimeAccessState<TSchema>;\n};\n\nexport const schemaOf = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>\n): TSchema => accessOf(runtime).schema;\n\nexport const documentOf = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>\n): Infer<TSchema> => accessOf(runtime).document;\n\nexport const readWith = <TSchema extends DocumentSchema, TResult>(\n runtime: DocumentReadable<TSchema>,\n run: (read: DocumentReader<TSchema>) => TResult,\n dependencies?: DependencyTracker\n): TResult => {\n const state = accessOf(runtime);\n if (state.disposed) throw new DocumentDisposedError();\n let active = true;\n const reader = documentReader(\n state.schema,\n () => state.document,\n () => active,\n dependencies\n );\n try {\n return run(reader);\n } finally {\n // Readers are transaction-scoped; retaining one cannot expose later\n // mutable canonical state outside the coordinating operation.\n active = false;\n }\n};\n","import type { DocumentSchema, ImpactTarget } from '../schema';\nimport type {\n CommitListener,\n DocumentCommit,\n DocumentReadable,\n DocumentRuntime,\n Unsubscribe,\n ObserverError,\n} from './contract';\nimport * as target from '../impact-target';\n\nexport type ProjectionAttachment<TSchema extends DocumentSchema> = {\n capture(commit: DocumentCommit<TSchema>): void;\n settle(): void;\n flush(): readonly ObserverError[];\n dispose(): void;\n};\ntype ProcessorEntry<TSchema extends DocumentSchema> = {\n readonly processor: ProjectionAttachment<TSchema>;\n active: boolean;\n};\ntype RootEntry<TSchema extends DocumentSchema> = {\n readonly listener: CommitListener<TSchema>;\n active: boolean;\n};\ntype FilteredEntry<TSchema extends DocumentSchema> = {\n readonly targets: readonly ImpactTarget<unknown>[];\n readonly listener: CommitListener<TSchema>;\n active: boolean;\n};\nexport type RuntimeNotification<TSchema extends DocumentSchema> = {\n readonly root: Set<RootEntry<TSchema>>;\n readonly filtered: Set<FilteredEntry<TSchema>>;\n readonly buckets: Map<BucketKey, Set<FilteredEntry<TSchema>>>;\n readonly processors: ProcessorEntry<TSchema>[];\n readonly candidates: Set<FilteredEntry<TSchema>>;\n readonly rootSnapshot: RootEntry<TSchema>[];\n notifying: boolean;\n};\n\nconst ROOT_BUCKET = Symbol('document-root');\ntype BucketKey = string | typeof ROOT_BUCKET;\nconst notifications = new WeakMap<object, RuntimeNotification<DocumentSchema>>();\nconst readableOwners = new WeakMap<object, DocumentReadable<DocumentSchema>>();\n\nexport const bindDocumentReadable = (\n readable: object,\n runtime: DocumentReadable<DocumentSchema>\n): void => {\n readableOwners.set(readable, runtime);\n};\nexport const documentReadableOwner = (\n readable: object\n): DocumentReadable<DocumentSchema> | undefined => readableOwners.get(readable);\n\nconst key = (value: ImpactTarget<unknown>): BucketKey => target.bucket(value) ?? ROOT_BUCKET;\n\nexport const createNotification = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>\n): RuntimeNotification<TSchema> => {\n const notification: RuntimeNotification<TSchema> = {\n root: new Set(),\n filtered: new Set(),\n buckets: new Map(),\n processors: [],\n candidates: new Set(),\n rootSnapshot: [],\n notifying: false,\n };\n notifications.set(runtime as object, notification as RuntimeNotification<DocumentSchema>);\n return notification;\n};\n\nconst notificationOf = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>\n): RuntimeNotification<TSchema> => {\n const value = notifications.get(runtime as object);\n if (!value) throw new Error('Unknown Doxum runtime.');\n return value as RuntimeNotification<TSchema>;\n};\n\nexport const shareNotification = <TSchema extends DocumentSchema>(\n source: DocumentRuntime<TSchema>,\n target: DocumentReadable<TSchema>\n): void => {\n notifications.set(\n target as object,\n notificationOf(source) as RuntimeNotification<DocumentSchema>\n );\n};\n\nexport const attachProjection = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>,\n processor: ProjectionAttachment<TSchema>\n): Unsubscribe => {\n const notification = notificationOf(runtime);\n const entry: ProcessorEntry<TSchema> = { processor, active: true };\n notification.processors.push(entry);\n return () => {\n if (!entry.active) return;\n entry.active = false;\n if (!notification.notifying) {\n const index = notification.processors.indexOf(entry);\n if (index >= 0) notification.processors.splice(index, 1);\n }\n };\n};\n\nexport const subscribeRoot = <TSchema extends DocumentSchema>(\n notification: RuntimeNotification<TSchema>,\n listener: CommitListener<TSchema>\n): Unsubscribe => {\n const entry: RootEntry<TSchema> = { listener, active: true };\n notification.root.add(entry);\n return () => {\n entry.active = false;\n if (!notification.notifying) notification.root.delete(entry);\n };\n};\n\nexport const subscribeTargets = <TSchema extends DocumentSchema>(\n notification: RuntimeNotification<TSchema>,\n targets: readonly ImpactTarget<unknown>[],\n listener: CommitListener<TSchema>\n): Unsubscribe => {\n const entry: FilteredEntry<TSchema> = {\n targets: Object.freeze(targets.slice()),\n listener,\n active: true,\n };\n notification.filtered.add(entry);\n const keys = new Set(targets.map(key));\n keys.forEach(key => {\n const bucket = notification.buckets.get(key) ?? new Set();\n bucket.add(entry);\n notification.buckets.set(key, bucket);\n });\n return () => {\n if (!entry.active) return;\n entry.active = false;\n if (notification.notifying) return;\n notification.filtered.delete(entry);\n keys.forEach(key => {\n const bucket = notification.buckets.get(key);\n bucket?.delete(entry);\n if (bucket?.size === 0) notification.buckets.delete(key);\n });\n };\n};\n\nexport const notify = <TSchema extends DocumentSchema>(\n notification: RuntimeNotification<TSchema>,\n commit: DocumentCommit<TSchema>,\n afterSettle?: () => readonly ObserverError[]\n): readonly ObserverError[] => {\n notification.notifying = true;\n const errors: ObserverError[] = [];\n const call = (listener: CommitListener<TSchema>): void => {\n try {\n listener(commit);\n } catch (error) {\n errors.push(Object.freeze({ phase: 'listener', error }));\n }\n };\n try {\n const processorCount = notification.processors.length;\n for (let index = 0; index < processorCount; index += 1) {\n const entry = notification.processors[index];\n if (!entry?.active) continue;\n try {\n entry.processor.capture(commit);\n } catch (error) {\n errors.push(Object.freeze({ phase: 'processor', error }));\n }\n }\n for (let index = 0; index < processorCount; index += 1) {\n const entry = notification.processors[index];\n if (!entry?.active) continue;\n try {\n entry.processor.settle();\n } catch (error) {\n errors.push(Object.freeze({ phase: 'processor', error }));\n }\n }\n for (let index = 0; index < processorCount; index += 1) {\n const entry = notification.processors[index];\n if (!entry?.active) continue;\n try {\n errors.push(...entry.processor.flush());\n } catch (error) {\n errors.push(Object.freeze({ phase: 'flush', error }));\n }\n }\n\n if (afterSettle) errors.push(...afterSettle());\n const candidates = notification.candidates;\n candidates.clear();\n if (commit.impact.kind === 'reset') {\n notification.filtered.forEach(entry => candidates.add(entry));\n } else {\n for (const operation of commit.operations) {\n const key = operation.at[0] ?? ROOT_BUCKET;\n notification.buckets.get(key)?.forEach(entry => candidates.add(entry));\n notification.buckets.get(ROOT_BUCKET)?.forEach(entry => candidates.add(entry));\n }\n }\n candidates.forEach(entry => {\n if (entry.active && entry.targets.some(commit.impact.affects)) call(entry.listener);\n });\n const rootSnapshot = notification.rootSnapshot;\n rootSnapshot.length = 0;\n notification.root.forEach(entry => rootSnapshot.push(entry));\n for (const entry of rootSnapshot) if (entry.active) call(entry.listener);\n } finally {\n notification.notifying = false;\n let writeIndex = 0;\n for (const entry of notification.processors)\n if (entry.active) notification.processors[writeIndex++] = entry;\n notification.processors.length = writeIndex;\n notification.root.forEach(entry => {\n if (!entry.active) notification.root.delete(entry);\n });\n notification.filtered.forEach(entry => {\n if (!entry.active) notification.filtered.delete(entry);\n });\n notification.buckets.forEach((bucket, key) => {\n bucket.forEach(entry => {\n if (!entry.active) bucket.delete(entry);\n });\n if (bucket.size === 0) notification.buckets.delete(key);\n });\n }\n return Object.freeze(errors);\n};\n\nexport const disposeNotification = <TSchema extends DocumentSchema>(\n notification: RuntimeNotification<TSchema>\n): void => {\n const attachments = notification.processors.slice();\n notification.root.clear();\n notification.filtered.clear();\n notification.buckets.clear();\n notification.processors.length = 0;\n notification.candidates.clear();\n notification.rootSnapshot.length = 0;\n const errors: unknown[] = [];\n attachments.forEach(entry => {\n if (!entry.active) return;\n try {\n entry.processor.dispose();\n } catch (error) {\n errors.push(error);\n }\n });\n if (errors.length) throw new AggregateError(errors, 'Projection disposal notification failed.');\n};\n","import type { CollectionReader, DocumentReader, ReaderOfNode } from '../access/reader';\nimport type { CollectionImpact } from '../impact';\nimport type {\n DocumentCommit,\n DocumentReadable,\n Synchronous,\n Unsubscribe,\n} from '../runtime/contract';\nimport type {\n CollectionNode,\n CollectionPath,\n CollectionSelector,\n DocumentSchema,\n EntitySchemaNode,\n ImpactTarget,\n SchemaPath,\n} from '../schema';\nimport type { Readable } from './readable';\n\ndeclare const sourceContext: unique symbol;\nexport type ProjectionSource<T> = { readonly [sourceContext]: T };\nexport type ProjectionSources = Readonly<Record<string, ProjectionSource<unknown>>>;\nexport type ProjectionInputs<S extends ProjectionSources> = {\n readonly [K in keyof S]: S[K] extends ProjectionSource<infer T> ? T : never;\n};\nexport type DocumentInput<S extends DocumentSchema> = {\n readonly read: DocumentReader<S>;\n readonly revision: number;\n readonly commits: readonly DocumentCommit<S>[];\n readonly reset: boolean;\n};\nexport type DocumentCollectionInput<S extends DocumentSchema, N extends EntitySchemaNode> = {\n readonly read: CollectionReader<string, N>;\n readonly target: CollectionSelector<string, N>;\n readonly revision: number;\n readonly commits: readonly DocumentCommit<S>[];\n readonly reset: boolean;\n readonly candidates: { readonly keys: readonly string[]; readonly orderDirty: boolean };\n};\nexport type DocumentSource<S extends DocumentSchema> = ProjectionSource<DocumentInput<S>> & {\n collection<P extends CollectionPath>(\n pick: (path: SchemaPath<S['shape']>) => P\n ): DocumentCollectionSource<S, CollectionNode<P>>;\n targets(\n ...targets: readonly [ImpactTarget, ...ImpactTarget[]]\n ): ProjectionSource<DocumentInput<S>>;\n};\nexport type DocumentCollectionSource<\n S extends DocumentSchema,\n N extends EntitySchemaNode,\n> = ProjectionSource<DocumentCollectionInput<S, N>>;\nexport type ValueInput<T> = {\n readonly value: T;\n readonly previous: T;\n readonly changed: boolean;\n readonly revision: number;\n readonly reset: boolean;\n};\nexport type ProjectionInput<T> = {\n readonly source: ProjectionSource<ValueInput<T>>;\n set(value: T): void;\n};\nexport type ValueUpdate<T> =\n | { readonly kind: 'unchanged' }\n | { readonly kind: 'changed'; readonly value: T }\n | { readonly kind: 'rebuild' };\nexport type ValueSpec<S extends ProjectionSources, T> = {\n readonly name?: string;\n readonly sources: S;\n readonly build: (sources: ProjectionInputs<S>) => {\n readonly value: T;\n readonly update: (sources: ProjectionInputs<S>) => ValueUpdate<NoInfer<T>>;\n };\n};\nexport type ProjectionValue<T> = Readable<T> &\n ProjectionSource<ValueInput<T>> & { rebuild(): void; dispose(): void };\nexport type CollectionRead<K extends string, V> = {\n get(key: K): V | undefined;\n has(key: K): boolean;\n ids(): readonly K[];\n};\nexport type CollectionInput<K extends string, V> = CollectionRead<K, V> & {\n readonly change: CollectionImpact<K> | undefined;\n readonly revision: number;\n readonly reset: boolean;\n};\nexport type ProjectionCollection<K extends string, V> = ProjectionSource<CollectionInput<K, V>> & {\n readonly ids: Readable<readonly K[]>;\n readonly all: Readable<readonly V[]>;\n item(key: K): Readable<V | undefined>;\n revision(): number;\n subscribe(listener: (change: CollectionImpact<K>) => void): Unsubscribe;\n rebuild(): void;\n dispose(): void;\n};\nexport type ProjectionCollectionWriter<K extends string, V> = {\n set(key: K, value: V): void;\n remove(key: K): void;\n order(ids: readonly K[]): void;\n replace(entries: readonly (readonly [K, V])[]): void;\n};\nexport type CollectionProcess<S extends ProjectionSources, K extends string, V> = {\n readonly sources: ProjectionInputs<S>;\n readonly previous: CollectionRead<K, V>;\n readonly next: CollectionRead<K, V>;\n readonly writer: ProjectionCollectionWriter<K, V>;\n};\nexport type CollectionSpec<S extends ProjectionSources, K extends string, V> = {\n readonly name?: string;\n readonly sources: S;\n readonly isEqual?: (previous: V, next: V) => boolean;\n readonly build: (input: CollectionProcess<S, K, V>) => {\n readonly update: (input: CollectionProcess<S, K, V>) => void | { readonly kind: 'rebuild' };\n };\n};\nexport class ProjectionError extends Error {\n constructor(\n readonly phase: 'processor' | 'listener' | 'source' | 'blocked',\n readonly identity: string,\n readonly revisions: readonly number[],\n cause: unknown\n ) {\n super(`Projection ${phase} failed: ${identity}`, { cause });\n this.name = 'ProjectionError';\n }\n}\nexport class ProjectionDisposedError extends Error {\n constructor() {\n super('Projection has been disposed.');\n this.name = 'ProjectionDisposedError';\n }\n}\nexport type ProjectionRuntime = {\n document<S extends DocumentSchema>(runtime: DocumentReadable<S>): DocumentSource<S>;\n fromReadable<T>(\n readable: Readable<T>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): ProjectionSource<ValueInput<T>>;\n input<T>(\n initial: T,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): ProjectionInput<T>;\n value<S extends ProjectionSources, T>(\n sources: S,\n compute: (sources: ProjectionInputs<S>) => Synchronous<T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ProjectionValue<T>;\n value<S extends ProjectionSources, T>(\n spec: ValueSpec<S, T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ProjectionValue<T>;\n collection<V, K extends string = string>(): <S extends ProjectionSources>(\n spec: CollectionSpec<S, K, V>\n ) => ProjectionCollection<K, V>;\n map<S extends DocumentSchema, N extends EntitySchemaNode, V>(\n source: DocumentCollectionSource<S, N>,\n mapper: (id: string, entry: ReaderOfNode<N>) => Synchronous<V>,\n options?: { readonly isEqual?: (a: V, b: V) => boolean }\n ): ProjectionCollection<string, V>;\n map<K extends string, V, R>(\n source: ProjectionCollection<K, V>,\n mapper: (id: K, entry: V) => Synchronous<R>,\n options?: { readonly isEqual?: (a: NoInfer<R>, b: NoInfer<R>) => boolean }\n ): ProjectionCollection<K, R>;\n batch<T>(run: () => Synchronous<T>): T;\n dispose(): void;\n};\n","import type { ObserverError } from '../runtime/contract';\nimport { ProjectionDisposedError, ProjectionError } from './contract';\nimport { profile } from '../profile';\n\nexport type SourceRecord = {\n readonly consumers: Set<NodeRecord>;\n context(active: () => boolean): unknown;\n revision(): number;\n reset(): boolean;\n fault: ProjectionError | undefined;\n disposed: boolean;\n clear(): void;\n};\nexport type NodeRecord = SourceRecord & {\n readonly order: number;\n readonly name: string;\n readonly sources: readonly SourceRecord[];\n forced: boolean;\n statusChanged: boolean;\n evaluate(build: boolean): boolean;\n publish(): void;\n emit(call: (listener: () => void) => void): void;\n release(): void;\n};\n\n// Sources and nodes share one registry. Public structural lookalikes are never accepted.\nexport const projectionHandles = new WeakSet<object>();\nexport const createScheduler = (onError: (error: ProjectionError) => void) => {\n let disposed = false;\n let depth = 0;\n let phase: 'idle' | 'compute' | 'notify' = 'idle';\n let sequence = 0;\n const records = new Map<object, SourceRecord>();\n const nodes = new Set<NodeRecord>();\n const pending = new Set<SourceRecord>();\n const heap: NodeRecord[] = [];\n const queued = new Set<NodeRecord>();\n const completed: NodeRecord[] = [];\n const emissions = new Set<NodeRecord>();\n const errors: ProjectionError[] = [];\n let reportingFailures: unknown[] = [];\n const guards = new Set<(locked: boolean) => void>();\n const cleanups = new Set<() => void>();\n const assertActive = () => {\n if (disposed) throw new ProjectionDisposedError();\n };\n const assertIdle = () => {\n assertActive();\n if (phase !== 'idle')\n throw new Error('Projection cannot be re-entered during processing or notification.');\n };\n const lock = (value: boolean) => guards.forEach(guard => guard(value));\n const enqueue = (node: NodeRecord) => {\n if (node.disposed || queued.has(node)) return;\n queued.add(node);\n profile.projection('scheduledNodes');\n let i = heap.length;\n heap.push(node);\n while (i > 0) {\n const p = (i - 1) >> 1;\n if (heap[p].order < node.order) break;\n heap[i] = heap[p];\n i = p;\n }\n heap[i] = node;\n };\n const pop = () => {\n const first = heap[0];\n const last = heap.pop()!;\n if (heap.length) {\n let i = 0;\n while (i * 2 + 1 < heap.length) {\n let c = i * 2 + 1;\n if (c + 1 < heap.length && heap[c + 1].order < heap[c].order) c++;\n if (last.order < heap[c].order) break;\n heap[i] = heap[c];\n i = c;\n }\n heap[i] = last;\n }\n return first;\n };\n const errorFor = (\n node: NodeRecord,\n cause: unknown,\n kind: ProjectionError['phase'] = 'processor'\n ) =>\n new ProjectionError(\n kind,\n node.name,\n node.sources.map(source => source.revision()),\n cause\n );\n const capture = (source: SourceRecord) => {\n if (disposed) return;\n if (phase !== 'idle') {\n source.fault = new ProjectionError(\n 'source',\n 'reentrant source',\n [source.revision()],\n new Error('Source changed while projection was running.')\n );\n errors.push(source.fault);\n throw source.fault;\n }\n pending.add(source);\n profile.projection('sourceEvents');\n if (source.fault) errors.push(source.fault);\n };\n const settle = () => {\n if (disposed || depth || phase !== 'idle') return;\n phase = 'compute';\n lock(true);\n try {\n pending.forEach(source => source.consumers.forEach(enqueue));\n while (heap.length) {\n const node = pop();\n if (node.disposed) continue;\n const wasFaulted = node.fault !== undefined;\n profile.projection('processedNodes');\n let changed = false;\n const blocked = node.sources.find(source => source.fault || source.disposed);\n if (blocked) {\n node.fault = errorFor(node, blocked.fault ?? new ProjectionDisposedError(), 'blocked');\n } else {\n const build = node.forced || wasFaulted || node.sources.some(source => source.reset());\n try {\n changed = node.evaluate(build);\n const failure = node.sources.find(source => source.fault)?.fault;\n if (failure) throw failure;\n node.fault = undefined;\n } catch (cause) {\n const error = errorFor(node, cause);\n errors.push(error);\n node.fault = error;\n if (!build) {\n try {\n changed = node.evaluate(true);\n const failure = node.sources.find(source => source.fault)?.fault;\n if (failure) throw failure;\n node.fault = undefined;\n } catch (cause) {\n node.fault = errorFor(node, cause);\n errors.push(node.fault);\n }\n }\n }\n }\n node.forced = false;\n node.statusChanged = wasFaulted !== (node.fault !== undefined);\n completed.push(node);\n if (changed || wasFaulted || node.fault) {\n profile.projection('publishedNodes');\n emissions.add(node);\n node.consumers.forEach(enqueue);\n }\n }\n completed.forEach(node => node.publish());\n } finally {\n lock(false);\n phase = 'idle';\n }\n };\n const flush = (): readonly ObserverError[] => {\n if (disposed || depth) return [];\n if (pending.size || completed.length) profile.projection('flushes');\n phase = 'notify';\n lock(true);\n const reportFailures: unknown[] = [];\n try {\n emissions.forEach(node =>\n node.emit(listener => {\n try {\n listener();\n } catch (cause) {\n errors.push(errorFor(node, cause, 'listener'));\n }\n })\n );\n for (const error of errors.slice()) {\n try {\n onError(error);\n } catch (cause) {\n reportFailures.push(cause);\n }\n }\n return Object.freeze([\n ...errors.map(error =>\n Object.freeze({\n phase: error.phase === 'listener' ? ('listener' as const) : ('processor' as const),\n error,\n })\n ),\n ...reportFailures.map(error => Object.freeze({ phase: 'listener' as const, error })),\n ]);\n } finally {\n pending.forEach(source => source.clear());\n completed.forEach(node => node.clear());\n pending.clear();\n queued.clear();\n completed.length = 0;\n emissions.clear();\n errors.length = 0;\n reportingFailures = reportFailures;\n lock(false);\n phase = 'idle';\n }\n };\n const run = () => {\n settle();\n const result = flush();\n const failures = reportingFailures;\n reportingFailures = [];\n if (failures.length) throw new AggregateError(failures, 'Projection error reporter failed.');\n return result;\n };\n return {\n assertActive,\n assertIdle,\n capture,\n settle,\n flush,\n run,\n records,\n guards,\n cleanups,\n get active() {\n return !disposed;\n },\n register(handle: object, record: SourceRecord) {\n assertIdle();\n records.set(handle, record);\n projectionHandles.add(handle);\n },\n unregisterSource(handle: object) {\n const record = records.get(handle);\n if (record) {\n record.disposed = true;\n pending.delete(record);\n record.clear();\n records.delete(handle);\n }\n },\n source(handle: object) {\n assertActive();\n const source = records.get(handle);\n if (!source || source.disposed)\n throw new Error('Unknown, disposed, or foreign projection source.');\n return source;\n },\n addNode(node: NodeRecord) {\n nodes.add(node);\n node.sources.forEach(source => source.consumers.add(node));\n },\n order: () => sequence++,\n initialize<T>(run: () => T): T {\n assertIdle();\n phase = 'compute';\n lock(true);\n try {\n return run();\n } finally {\n lock(false);\n phase = 'idle';\n }\n },\n rebuild(node: NodeRecord) {\n assertIdle();\n if (node.disposed) throw new ProjectionDisposedError();\n node.forced = true;\n enqueue(node);\n run();\n },\n disposeNode(node: NodeRecord) {\n if (node.disposed) return;\n assertIdle();\n if (node.consumers.size)\n throw new Error('Cannot dispose a projection node with downstream consumers.');\n node.disposed = true;\n node.sources.forEach(source => source.consumers.delete(node));\n nodes.delete(node);\n node.release();\n for (const [handle, record] of records) if (record === node) records.delete(handle);\n },\n batch<T>(callback: () => T): T {\n assertIdle();\n depth++;\n let failed = false;\n try {\n const value = callback();\n assertSynchronous(value);\n return value;\n } catch (error) {\n failed = true;\n throw error;\n } finally {\n depth--;\n if (!depth) {\n if (failed) {\n try {\n run();\n } catch {\n /* The original application error retains priority. */\n }\n } else run();\n }\n }\n },\n dispose() {\n if (disposed) return;\n assertIdle();\n disposed = true;\n const failures: unknown[] = [];\n cleanups.forEach(cleanup => {\n try {\n cleanup();\n } catch (error) {\n failures.push(error);\n }\n });\n cleanups.clear();\n nodes.forEach(node => {\n node.disposed = true;\n node.release();\n node.consumers.clear();\n });\n records.forEach(source => {\n source.disposed = true;\n source.consumers.clear();\n source.clear();\n });\n nodes.clear();\n records.clear();\n pending.clear();\n heap.length = 0;\n completed.length = 0;\n queued.clear();\n emissions.clear();\n guards.clear();\n errors.length = 0;\n reportingFailures = [];\n if (failures.length) throw new AggregateError(failures, 'Projection cleanup failed.');\n },\n debug: () => ({\n nodes: nodes.size,\n sources: records.size - nodes.size,\n subscriptions: cleanups.size,\n pending: pending.size + heap.length,\n }),\n };\n};\nexport type Scheduler = ReturnType<typeof createScheduler>;\nexport const assertSynchronous = (value: unknown): void => {\n if (\n value != null &&\n (typeof value === 'object' || typeof value === 'function') &&\n 'then' in value &&\n typeof value.then === 'function'\n )\n throw new TypeError('Projection callbacks must be synchronous.');\n};\nexport const assertScope = (active: () => boolean) => {\n if (!active()) throw new Error('Projection reader or writer is no longer active.');\n};\n","import type { ProjectionInputs, ProjectionSources } from './contract';\nimport { ProjectionDisposedError } from './contract';\nimport type { NodeRecord, Scheduler } from './scheduler';\n\nexport const createNode = <S extends ProjectionSources>(\n scheduler: Scheduler,\n spec: { name?: string; sources: S },\n behavior: {\n evaluate(sources: ProjectionInputs<S>, build: boolean, active: () => boolean): boolean;\n context(active: () => boolean): unknown;\n revision(): number;\n reset(): boolean;\n publish(): void;\n emit(call: (listener: () => void) => void): void;\n clear(): void;\n release(): void;\n }\n) => {\n scheduler.assertIdle();\n const entries = Object.entries(spec.sources).map(\n ([key, handle]) => [key, scheduler.source(handle)] as const\n );\n const order = scheduler.order();\n const node: NodeRecord = {\n ...behavior,\n publish: () => {\n if (node.fault) behavior.clear();\n else behavior.publish();\n },\n order,\n name: spec.name ? `${spec.name} (${order})` : `projection-${order}`,\n sources: entries.map(([, source]) => source),\n consumers: new Set(),\n disposed: false,\n fault: undefined,\n forced: false,\n statusChanged: false,\n evaluate: build => {\n let active = true;\n try {\n // Heterogeneous source contexts are typed at the registered capability boundary.\n const inputs = Object.fromEntries(\n entries.map(([key, source]) => [key, source.context(() => active)])\n ) as ProjectionInputs<S>;\n return behavior.evaluate(inputs, build, () => active);\n } finally {\n active = false;\n }\n },\n };\n scheduler.initialize(() => {\n const invalid = node.sources.find(source => source.fault || source.disposed);\n if (invalid) throw invalid.fault ?? new ProjectionDisposedError();\n node.evaluate(true);\n node.publish();\n node.clear();\n });\n const check = () => {\n if (node.disposed || !scheduler.active) throw new ProjectionDisposedError();\n if (node.fault) throw node.fault;\n };\n return {\n node,\n check,\n install(handle: object) {\n scheduler.register(handle, node);\n scheduler.addNode(node);\n },\n rebuild: () => scheduler.rebuild(node),\n dispose: () => scheduler.disposeNode(node),\n };\n};\n","import type { CollectionImpact } from '../impact';\nimport { profile } from '../profile';\nimport type {\n CollectionInput,\n CollectionRead,\n CollectionSpec,\n ProjectionCollectionWriter,\n ProjectionCollection,\n ProjectionSources,\n} from './contract';\nimport type { Readable } from './readable';\nimport { createNode } from './node';\nimport { assertScope, assertSynchronous, projectionHandles, type Scheduler } from './scheduler';\n\nexport const collectionHandles = new WeakSet<object>();\n\nconst readonlySet = <T>(values: Iterable<T>): ReadonlySet<T> => {\n const set = new Set(values);\n const view: ReadonlySet<T> = Object.freeze({\n get size() {\n return set.size;\n },\n has: (value: T) => set.has(value),\n entries: () => set.entries(),\n keys: () => set.keys(),\n values: () => set.values(),\n [Symbol.iterator]: () => set.values(),\n forEach: (callback: (value: T, key: T, set: ReadonlySet<T>) => void, thisArg?: unknown) =>\n set.forEach(value => callback.call(thisArg, value, value, view)),\n });\n return view;\n};\ntype Entry<V> = { present: true; value: V } | { present: false };\nexport const createCollection = <S extends ProjectionSources, K extends string, V>(\n scheduler: Scheduler,\n spec: CollectionSpec<S, K, V>\n): ProjectionCollection<K, V> => {\n const values = new Map<K, V>();\n let ids: readonly K[] = Object.freeze([]);\n let staged = new Map<K, Entry<V>>();\n let nextIds = ids;\n let change: CollectionImpact<K> | undefined;\n let instance: ReturnType<typeof spec.build> | undefined;\n let initialized = false;\n let reset = false;\n let revision = 0;\n let idsRevision = 0;\n let all: readonly V[] | undefined;\n const itemVersions = new Map<K, number>();\n const items = new Map<K, Readable<V | undefined>>();\n const itemListeners = new Map<K, Set<() => void>>();\n const idsListeners = new Set<() => void>();\n const allListeners = new Set<() => void>();\n const listeners = new Set<(change: CollectionImpact<K>) => void>();\n const changedKeys = new Set<K>();\n let orderChanged = false;\n const hasNext = (key: K) => (staged.has(key) ? staged.get(key)!.present : values.has(key));\n const getNext = (key: K) => {\n const entry = staged.get(key);\n return entry ? (entry.present ? entry.value : undefined) : values.get(key);\n };\n const owner = createNode(scheduler, spec, {\n evaluate: (sources, build, active) => {\n staged = new Map();\n nextIds = ids;\n change = undefined;\n changedKeys.clear();\n let explicitOrder: readonly K[] | undefined;\n let cleared = false;\n const nextHas = (key: K) =>\n staged.has(key) ? staged.get(key)!.present : !cleared && values.has(key);\n const nextGet = (key: K) => {\n const entry = staged.get(key);\n return entry\n ? entry.present\n ? entry.value\n : undefined\n : cleared\n ? undefined\n : values.get(key);\n };\n const deriveIds = () => {\n const result = cleared ? [] : ids.filter(nextHas);\n for (const [key, entry] of staged)\n if (entry.present && (cleared || !values.has(key))) result.push(key);\n return result;\n };\n const read = (next: boolean): CollectionRead<K, V> => ({\n get: key => {\n assertScope(active);\n return next ? nextGet(key) : values.get(key);\n },\n has: key => {\n assertScope(active);\n return next ? nextHas(key) : values.has(key);\n },\n ids: () => {\n assertScope(active);\n return next ? Object.freeze(explicitOrder ? explicitOrder.slice() : deriveIds()) : ids;\n },\n });\n const writer: ProjectionCollectionWriter<K, V> = {\n set: (key, value) => {\n assertScope(active);\n if (typeof key !== 'string') throw new TypeError('Projection keys must be strings.');\n staged.set(key, { present: true, value });\n },\n remove: key => {\n assertScope(active);\n staged.set(key, { present: false });\n },\n order: order => {\n assertScope(active);\n explicitOrder = order.slice();\n },\n replace: entries => {\n assertScope(active);\n staged.clear();\n cleared = true;\n const order: K[] = [];\n for (const [key, value] of entries) {\n if (staged.has(key)) throw new TypeError('Duplicate projection key.');\n writer.set(key, value);\n order.push(key);\n }\n explicitOrder = order;\n },\n };\n const input = { sources, previous: read(false), next: read(true), writer };\n if (build || !instance) {\n profile.materialized.rebuilt();\n instance = undefined;\n cleared = true;\n const built = spec.build(input);\n assertSynchronous(built);\n instance = built;\n } else {\n profile.materialized.updated();\n const result = instance.update(input);\n assertSynchronous(result);\n if (result?.kind === 'rebuild') {\n staged.clear();\n cleared = true;\n explicitOrder = undefined;\n instance = undefined;\n const built = spec.build(input);\n assertSynchronous(built);\n instance = built;\n build = true;\n }\n }\n if (cleared)\n for (const key of values.keys()) if (!staged.has(key)) staged.set(key, { present: false });\n const added = new Set<K>();\n const removed = new Set<K>();\n const updated = new Set<K>();\n profile.projection('touchedKeys', staged.size);\n for (const [key, entry] of staged) {\n const existed = values.has(key);\n if (entry.present) {\n if (!existed) added.add(key);\n else if (!(spec.isEqual ?? Object.is)(values.get(key) as V, entry.value))\n updated.add(key);\n else staged.delete(key);\n } else if (existed) removed.add(key);\n else staged.delete(key);\n }\n if (explicitOrder || added.size || removed.size) {\n const order = explicitOrder ?? [...ids.filter(key => !removed.has(key)), ...added];\n const seen = new Set(order);\n if (\n seen.size !== order.length ||\n order.length !== values.size + added.size - removed.size ||\n order.some(key => !hasNext(key))\n )\n throw new TypeError('Projection order must contain every key exactly once.');\n nextIds =\n ids.length === order.length && ids.every((key, i) => key === order[i])\n ? ids\n : Object.freeze(order.slice());\n }\n orderChanged = nextIds !== ids;\n if (added.size || removed.size || updated.size || orderChanged) {\n let commonOrderChanged = false;\n if (orderChanged) {\n const before = ids.filter(key => !removed.has(key));\n const after = nextIds.filter(key => !added.has(key));\n commonOrderChanged = before.some((key, i) => after[i] !== key);\n }\n change = Object.freeze({\n kind: 'incremental',\n added: readonlySet(added),\n removed: readonlySet(removed),\n updated: readonlySet(updated),\n orderChanged: commonOrderChanged,\n });\n [...added, ...removed, ...updated].forEach(key => changedKeys.add(key));\n profile.projection('changedKeys', changedKeys.size);\n }\n reset = build;\n return change !== undefined;\n },\n context: active => {\n const input: CollectionInput<K, V> = {\n get: key => {\n assertScope(active);\n return getNext(key);\n },\n has: key => {\n assertScope(active);\n return hasNext(key);\n },\n ids: () => {\n assertScope(active);\n return nextIds;\n },\n change,\n revision: revision + (change ? 1 : 0),\n reset,\n };\n return Object.freeze(input);\n },\n revision: () => revision,\n reset: () => reset,\n publish: () => {\n for (const [key, entry] of staged) {\n if (entry.present) values.set(key, entry.value);\n else values.delete(key);\n }\n if (change) {\n if (initialized) revision++;\n if (orderChanged && initialized) idsRevision++;\n all = undefined;\n changedKeys.forEach(key => {\n if (items.has(key))\n itemVersions.set(key, (itemVersions.get(key) ?? 0) + (initialized ? 1 : 0));\n });\n }\n ids = nextIds;\n initialized = true;\n },\n emit: call => {\n profile.materialized.notification();\n const fault = owner.node.fault !== undefined;\n const resetEvent = Object.freeze({ kind: 'reset' as const });\n Array.from(listeners).forEach(listener => call(() => listener(change ?? resetEvent)));\n if (orderChanged || !change || fault || owner.node.statusChanged)\n Array.from(idsListeners).forEach(listener => call(listener));\n Array.from(allListeners).forEach(listener => call(listener));\n const keys =\n !change || fault || owner.node.statusChanged ? itemListeners.keys() : changedKeys;\n for (const key of keys)\n Array.from(itemListeners.get(key) ?? []).forEach(listener => call(listener));\n },\n clear: () => {\n staged.clear();\n nextIds = ids;\n change = undefined;\n reset = false;\n changedKeys.clear();\n orderChanged = false;\n },\n release: () => {\n values.clear();\n staged.clear();\n items.clear();\n itemVersions.clear();\n itemListeners.clear();\n idsListeners.clear();\n allListeners.clear();\n listeners.clear();\n ids = nextIds = Object.freeze([]);\n all = undefined;\n instance = undefined;\n },\n });\n const handle = {\n ids: {\n current: () => {\n owner.check();\n return ids;\n },\n revision: () => {\n owner.check();\n return idsRevision;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n idsListeners.add(listener);\n return () => {\n idsListeners.delete(listener);\n };\n },\n },\n all: {\n current: () => {\n owner.check();\n if (!all) {\n profile.collectionView.arrayCopied();\n all = Object.freeze(ids.map(key => values.get(key) as V));\n }\n return all;\n },\n revision: () => {\n owner.check();\n return revision;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n allListeners.add(listener);\n return () => {\n allListeners.delete(listener);\n };\n },\n },\n item: (key: K) => {\n owner.check();\n const old = items.get(key);\n if (old) return old;\n itemVersions.set(key, 0);\n const readable: Readable<V | undefined> = Object.freeze({\n current: () => {\n owner.check();\n return values.get(key);\n },\n revision: () => {\n owner.check();\n return itemVersions.get(key) ?? 0;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n const set = itemListeners.get(key) ?? new Set();\n set.add(listener);\n itemListeners.set(key, set);\n return () => {\n set.delete(listener);\n if (!set.size) itemListeners.delete(key);\n };\n },\n });\n projectionHandles.add(readable);\n items.set(key, readable);\n return readable;\n },\n revision: () => {\n owner.check();\n return revision;\n },\n subscribe: (listener: (change: CollectionImpact<K>) => void) => {\n owner.check();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n rebuild: owner.rebuild,\n dispose: owner.dispose,\n } as ProjectionCollection<K, V>;\n projectionHandles.add(handle.ids);\n projectionHandles.add(handle.all);\n collectionHandles.add(handle);\n owner.install(handle);\n return Object.freeze(handle);\n};\n","import { documentReader, readerFor } from '../access/reader';\nimport { nodeAt } from '../address';\nimport * as target from '../impact-target';\nimport { accessOf } from '../runtime/access';\nimport { attachProjection, documentReadableOwner } from '../runtime/notification';\nimport type { DocumentCommit, DocumentReadable } from '../runtime/contract';\nimport type { DocumentSchema, ImpactTarget, CollectionSelector } from '../schema';\nimport { collectionSchema } from '../schema';\nimport type { DocumentSource, ProjectionSource, ValueInput } from './contract';\nimport { ProjectionError } from './contract';\nimport { collectionHandles } from './collection';\nimport type { Readable } from './readable';\nimport { assertScope, projectionHandles, type Scheduler, type SourceRecord } from './scheduler';\n\nexport const createSources = (scheduler: Scheduler) => {\n const documents = new Map<object, object>();\n const readables = new Map<\n object,\n Map<\n object,\n {\n readonly source: object;\n readonly accept: (value: unknown) => void;\n }\n >\n >();\n const collections = new WeakSet<object>();\n const document = <S extends DocumentSchema>(runtime: DocumentReadable<S>): DocumentSource<S> => {\n scheduler.assertIdle();\n const state = accessOf(runtime);\n if (state.disposed) throw new Error('Document has been disposed.');\n const existing = documents.get(state);\n if (existing) return existing as DocumentSource<S>;\n const bindings: { handle: object; targets: readonly ImpactTarget[]; record: SourceRecord }[] =\n [];\n const make = (targets: readonly ImpactTarget[], collection?: CollectionSelector): object => {\n if (state.disposed) throw new Error('Document has been disposed.');\n targets.forEach(value => {\n if (!target.belongs(value, state.schema))\n throw new Error('Projection target belongs to another schema.');\n });\n const old = bindings.find(\n entry =>\n Boolean(collection) === collections.has(entry.handle) &&\n entry.targets.length === targets.length &&\n entry.targets.every((value, i) => target.same(value, targets[i]))\n );\n if (old) return old.handle;\n let commits: DocumentCommit<S>[] = [];\n let reset = false;\n let orderDirty = false;\n const keys = new Set<string>();\n let candidates:\n { readonly keys: readonly string[]; readonly orderDirty: boolean } | undefined;\n const record: SourceRecord = {\n consumers: new Set(),\n disposed: false,\n fault: undefined,\n revision: runtime.revision,\n reset: () => reset,\n clear: () => {\n commits = [];\n reset = orderDirty = false;\n keys.clear();\n candidates = undefined;\n },\n context: active => {\n assertScope(active);\n if (state.disposed) throw new Error('Document has been disposed.');\n const read = collection\n ? readerFor(\n nodeAt(state.schema, collection.address, state.document) ??\n collectionSchema(collection),\n { root: () => state.document, active },\n collection.address\n )\n : documentReader(state.schema, () => state.document, active);\n return Object.freeze({\n read,\n target: collection,\n revision: runtime.revision(),\n commits: Object.freeze(commits.slice()),\n reset: record.reset(),\n ...(collection\n ? {\n candidates: (candidates ??= Object.freeze({\n keys: Object.freeze([...keys]),\n orderDirty,\n })),\n }\n : {}),\n });\n },\n };\n const handle = collection\n ? {}\n : {\n collection: (pick: Parameters<S['collection']>[0]) => {\n scheduler.assertIdle();\n const selector = state.schema.collection(pick);\n return make([selector], selector);\n },\n targets: (...selected: ImpactTarget[]) => {\n scheduler.assertIdle();\n if (!selected.length) throw new TypeError('Expected at least one target.');\n return make(selected);\n },\n };\n Object.freeze(handle);\n bindings.push({ handle, targets, record });\n if (collection) collections.add(handle);\n scheduler.register(handle, record);\n // The attachment delivers to all local bindings without extra document subscriptions.\n receivers.set(record, commit => {\n commits.push(commit);\n reset ||= commit.kind === 'replace';\n if (collection) {\n const change = commit.impact.collection(collection);\n if (change.kind === 'reset') reset = true;\n else {\n change.added.forEach(key => keys.add(key));\n change.removed.forEach(key => keys.add(key));\n change.updated.forEach(key => keys.add(key));\n orderDirty ||= Boolean(change.added.size || change.removed.size || change.orderChanged);\n }\n candidates = undefined;\n }\n });\n return handle;\n };\n const receivers = new Map<SourceRecord, (commit: DocumentCommit<S>) => void>();\n const handle = make([]) as DocumentSource<S>;\n const guard = (locked: boolean) => {\n state.projectionLocks = (state.projectionLocks ?? 0) + (locked ? 1 : -1);\n };\n scheduler.guards.add(guard);\n const unsubscribe = attachProjection(runtime, {\n capture: commit => {\n for (const binding of bindings) {\n if (!binding.targets.length || binding.targets.some(commit.impact.affects)) {\n receivers.get(binding.record)!(commit);\n scheduler.capture(binding.record);\n }\n }\n },\n settle: scheduler.settle,\n flush: scheduler.flush,\n dispose: () => {\n bindings.forEach(({ record }) => {\n record.fault = new ProjectionError(\n 'source',\n 'document disposed',\n [runtime.revision()],\n new Error('Document has been disposed.')\n );\n scheduler.capture(record);\n });\n scheduler.run();\n },\n });\n scheduler.cleanups.add(() => {\n unsubscribe();\n scheduler.guards.delete(guard);\n });\n documents.set(state, handle);\n return handle;\n };\n const valueSource = <T>(initial: T, equal: (a: T, b: T) => boolean) => {\n let value = initial;\n let previous = initial;\n let revision = 0;\n const handle = Object.freeze({}) as ProjectionSource<ValueInput<T>>;\n const record: SourceRecord = {\n consumers: new Set(),\n disposed: false,\n fault: undefined,\n revision: () => revision,\n reset: () => false,\n clear: () => {\n previous = value;\n },\n context: active => {\n assertScope(active);\n return Object.freeze({\n value,\n previous,\n revision,\n changed: !equal(previous, value),\n reset: false,\n });\n },\n };\n scheduler.register(handle, record);\n const accept = (next: T) => {\n scheduler.assertIdle();\n const recovering = record.fault !== undefined;\n if (equal(value, next) && !recovering) return;\n record.fault = undefined;\n value = next;\n revision++;\n scheduler.capture(record);\n };\n return {\n source: handle,\n accept,\n set(next: T) {\n accept(next);\n scheduler.run();\n },\n };\n };\n return {\n dispose: () => {\n documents.clear();\n readables.clear();\n },\n document,\n input: <T>(initial: T, options?: { readonly isEqual?: (a: T, b: T) => boolean }) => {\n const { source, set } = valueSource(initial, options?.isEqual ?? Object.is);\n return Object.freeze({ source, set });\n },\n fromReadable: <T>(\n readable: Readable<T>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): ProjectionSource<ValueInput<T>> => {\n scheduler.assertIdle();\n if (projectionHandles.has(readable))\n throw new Error('Projection nodes must be declared directly as sources.');\n const equal = options?.isEqual ?? Object.is;\n let bindings = readables.get(readable);\n const old = bindings?.get(equal);\n if (old) return old.source as ProjectionSource<ValueInput<T>>;\n const input = valueSource(readable.current(), equal);\n if (bindings) {\n bindings.set(equal, { source: input.source, accept: value => input.accept(value as T) });\n return input.source;\n }\n bindings = new Map([\n [equal, { source: input.source, accept: (value: unknown) => input.accept(value as T) }],\n ]);\n const members = bindings;\n const receive = (settle = true) => {\n if (!scheduler.active) return;\n let value: T;\n try {\n value = readable.current();\n } catch (cause) {\n for (const member of members.values()) {\n const record = scheduler.source(member.source);\n record.fault = new ProjectionError(\n 'source',\n 'external readable',\n [record.revision()],\n cause\n );\n scheduler.capture(record);\n }\n if (settle) scheduler.run();\n return;\n }\n for (const member of members.values()) {\n try {\n member.accept(value);\n } catch (cause) {\n const record = scheduler.source(member.source);\n record.fault = new ProjectionError(\n 'source',\n 'external readable',\n [record.revision()],\n cause\n );\n scheduler.capture(record);\n }\n }\n if (settle) scheduler.run();\n };\n let unsubscribe: (() => void) | undefined;\n let detach: (() => void) | undefined;\n try {\n const owner = documentReadableOwner(readable);\n if (owner) {\n document(owner);\n detach = attachProjection(owner, {\n capture: () => receive(false),\n settle: scheduler.settle,\n flush: scheduler.flush,\n dispose: () => {\n for (const member of members.values()) {\n const record = scheduler.source(member.source);\n record.fault = new ProjectionError(\n 'source',\n 'document readable disposed',\n [record.revision()],\n new Error('Document has been disposed.')\n );\n scheduler.capture(record);\n }\n scheduler.run();\n },\n });\n }\n unsubscribe = readable.subscribe(() => receive());\n input.accept(readable.current());\n } catch (error) {\n try {\n unsubscribe?.();\n detach?.();\n } finally {\n scheduler.unregisterSource(input.source);\n }\n throw error;\n }\n scheduler.cleanups.add(unsubscribe);\n if (detach) scheduler.cleanups.add(detach);\n readables.set(readable, bindings);\n scheduler.run();\n return input.source;\n },\n assertCollection: (handle: object) => {\n scheduler.source(handle);\n if (!collections.has(handle) && !collectionHandles.has(handle))\n throw new Error('map requires a collection source.');\n },\n };\n};\n","import type { ProjectionSources, ProjectionValue, ValueSpec } from './contract';\nimport { createNode } from './node';\nimport { assertScope, assertSynchronous, type Scheduler } from './scheduler';\nimport { profile } from '../profile';\n\nexport const createValue = <S extends ProjectionSources, T>(\n scheduler: Scheduler,\n spec: ValueSpec<S, T>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n): ProjectionValue<T> => {\n let instance: ReturnType<typeof spec.build> | undefined;\n let value!: T;\n let next!: T;\n let previous!: T;\n let initialized = false;\n let revision = 0;\n let changed = false;\n let reset = false;\n const listeners = new Set<() => void>();\n const owner = createNode(scheduler, spec, {\n evaluate: (sources, build) => {\n let candidate: T;\n if (build || !instance) {\n profile.materialized.rebuilt();\n instance = undefined;\n const built = spec.build(sources);\n assertSynchronous(built);\n instance = built;\n candidate = built.value;\n } else {\n profile.materialized.updated();\n const result = instance.update(sources);\n assertSynchronous(result);\n if (result.kind === 'rebuild') {\n instance = undefined;\n const built = spec.build(sources);\n assertSynchronous(built);\n instance = built;\n candidate = built.value;\n build = true;\n } else candidate = result.kind === 'changed' ? result.value : value;\n }\n previous = value;\n changed = !initialized || !(options?.isEqual ?? Object.is)(value, candidate);\n next = changed ? candidate : value;\n reset = build;\n return changed;\n },\n context: active => {\n assertScope(active);\n return Object.freeze({\n value: next,\n previous,\n changed,\n revision: revision + (changed ? 1 : 0),\n reset,\n });\n },\n revision: () => revision,\n reset: () => reset,\n publish: () => {\n if (changed && initialized) revision++;\n value = next;\n initialized = true;\n },\n emit: call => {\n profile.materialized.notification();\n Array.from(listeners).forEach(listener => call(listener));\n },\n clear: () => {\n next = value;\n previous = value;\n changed = false;\n reset = false;\n },\n release: () => {\n listeners.clear();\n instance = undefined;\n value = next = previous = undefined as T;\n },\n });\n const handle = Object.freeze({\n current: () => {\n owner.check();\n return value;\n },\n revision: () => {\n owner.check();\n return revision;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n rebuild: owner.rebuild,\n dispose: owner.dispose,\n }) as ProjectionValue<T>;\n owner.install(handle);\n return handle;\n};\n","import type {\n CollectionInput,\n CollectionRead,\n ProjectionInputs,\n ProjectionRuntime,\n ProjectionSource,\n ProjectionSources,\n ProjectionValue,\n ValueSpec,\n} from './contract';\nimport type { Synchronous } from '../runtime/contract';\nimport { assertSynchronous, createScheduler } from './scheduler';\nimport { createSources } from './source';\nimport { createValue } from './value';\nimport { createCollection } from './collection';\nimport type { ProjectionError } from './contract';\nimport { profile } from '../profile';\n\nconst debug = new WeakMap<\n object,\n () => { nodes: number; sources: number; subscriptions: number; pending: number }\n>();\nexport const projectionDebug = (runtime: ProjectionRuntime) => {\n const read = debug.get(runtime);\n if (!read) throw new Error('Unknown projection runtime.');\n return Object.freeze(read());\n};\nexport const createProjectionRuntime = (options: {\n readonly onError: (error: ProjectionError) => void;\n}): ProjectionRuntime => {\n const scheduler = createScheduler(options.onError);\n const sources = createSources(scheduler);\n function value<S extends ProjectionSources, T>(\n sources: S,\n compute: (sources: ProjectionInputs<S>) => Synchronous<T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ProjectionValue<T>;\n function value<S extends ProjectionSources, T>(\n spec: ValueSpec<S, T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ProjectionValue<T>;\n function value<S extends ProjectionSources, T>(\n input: S | ValueSpec<S, T>,\n computeOrOptions?:\n ((sources: ProjectionInputs<S>) => T) | { readonly isEqual?: (a: T, b: T) => boolean },\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): ProjectionValue<T> {\n if (typeof computeOrOptions !== 'function')\n return createValue(scheduler, input as ValueSpec<S, T>, computeOrOptions);\n const compute = (input: ProjectionInputs<S>) => {\n const result = computeOrOptions(input);\n assertSynchronous(result);\n return result;\n };\n return createValue(\n scheduler,\n {\n sources: input as S,\n build: input => ({\n value: compute(input),\n update: input => ({ kind: 'changed', value: compute(input) }),\n }),\n },\n options\n );\n }\n const map = <K extends string, V, R>(\n source: ProjectionSource<\n | CollectionInput<K, V>\n | {\n readonly read: CollectionRead<K, V>;\n readonly reset: boolean;\n readonly candidates: { readonly keys: readonly K[]; readonly orderDirty: boolean };\n }\n >,\n mapper: (id: K, entry: V) => R,\n options?: { readonly isEqual?: (a: R, b: R) => boolean }\n ) => {\n sources.assertCollection(source);\n const calculate = (id: K, entry: V): R => {\n const value = mapper(id, entry);\n assertSynchronous(value);\n return value;\n };\n return createCollection(scheduler, {\n sources: { source },\n isEqual: options?.isEqual,\n build: ({ sources, writer }) => {\n const input = sources.source;\n const read = 'read' in input ? input.read : input;\n const ids = read.ids();\n profile.collectionView.idsScanned(ids.length);\n for (const id of ids) {\n profile.collectionView.mapped();\n writer.set(id, calculate(id, read.get(id)!));\n }\n writer.order(ids);\n return {\n update: ({ sources, writer }) => {\n const input = sources.source;\n if (input.reset) return { kind: 'rebuild' };\n const read = 'read' in input ? input.read : input;\n let keys: Iterable<K>;\n let structural: boolean;\n if ('candidates' in input) {\n keys = input.candidates.keys;\n structural = input.candidates.orderDirty;\n } else {\n const change = input.change;\n if (!change) return;\n if (change.kind === 'reset') return { kind: 'rebuild' };\n keys = new Set([...change.added, ...change.removed, ...change.updated]);\n structural = Boolean(change.added.size || change.removed.size || change.orderChanged);\n }\n for (const key of keys) {\n if (!read.has(key)) writer.remove(key);\n else {\n profile.collectionView.mapped();\n writer.set(key, calculate(key, read.get(key)!));\n }\n }\n if (structural) {\n const ids = read.ids();\n profile.collectionView.idsScanned(ids.length);\n writer.order(ids);\n }\n },\n };\n },\n });\n };\n const runtime: ProjectionRuntime = {\n document: sources.document,\n input: sources.input,\n fromReadable: sources.fromReadable,\n value,\n collection: () => spec => createCollection(scheduler, spec),\n map,\n batch: scheduler.batch,\n dispose: () => {\n try {\n scheduler.dispose();\n } finally {\n if (!scheduler.active) sources.dispose();\n }\n },\n };\n debug.set(runtime, scheduler.debug);\n return Object.freeze(runtime);\n};\n"],"mappings":"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"}