@voidhash/mimic 0.0.1-alpha.2 → 0.0.1-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +13 -13
- package/dist/index.cjs +184 -0
- package/dist/index.d.cts +99 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +99 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +184 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/Primitive.ts +3 -0
- package/src/primitives/Either.ts +364 -0
- package/src/primitives/TreeNode.ts +2 -2
- package/tests/primitives/Either.test.ts +707 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["make","make","tokensInternal: ReadonlyArray<OperationPathToken>","encode","decode","encode","OperationPath.encode","decode","OperationPath.decode","OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","String","OperationDefinition.make","snapshot: Record<string, unknown>","Operation.fromDefinition","newState: InferStructState<TFields>","initialState: Record<string, unknown>","OperationPath.pathsOverlap","OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","Number","OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","byCode: Record<number, string>","byChar: Record<string, number>","paddingDict: Record<number, number>","paddingDict","_base62CharSet: IndexedCharacterSet | null","result: string[]","FractionalIndex.base62CharSet","FractionalIndex.generateKeyBetween","OperationDefinition.make","entries: ArrayEntry<InferState<TElement>>[]","prevPos: string | null","Operation.fromDefinition","newState: ArrayState<TElement>","OperationPath.pathsOverlap","clientTokens","serverTokens","OperationPath.pathsEqual","OperationPath.isPrefix","Array","OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","descendantIds: string[]","FractionalIndex.base62CharSet","FractionalIndex.generateKeyBetween","OperationDefinition.make","children: TreeNodeSnapshot<any>[]","Operation.fromDefinition","newState: TreeState<TRoot>","node","OperationPath.pathsOverlap","clientTokens","serverTokens","OperationPath.pathsEqual","OperationPath.isPrefix","make","options: ProxyEnvironmentOptions","make","Operation.encode","Operation.decode","make","_state: Primitive.InferState<TSchema> | undefined","_pending: Operation.Operation<any, any, any>[]","_txOps: Operation.Operation<any, any, any>[]","_txBaseState: Primitive.InferState<TSchema> | undefined","current: unknown","ProxyEnvironment.make","OperationPath.make","Transaction.make","Schema"],"sources":["../src/primitives/shared.ts","../src/OperationDefinition.ts","../src/OperationPath.ts","../src/Operation.ts","../src/primitives/String.ts","../src/primitives/Struct.ts","../src/primitives/Boolean.ts","../src/primitives/Number.ts","../src/primitives/Literal.ts","../src/FractionalIndex.ts","../src/primitives/Array.ts","../src/primitives/Lazy.ts","../src/primitives/Union.ts","../src/primitives/TreeNode.ts","../src/primitives/Tree.ts","../src/Primitive.ts","../src/ProxyEnvironment.ts","../src/Transaction.ts","../src/Document.ts","../src/Transform.ts","../src/Presence.ts"],"sourcesContent":["import * as Operation from \"../Operation\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as Transform from \"../Transform\";\n\n// =============================================================================\n// Primitive Interface & Type Utilities\n// =============================================================================\n\n/**\n * Base interface that all primitives must implement.\n * Provides type inference helpers and internal operations.\n */\nexport interface Primitive<TState, TProxy> {\n readonly _tag: string;\n readonly _State: TState;\n readonly _Proxy: TProxy;\n readonly _internal: PrimitiveInternal<TState, TProxy>;\n }\n \n /**\n * Internal operations that each primitive must provide.\n */\n export interface PrimitiveInternal<TState, TProxy> {\n /** Creates a proxy for generating operations */\n readonly createProxy: (env: ProxyEnvironment.ProxyEnvironment, path: OperationPath.OperationPath) => TProxy;\n /** Applies an operation to the current state, returning the new state */\n readonly applyOperation: (state: TState | undefined, operation: Operation.Operation<any, any, any>) => TState;\n /** Returns the initial/default state for this primitive */\n readonly getInitialState: () => TState | undefined;\n /**\n * Transforms a client operation against a server operation.\n * Used for operational transformation (OT) conflict resolution.\n * \n * @param clientOp - The client's operation to transform\n * @param serverOp - The server's operation that has already been applied\n * @returns TransformResult indicating how the client operation should be handled\n */\n readonly transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ) => Transform.TransformResult;\n }\n \n /**\n * Any primitive type - used for generic constraints.\n */\n export type AnyPrimitive = Primitive<any, any>;\n \n /**\n * Infer the state type from a primitive.\n */\n export type InferState<T> = T extends Primitive<infer S, any> ? S : never;\n \n /**\n * Infer the proxy type from a primitive.\n */\n export type InferProxy<T> = T extends Primitive<any, infer P> ? P : never;\n \n /**\n * Helper type to conditionally add undefined based on TDefined.\n * When TDefined is true, the value is guaranteed to be defined (via required() or default()).\n * When TDefined is false, the value may be undefined.\n */\n export type MaybeUndefined<T, TDefined extends boolean> = TDefined extends true ? T : T | undefined;\n \n /**\n * Infer the snapshot type from a primitive.\n * The snapshot is a readonly, type-safe structure suitable for rendering.\n */\n export type InferSnapshot<T> = T extends Primitive<any, infer P>\n ? P extends { toSnapshot(): infer S } ? S : never\n : never;\n \n // =============================================================================\n // Validation Errors\n // =============================================================================\n \n export class ValidationError extends Error {\n readonly _tag = \"ValidationError\";\n constructor(message: string) {\n super(message);\n this.name = \"ValidationError\";\n }\n }\n \n // =============================================================================\n // Validation Infrastructure\n // =============================================================================\n \n /**\n * A validator that checks a value and returns whether it's valid.\n */\n export interface Validator<T> {\n readonly validate: (value: T) => boolean;\n readonly message: string;\n }\n \n\n/**\n * Runs all validators against a value, throwing ValidationError if any fail.\n */\nexport function runValidators<T>(value: T, validators: readonly { validate: (value: T) => boolean; message: string }[]): void {\n for (const validator of validators) {\n if (!validator.validate(value)) {\n throw new ValidationError(validator.message);\n }\n }\n}\n\n/**\n * Checks if an operation is compatible with the given operation definitions.\n * @param operation - The operation to check.\n * @param operationDefinitions - The operation definitions to check against.\n * @returns True if the operation is compatible, false otherwise.\n */\nexport function isCompatibleOperation(operation: Operation.Operation<any, any, any>, operationDefinitions: Record<string, OperationDefinition.OperationDefinition<any, any, any>>) {\n const values = Object.values(operationDefinitions);\n return values.some(value => value.kind === operation.kind);\n}\n\n","import { Schema } from \"effect\";\n\ntype Mutable<T> = T extends ReadonlyArray<infer U> ? Array<U> : { -readonly [K in keyof T]: T[K] };\n\nexport interface OperationDefinition<TKind, TPayload extends Schema.Schema.Any, TTarget extends Schema.Schema.Any> {\n readonly kind: TKind\n readonly payload: TPayload\n readonly target: TTarget\n}\n\nexport const make = <TKind, TPayload extends Schema.Schema.Any, TTarget extends Schema.Schema.Any>(options: {\n readonly kind: TKind\n readonly payload: TPayload\n readonly target: TTarget\n readonly apply: (payload: Schema.Schema.Type<TPayload>, target: Mutable<Schema.Schema.Type<TTarget>>) => void\n}) => {\n return {\n kind: options.kind,\n payload: options.payload,\n target: options.target,\n apply: options.apply\n } as const;\n}","// export type OperationPath = string\nexport type OperationPathToken = string\n\nexport interface OperationPath {\n readonly _tag: \"OperationPath\"\n readonly toTokens: () => ReadonlyArray<OperationPathToken>\n readonly concat: (other: OperationPath) => OperationPath\n readonly append: (token: OperationPathToken) => OperationPath\n readonly pop: () => OperationPath\n readonly shift: () => OperationPath\n}\n\nconst parseStringPath = (stringPath: string): ReadonlyArray<OperationPathToken> => {\n return stringPath.split(\"/\")\n}\n\nconst makeStringPathFromTokens = (tokens: ReadonlyArray<OperationPathToken>): string => {\n return tokens.join(\"/\")\n}\n\n/**\n * Creates a new operation path.\n * @param stringPath - The string path to create the path from.\n * @returns The new operation path.\n */\nexport function make(stringPath?: string): OperationPath {\n\n const tokensInternal: ReadonlyArray<OperationPathToken> = stringPath ? parseStringPath(stringPath) : []\n\n /**\n * Returns the tokens of the path.\n * @returns The tokens of the path.\n */\n const toTokens = () => {\n return tokensInternal\n }\n\n /**\n * Concatenates two paths.\n * @param other - The other path to concatenate.\n * @returns The new path.\n */\n const concat = (other: OperationPath): OperationPath => {\n return make(makeStringPathFromTokens(toTokens().concat(other.toTokens())))\n }\n\n /**\n * Appends a token to the path.\n * @param token - The token to append.\n * @returns The new path.\n */\n const append = (token: OperationPathToken): OperationPath => {\n return make(makeStringPathFromTokens(toTokens().concat([token])))\n }\n\n /**\n * Removes the last token from the path.\n * @returns The new path.\n */\n const pop = (): OperationPath => {\n return make(makeStringPathFromTokens(toTokens().slice(0, -1)))\n }\n\n /**\n * Removes the first token from the path.\n * @returns The new path.\n */\n const shift = (): OperationPath => {\n return make(makeStringPathFromTokens(toTokens().slice(1)))\n }\n\n return {\n _tag: \"OperationPath\",\n toTokens,\n concat,\n append,\n pop,\n shift\n } as const\n}\n\n/**\n * Creates a new operation path from tokens.\n * @param tokens - The tokens to create the path from.\n * @returns The new operation path.\n */\nexport function fromTokens(tokens: ReadonlyArray<OperationPathToken>): OperationPath {\n return make(makeStringPathFromTokens(tokens))\n}\n\n// =============================================================================\n// Path Utility Functions\n// =============================================================================\n\n/**\n * Checks if two operation paths overlap (one is prefix of the other or equal).\n */\nexport const pathsOverlap = (\n pathA: OperationPath,\n pathB: OperationPath\n): boolean => {\n const tokensA = pathA.toTokens().filter((t) => t !== \"\");\n const tokensB = pathB.toTokens().filter((t) => t !== \"\");\n\n const minLength = Math.min(tokensA.length, tokensB.length);\n\n for (let i = 0; i < minLength; i++) {\n if (tokensA[i] !== tokensB[i]) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * Checks if pathA is a prefix of pathB (pathA is ancestor of pathB).\n */\nexport const isPrefix = (\n pathA: OperationPath,\n pathB: OperationPath\n): boolean => {\n const tokensA = pathA.toTokens().filter((t) => t !== \"\");\n const tokensB = pathB.toTokens().filter((t) => t !== \"\");\n\n if (tokensA.length > tokensB.length) {\n return false;\n }\n\n for (let i = 0; i < tokensA.length; i++) {\n if (tokensA[i] !== tokensB[i]) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * Checks if two paths are exactly equal.\n */\nexport const pathsEqual = (\n pathA: OperationPath,\n pathB: OperationPath\n): boolean => {\n const tokensA = pathA.toTokens().filter((t) => t !== \"\");\n const tokensB = pathB.toTokens().filter((t) => t !== \"\");\n\n if (tokensA.length !== tokensB.length) {\n return false;\n }\n\n for (let i = 0; i < tokensA.length; i++) {\n if (tokensA[i] !== tokensB[i]) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * Gets the relative path of pathB with respect to pathA.\n * Assumes pathA is a prefix of pathB.\n */\nexport const getRelativePath = (\n basePath: OperationPath,\n fullPath: OperationPath\n): string[] => {\n const baseTokens = basePath.toTokens().filter((t) => t !== \"\");\n const fullTokens = fullPath.toTokens().filter((t) => t !== \"\");\n\n return fullTokens.slice(baseTokens.length);\n};\n\n/**\n * Encoded representation of an OperationPath for network transport.\n */\nexport type EncodedOperationPath = string;\n\n/**\n * Encodes an OperationPath to a string for network transport.\n * @param path - The operation path to encode.\n * @returns The encoded string representation.\n */\nexport const encode = (path: OperationPath): EncodedOperationPath => {\n return makeStringPathFromTokens(path.toTokens());\n};\n\n/**\n * Decodes an encoded string back to an OperationPath.\n * @param encoded - The encoded string representation.\n * @returns The decoded OperationPath.\n */\nexport const decode = (encoded: EncodedOperationPath): OperationPath => {\n return make(encoded);\n};","\nimport * as OperationPath from \"./OperationPath\"\nimport * as OperationDefinition from \"./OperationDefinition\"\nimport { Schema } from \"effect\";\n\n\nexport type Operation<TKind, TPayload extends Schema.Schema.Any, TDef extends OperationDefinition.OperationDefinition<TKind, TPayload, any>> = {\n readonly kind: TKind\n readonly path: OperationPath.OperationPath\n readonly payload: Schema.Schema.Type<TPayload>,\n\n} & TDef\n\nexport const fromDefinition = <TKind, TPayload extends Schema.Schema.Any, TDef extends OperationDefinition.OperationDefinition<TKind, TPayload, any>>(operationPath: OperationPath.OperationPath, definition: TDef, payload: Schema.Schema.Type<TPayload>): Operation<TKind, TPayload, TDef> => {\n return {\n kind: definition.kind,\n path: operationPath,\n payload: payload,\n } as Operation<TKind, TPayload, TDef>\n}\n\n/**\n * Encoded representation of an Operation for network transport.\n */\nexport interface EncodedOperation {\n readonly kind: unknown\n readonly path: OperationPath.EncodedOperationPath\n readonly payload: unknown\n}\n\n/**\n * Encodes an Operation to a JSON-serializable format for network transport.\n * @param operation - The operation to encode.\n * @returns The encoded representation.\n */\nexport const encode = <TKind, TPayload extends Schema.Schema.Any, TDef extends OperationDefinition.OperationDefinition<TKind, TPayload, any>>(\n operation: Operation<TKind, TPayload, TDef>\n): EncodedOperation => {\n return {\n kind: operation.kind,\n path: OperationPath.encode(operation.path),\n payload: operation.payload,\n }\n}\n\n/**\n * Decodes an encoded operation back to an Operation.\n * Note: This returns a partial operation without the definition methods.\n * The caller must have the operation definitions to fully reconstruct if needed.\n * @param encoded - The encoded representation.\n * @returns The decoded Operation (without definition-specific methods).\n */\nexport const decode = (encoded: EncodedOperation): Operation<unknown, Schema.Schema.Any, any> => {\n return {\n kind: encoded.kind,\n path: OperationPath.decode(encoded.path),\n payload: encoded.payload,\n } as Operation<unknown, Schema.Schema.Any, any>\n}","import { Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, Validator } from \"./shared\";\nimport { runValidators, isCompatibleOperation, ValidationError } from \"./shared\";\n\n// =============================================================================\n// String Primitive\n// =============================================================================\n\nexport interface StringProxy<TDefined extends boolean = false> {\n /** Gets the current string value */\n get(): MaybeUndefined<string, TDefined>;\n /** Sets the string value, generating a string.set operation */\n set(value: string): void;\n /** Returns a readonly snapshot of the string value for rendering */\n toSnapshot(): MaybeUndefined<string, TDefined>;\n}\n\ninterface StringPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: string | undefined;\n readonly validators: readonly Validator<string>[];\n}\n\nexport class StringPrimitive<TDefined extends boolean = false> implements Primitive<string, StringProxy<TDefined>> {\n readonly _tag = \"StringPrimitive\" as const;\n readonly _State!: string;\n readonly _Proxy!: StringProxy<TDefined>;\n\n private readonly _schema: StringPrimitiveSchema;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"string.set\" as const,\n payload: Schema.String,\n target: Schema.String,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: StringPrimitiveSchema) {\n this._schema = schema;\n }\n\n /** Mark this string as required */\n required(): StringPrimitive<true> {\n return new StringPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this string */\n default(defaultValue: string): StringPrimitive<true> {\n return new StringPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: string) => boolean, message: string): StringPrimitive<TDefined> {\n return new StringPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n /** Minimum string length */\n min(length: number): StringPrimitive<TDefined> {\n return this.refine(\n (v) => v.length >= length,\n `String must be at least ${length} characters`\n );\n }\n\n /** Maximum string length */\n max(length: number): StringPrimitive<TDefined> {\n return this.refine(\n (v) => v.length <= length,\n `String must be at most ${length} characters`\n );\n }\n\n /** Exact string length */\n length(exact: number): StringPrimitive<TDefined> {\n return this.refine(\n (v) => v.length === exact,\n `String must be exactly ${exact} characters`\n );\n }\n\n /** Match a regex pattern */\n regex(pattern: RegExp, message?: string): StringPrimitive<TDefined> {\n return this.refine(\n (v) => pattern.test(v),\n message ?? `String must match pattern ${pattern}`\n );\n }\n\n /** Validate as email format */\n email(): StringPrimitive<TDefined> {\n // Simple email regex - covers most common cases\n const emailPattern = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return this.refine(\n (v) => emailPattern.test(v),\n \"Invalid email format\"\n );\n }\n\n /** Validate as URL format */\n url(): StringPrimitive<TDefined> {\n return this.refine(\n (v) => {\n try {\n new URL(v);\n return true;\n } catch {\n return false;\n }\n },\n \"Invalid URL format\"\n );\n }\n\n readonly _internal: PrimitiveInternal<string, StringProxy<TDefined>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): StringProxy<TDefined> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<string, TDefined> => {\n const state = env.getState(operationPath) as string | undefined;\n return (state ?? defaultValue) as MaybeUndefined<string, TDefined>;\n },\n set: (value: string) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<string, TDefined> => {\n const state = env.getState(operationPath) as string | undefined;\n return (state ?? defaultValue) as MaybeUndefined<string, TDefined>;\n },\n };\n },\n\n applyOperation: (state: string | undefined, operation: Operation.Operation<any, any, any>): string => {\n if (!isCompatibleOperation(operation, this._opDefinitions)) {\n throw new ValidationError(`StringPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"string\") {\n throw new ValidationError(`StringPrimitive.set requires a string payload, got: ${typeof payload}`);\n }\n\n // Run validators\n runValidators(payload, this._schema.validators);\n\n return payload;\n },\n\n getInitialState: (): string | undefined => {\n return this._schema.defaultValue;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n // Client operation proceeds as-is\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new StringPrimitive */\nexport const String = (): StringPrimitive<false> =>\n new StringPrimitive({ required: false, defaultValue: undefined, validators: [] });\n\n","import { Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, AnyPrimitive, Validator, InferState, InferProxy, InferSnapshot } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators } from \"./shared\";\n\n\n/**\n * Maps a schema definition to its state type.\n * { name: StringPrimitive, age: NumberPrimitive } -> { name: string, age: number }\n */\nexport type InferStructState<TFields extends Record<string, AnyPrimitive>> = {\n readonly [K in keyof TFields]: InferState<TFields[K]>;\n};\n\n/**\n * Maps a schema definition to its snapshot type.\n * Each field's snapshot type is inferred from the field primitive.\n */\nexport type InferStructSnapshot<TFields extends Record<string, AnyPrimitive>> = {\n readonly [K in keyof TFields]: InferSnapshot<TFields[K]>;\n};\n\n/**\n * Maps a schema definition to its proxy type.\n * Provides nested field access + get()/set()/toSnapshot() methods for the whole struct.\n */\nexport type StructProxy<TFields extends Record<string, AnyPrimitive>, TDefined extends boolean = false> = {\n readonly [K in keyof TFields]: InferProxy<TFields[K]>;\n} & {\n /** Gets the entire struct value */\n get(): MaybeUndefined<InferStructState<TFields>, TDefined>;\n /** Sets the entire struct value */\n set(value: InferStructState<TFields>): void;\n /** Returns a readonly snapshot of the struct for rendering */\n toSnapshot(): MaybeUndefined<InferStructSnapshot<TFields>, TDefined>;\n};\n\ninterface StructPrimitiveSchema<TFields extends Record<string, AnyPrimitive>> {\n readonly required: boolean;\n readonly defaultValue: InferStructState<TFields> | undefined;\n readonly fields: TFields;\n readonly validators: readonly Validator<InferStructState<TFields>>[];\n}\n\nexport class StructPrimitive<TFields extends Record<string, AnyPrimitive>, TDefined extends boolean = false>\n implements Primitive<InferStructState<TFields>, StructProxy<TFields, TDefined>>\n{\n readonly _tag = \"StructPrimitive\" as const;\n readonly _State!: InferStructState<TFields>;\n readonly _Proxy!: StructProxy<TFields, TDefined>;\n\n private readonly _schema: StructPrimitiveSchema<TFields>;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"struct.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: StructPrimitiveSchema<TFields>) {\n this._schema = schema;\n }\n\n /** Mark this struct as required */\n required(): StructPrimitive<TFields, true> {\n return new StructPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this struct */\n default(defaultValue: InferStructState<TFields>): StructPrimitive<TFields, true> {\n return new StructPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the fields schema */\n get fields(): TFields {\n return this._schema.fields;\n }\n\n /** Add a custom validation rule (useful for cross-field validation) */\n refine(fn: (value: InferStructState<TFields>) => boolean, message: string): StructPrimitive<TFields, TDefined> {\n return new StructPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n readonly _internal: PrimitiveInternal<InferStructState<TFields>, StructProxy<TFields, TDefined>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): StructProxy<TFields, TDefined> => {\n const fields = this._schema.fields;\n const defaultValue = this._schema.defaultValue;\n\n // Helper to build a snapshot by calling toSnapshot on each field\n const buildSnapshot = (): InferStructSnapshot<TFields> | undefined => {\n const state = env.getState(operationPath);\n \n // Build snapshot from field proxies (they handle their own defaults)\n const snapshot: Record<string, unknown> = {};\n let hasAnyDefinedField = false;\n \n for (const key in fields) {\n const fieldPrimitive = fields[key]!;\n const fieldPath = operationPath.append(key);\n const fieldProxy = fieldPrimitive._internal.createProxy(env, fieldPath);\n const fieldSnapshot = (fieldProxy as { toSnapshot(): unknown }).toSnapshot();\n snapshot[key] = fieldSnapshot;\n if (fieldSnapshot !== undefined) {\n hasAnyDefinedField = true;\n }\n }\n \n // Return undefined only if there's no state, no struct default, and no field snapshots\n if (state === undefined && defaultValue === undefined && !hasAnyDefinedField) {\n return undefined;\n }\n \n return snapshot as InferStructSnapshot<TFields>;\n };\n\n // Create the base object with get/set/toSnapshot methods\n const base = {\n get: (): MaybeUndefined<InferStructState<TFields>, TDefined> => {\n const state = env.getState(operationPath) as InferStructState<TFields> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferStructState<TFields>, TDefined>;\n },\n set: (value: InferStructState<TFields>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<InferStructSnapshot<TFields>, TDefined> => {\n const snapshot = buildSnapshot();\n return snapshot as MaybeUndefined<InferStructSnapshot<TFields>, TDefined>;\n },\n };\n\n // Use a JavaScript Proxy to intercept field access\n return new globalThis.Proxy(base as StructProxy<TFields, TDefined>, {\n get: (target, prop, receiver) => {\n // Return base methods (get, set, toSnapshot)\n if (prop === \"get\") {\n return target.get;\n }\n if (prop === \"set\") {\n return target.set;\n }\n if (prop === \"toSnapshot\") {\n return target.toSnapshot;\n }\n\n // Handle symbol properties (like Symbol.toStringTag)\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n\n // Check if prop is a field in the schema\n if (prop in fields) {\n const fieldPrimitive = fields[prop as keyof TFields]!;\n const fieldPath = operationPath.append(prop as string);\n return fieldPrimitive._internal.createProxy(env, fieldPath);\n }\n\n return undefined;\n },\n has: (target, prop) => {\n if (prop === \"get\" || prop === \"set\" || prop === \"toSnapshot\") return true;\n if (typeof prop === \"string\" && prop in fields) return true;\n return false;\n },\n });\n },\n\n applyOperation: (\n state: InferStructState<TFields> | undefined,\n operation: Operation.Operation<any, any, any>\n ): InferStructState<TFields> => {\n const path = operation.path;\n const tokens = path.toTokens().filter((t: string) => t !== \"\");\n\n let newState: InferStructState<TFields>;\n\n // If path is empty or root, this is a struct.set operation\n if (tokens.length === 0) {\n if (operation.kind !== \"struct.set\") {\n throw new ValidationError(`StructPrimitive root cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"object\" || payload === null) {\n throw new ValidationError(`StructPrimitive.set requires an object payload`);\n }\n\n newState = payload as InferStructState<TFields>;\n } else {\n // Otherwise, delegate to the appropriate field primitive\n const fieldName = tokens[0] as keyof TFields;\n if (!(fieldName in this._schema.fields)) {\n throw new ValidationError(`Unknown field: ${globalThis.String(fieldName)}`);\n }\n\n const fieldPrimitive = this._schema.fields[fieldName]!;\n const remainingPath = path.shift();\n const fieldOperation = {\n ...operation,\n path: remainingPath,\n };\n\n // Get the current field state\n const currentState = state ?? ({} as InferStructState<TFields>);\n const currentFieldState = currentState[fieldName] as InferState<typeof fieldPrimitive> | undefined;\n\n // Apply the operation to the field\n const newFieldState = fieldPrimitive._internal.applyOperation(currentFieldState, fieldOperation);\n\n // Build updated state\n newState = {\n ...currentState,\n [fieldName]: newFieldState,\n };\n }\n\n // Run validators on the new state\n runValidators(newState, this._schema.validators);\n\n return newState;\n },\n\n getInitialState: (): InferStructState<TFields> | undefined => {\n if (this._schema.defaultValue !== undefined) {\n return this._schema.defaultValue;\n }\n\n // Build initial state from field defaults\n const fields = this._schema.fields;\n const initialState: Record<string, unknown> = {};\n let hasAnyDefault = false;\n\n for (const key in fields) {\n const fieldDefault = fields[key]!._internal.getInitialState();\n if (fieldDefault !== undefined) {\n initialState[key] = fieldDefault;\n hasAnyDefault = true;\n }\n }\n\n return hasAnyDefault ? (initialState as InferStructState<TFields>) : undefined;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n const clientPath = clientOp.path;\n const serverPath = serverOp.path;\n\n // If paths don't overlap at all, no transformation needed\n if (!OperationPath.pathsOverlap(clientPath, serverPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n const clientTokens = clientPath.toTokens().filter((t: string) => t !== \"\");\n const serverTokens = serverPath.toTokens().filter((t: string) => t !== \"\");\n\n // If both are at root level (struct.set operations)\n if (clientTokens.length === 0 && serverTokens.length === 0) {\n // Client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n }\n\n // If server set entire struct and client is updating a field\n if (serverTokens.length === 0 && serverOp.kind === \"struct.set\") {\n // Client's field operation proceeds - optimistic update\n // Server will validate/reject if needed\n return { type: \"transformed\", operation: clientOp };\n }\n\n // If client set entire struct and server is updating a field\n if (clientTokens.length === 0 && clientOp.kind === \"struct.set\") {\n // Client's struct.set supersedes server's field update\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Both operations target fields\n if (clientTokens.length > 0 && serverTokens.length > 0) {\n const clientField = clientTokens[0] as keyof TFields;\n const serverField = serverTokens[0] as keyof TFields;\n\n // Different fields - no conflict\n if (clientField !== serverField) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Same field - delegate to field primitive\n const fieldPrimitive = this._schema.fields[clientField];\n if (!fieldPrimitive) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n const clientOpForField = {\n ...clientOp,\n path: clientOp.path.shift(),\n };\n const serverOpForField = {\n ...serverOp,\n path: serverOp.path.shift(),\n };\n\n const result = fieldPrimitive._internal.transformOperation(clientOpForField, serverOpForField);\n\n if (result.type === \"transformed\") {\n // Restore the original path\n return {\n type: \"transformed\",\n operation: {\n ...result.operation,\n path: clientOp.path,\n },\n };\n }\n\n return result;\n }\n\n // Default: no transformation needed\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new StructPrimitive with the given fields */\nexport const Struct = <TFields extends Record<string, AnyPrimitive>>(\n fields: TFields\n): StructPrimitive<TFields, false> =>\n new StructPrimitive({ required: false, defaultValue: undefined, fields, validators: [] });\n\n","import { Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, Validator } from \"./shared\";\nimport { runValidators, isCompatibleOperation, ValidationError } from \"./shared\";\n\n\nexport interface BooleanProxy<TDefined extends boolean = false> {\n /** Gets the current boolean value */\n get(): MaybeUndefined<boolean, TDefined>;\n /** Sets the boolean value, generating a boolean.set operation */\n set(value: boolean): void;\n /** Returns a readonly snapshot of the boolean value for rendering */\n toSnapshot(): MaybeUndefined<boolean, TDefined>;\n}\n\ninterface BooleanPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: boolean | undefined;\n readonly validators: readonly Validator<boolean>[];\n}\n\nexport class BooleanPrimitive<TDefined extends boolean = false> implements Primitive<boolean, BooleanProxy<TDefined>> {\n readonly _tag = \"BooleanPrimitive\" as const;\n readonly _State!: boolean;\n readonly _Proxy!: BooleanProxy<TDefined>;\n\n private readonly _schema: BooleanPrimitiveSchema;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"boolean.set\" as const,\n payload: Schema.Boolean,\n target: Schema.Boolean,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: BooleanPrimitiveSchema) {\n this._schema = schema;\n }\n\n /** Mark this boolean as required */\n required(): BooleanPrimitive<true> {\n return new BooleanPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this boolean */\n default(defaultValue: boolean): BooleanPrimitive<true> {\n return new BooleanPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: boolean) => boolean, message: string): BooleanPrimitive<TDefined> {\n return new BooleanPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n readonly _internal: PrimitiveInternal<boolean, BooleanProxy<TDefined>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): BooleanProxy<TDefined> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<boolean, TDefined> => {\n const state = env.getState(operationPath) as boolean | undefined;\n return (state ?? defaultValue) as MaybeUndefined<boolean, TDefined>;\n },\n set: (value: boolean) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<boolean, TDefined> => {\n const state = env.getState(operationPath) as boolean | undefined;\n return (state ?? defaultValue) as MaybeUndefined<boolean, TDefined>;\n },\n };\n },\n\n applyOperation: (state: boolean | undefined, operation: Operation.Operation<any, any, any>): boolean => {\n if (operation.kind !== \"boolean.set\") {\n throw new ValidationError(`BooleanPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"boolean\") {\n throw new ValidationError(`BooleanPrimitive.set requires a boolean payload, got: ${typeof payload}`);\n }\n\n // Run validators\n runValidators(payload, this._schema.validators);\n\n return payload;\n },\n\n getInitialState: (): boolean | undefined => {\n return this._schema.defaultValue;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new BooleanPrimitive */\nexport const Boolean = (): BooleanPrimitive<false> =>\n new BooleanPrimitive({ required: false, defaultValue: undefined, validators: [] });\n\n","import { Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, AnyPrimitive, Validator } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators, isCompatibleOperation } from \"./shared\";\n\n\nexport interface NumberProxy<TDefined extends boolean = false> {\n /** Gets the current number value */\n get(): MaybeUndefined<number, TDefined>;\n /** Sets the number value, generating a number.set operation */\n set(value: number): void;\n /** Returns a readonly snapshot of the number value for rendering */\n toSnapshot(): MaybeUndefined<number, TDefined>;\n}\n\ninterface NumberPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: number | undefined;\n readonly validators: readonly Validator<number>[];\n}\n\nexport class NumberPrimitive<TDefined extends boolean = false> implements Primitive<number, NumberProxy<TDefined>> {\n readonly _tag = \"NumberPrimitive\" as const;\n readonly _State!: number;\n readonly _Proxy!: NumberProxy<TDefined>;\n\n private readonly _schema: NumberPrimitiveSchema;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"number.set\" as const,\n payload: Schema.Number,\n target: Schema.Number,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: NumberPrimitiveSchema) {\n this._schema = schema;\n }\n\n /** Mark this number as required */\n required(): NumberPrimitive<true> {\n return new NumberPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this number */\n default(defaultValue: number): NumberPrimitive<true> {\n return new NumberPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: number) => boolean, message: string): NumberPrimitive<TDefined> {\n return new NumberPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n /** Minimum value (inclusive) */\n min(value: number): NumberPrimitive<TDefined> {\n return this.refine(\n (v) => v >= value,\n `Number must be at least ${value}`\n );\n }\n\n /** Maximum value (inclusive) */\n max(value: number): NumberPrimitive<TDefined> {\n return this.refine(\n (v) => v <= value,\n `Number must be at most ${value}`\n );\n }\n\n /** Must be positive (> 0) */\n positive(): NumberPrimitive<TDefined> {\n return this.refine(\n (v) => v > 0,\n \"Number must be positive\"\n );\n }\n\n /** Must be negative (< 0) */\n negative(): NumberPrimitive<TDefined> {\n return this.refine(\n (v) => v < 0,\n \"Number must be negative\"\n );\n }\n\n /** Must be an integer */\n int(): NumberPrimitive<TDefined> {\n return this.refine(\n (v) => globalThis.Number.isInteger(v),\n \"Number must be an integer\"\n );\n }\n\n readonly _internal: PrimitiveInternal<number, NumberProxy<TDefined>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): NumberProxy<TDefined> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<number, TDefined> => {\n const state = env.getState(operationPath) as number | undefined;\n return (state ?? defaultValue) as MaybeUndefined<number, TDefined>;\n },\n set: (value: number) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<number, TDefined> => {\n const state = env.getState(operationPath) as number | undefined;\n return (state ?? defaultValue) as MaybeUndefined<number, TDefined>;\n },\n };\n },\n\n applyOperation: (state: number | undefined, operation: Operation.Operation<any, any, any>): number => {\n if (operation.kind !== \"number.set\") {\n throw new ValidationError(`NumberPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"number\") {\n throw new ValidationError(`NumberPrimitive.set requires a number payload, got: ${typeof payload}`);\n }\n\n // Run validators\n runValidators(payload, this._schema.validators);\n\n return payload;\n },\n\n getInitialState: (): number | undefined => {\n return this._schema.defaultValue;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new NumberPrimitive */\nexport const Number = (): NumberPrimitive<false> =>\n new NumberPrimitive({ required: false, defaultValue: undefined, validators: [] });\n\n","import { Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, AnyPrimitive, Validator } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators, isCompatibleOperation } from \"./shared\";\n\n\n/** Valid literal types */\nexport type LiteralValue = string | number | boolean | null;\n\nexport interface LiteralProxy<T extends LiteralValue, TDefined extends boolean = false> {\n /** Gets the current literal value */\n get(): MaybeUndefined<T, TDefined>;\n /** Sets the literal value (must match the exact literal type) */\n set(value: T): void;\n /** Returns a readonly snapshot of the literal value for rendering */\n toSnapshot(): MaybeUndefined<T, TDefined>;\n}\n\ninterface LiteralPrimitiveSchema<T extends LiteralValue> {\n readonly required: boolean;\n readonly defaultValue: T | undefined;\n readonly literal: T;\n}\n\nexport class LiteralPrimitive<T extends LiteralValue, TDefined extends boolean = false> implements Primitive<T, LiteralProxy<T, TDefined>> {\n readonly _tag = \"LiteralPrimitive\" as const;\n readonly _State!: T;\n readonly _Proxy!: LiteralProxy<T, TDefined>;\n\n private readonly _schema: LiteralPrimitiveSchema<T>;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"literal.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: LiteralPrimitiveSchema<T>) {\n this._schema = schema;\n }\n\n /** Mark this literal as required */\n required(): LiteralPrimitive<T, true> {\n return new LiteralPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this literal */\n default(defaultValue: T): LiteralPrimitive<T, true> {\n return new LiteralPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the literal value this primitive represents */\n get literal(): T {\n return this._schema.literal;\n }\n\n readonly _internal: PrimitiveInternal<T, LiteralProxy<T, TDefined>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): LiteralProxy<T, TDefined> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<T, TDefined> => {\n const state = env.getState(operationPath) as T | undefined;\n return (state ?? defaultValue) as MaybeUndefined<T, TDefined>;\n },\n set: (value: T) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<T, TDefined> => {\n const state = env.getState(operationPath) as T | undefined;\n return (state ?? defaultValue) as MaybeUndefined<T, TDefined>;\n },\n };\n },\n\n applyOperation: (state: T | undefined, operation: Operation.Operation<any, any, any>): T => {\n if (operation.kind !== \"literal.set\") {\n throw new ValidationError(`LiteralPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (payload !== this._schema.literal) {\n throw new ValidationError(\n `LiteralPrimitive.set requires the exact literal value \"${globalThis.String(this._schema.literal)}\", got: \"${globalThis.String(payload)}\"`\n );\n }\n\n return payload as T;\n },\n\n getInitialState: (): T | undefined => {\n return this._schema.defaultValue;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new LiteralPrimitive with the given literal value */\nexport const Literal = <T extends LiteralValue>(literal: T): LiteralPrimitive<T, false> =>\n new LiteralPrimitive({ required: false, defaultValue: undefined, literal });\n\n","import { Effect, Random } from \"effect\"\n\n// ============================================================================\n// Types and Interfaces\n// ============================================================================\n\nexport interface IndexCharacterSetOptions {\n chars: string // sorted string of unique characters like \"0123456789ABC\"\n jitterRange?: number // default is 1/5 of the total range created by adding 3 characters\n firstPositive?: string // default is the middle character\n mostPositive?: string // default is the last character\n mostNegative?: string // default is the first character\n}\n\nexport interface IndexedCharacterSet {\n chars: string\n byChar: Record<string, number>\n byCode: Record<number, string>\n paddingDict: Record<number, number>\n length: number\n first: string\n last: string\n firstPositive: string\n mostPositive: string\n firstNegative: string\n mostNegative: string\n jitterRange: number\n}\n\nexport type IntegerLimits = {\n firstPositive: string\n mostPositive: string\n firstNegative: string\n mostNegative: string\n}\n\nexport interface GeneratorOptions {\n charSet?: IndexedCharacterSet\n useJitter?: boolean\n groupIdLength?: number\n}\n\n// ============================================================================\n// Character Set Functions\n// ============================================================================\n\ntype CharSetDicts = {\n byCode: Record<number, string>\n byChar: Record<string, number>\n length: number\n}\n\nfunction createCharSetDicts(charSet: string): CharSetDicts {\n const byCode: Record<number, string> = {}\n const byChar: Record<string, number> = {}\n const length = charSet.length\n\n for (let i = 0; i < length; i++) {\n const char = charSet[i]\n if (char === undefined) {\n throw new Error(\"invalid charSet: missing character at index \" + i)\n }\n byCode[i] = char\n byChar[char] = i\n }\n return {\n byCode: byCode,\n byChar: byChar,\n length: length,\n }\n}\n\nfunction integerLimits(\n dicts: CharSetDicts,\n firstPositive?: string,\n mostPositive?: string,\n mostNegative?: string\n): Effect.Effect<IntegerLimits, Error> {\n return Effect.gen(function* () {\n const firstPositiveIndex = firstPositive\n ? dicts.byChar[firstPositive]\n : Math.ceil(dicts.length / 2)\n const mostPositiveIndex = mostPositive\n ? dicts.byChar[mostPositive]\n : dicts.length - 1\n const mostNegativeIndex = mostNegative ? dicts.byChar[mostNegative] : 0\n\n if (\n firstPositiveIndex === undefined ||\n mostPositiveIndex === undefined ||\n mostNegativeIndex === undefined\n ) {\n return yield* Effect.fail(new Error(\"invalid charSet\"))\n }\n if (mostPositiveIndex - firstPositiveIndex < 3) {\n return yield* Effect.fail(\n new Error(\"mostPositive must be at least 3 characters away from neutral\")\n )\n }\n if (firstPositiveIndex - mostNegativeIndex < 3) {\n return yield* Effect.fail(\n new Error(\"mostNegative must be at least 3 characters away from neutral\")\n )\n }\n\n const firstPositiveChar = dicts.byCode[firstPositiveIndex]\n const mostPositiveChar = dicts.byCode[mostPositiveIndex]\n const firstNegativeChar = dicts.byCode[firstPositiveIndex - 1]\n const mostNegativeChar = dicts.byCode[mostNegativeIndex]\n\n if (\n firstPositiveChar === undefined ||\n mostPositiveChar === undefined ||\n firstNegativeChar === undefined ||\n mostNegativeChar === undefined\n ) {\n return yield* Effect.fail(new Error(\"invalid charSet\"))\n }\n\n return {\n firstPositive: firstPositiveChar,\n mostPositive: mostPositiveChar,\n firstNegative: firstNegativeChar,\n mostNegative: mostNegativeChar,\n }\n })\n}\n\nfunction paddingDict(jitterRange: number, charSetLength: number): Record<number, number> {\n const paddingDict: Record<number, number> = {}\n for (let i = 0; i < 100; i++) {\n const value = Math.pow(charSetLength, i)\n paddingDict[i] = value\n if (value > jitterRange) {\n break\n }\n }\n return paddingDict\n}\n\nexport function validateChars(characters: string): Effect.Effect<void, Error> {\n if (characters.length < 7) {\n return Effect.fail(new Error(\"charSet must be at least 7 characters long\"))\n }\n const chars = characters.split(\"\")\n const sorted = chars.sort()\n const isEqual = sorted.join(\"\") === characters\n if (!isEqual) {\n return Effect.fail(new Error(\"charSet must be sorted\"))\n }\n return Effect.void\n}\n\nexport function indexCharacterSet(\n options: IndexCharacterSetOptions\n): Effect.Effect<IndexedCharacterSet, Error> {\n return Effect.gen(function* () {\n yield* validateChars(options.chars)\n const dicts = createCharSetDicts(options.chars)\n const limits = yield* integerLimits(\n dicts,\n options.firstPositive,\n options.mostPositive,\n options.mostNegative\n )\n // 1/5 of the total range if we add 3 characters, TODO: feels a bit arbitrary and could be improved\n const jitterRange =\n options.jitterRange ?? Math.floor(Math.pow(dicts.length, 3) / 5)\n\n const paddingRange = paddingDict(jitterRange, dicts.length)\n\n const first = dicts.byCode[0]\n const last = dicts.byCode[dicts.length - 1]\n\n if (first === undefined || last === undefined) {\n return yield* Effect.fail(new Error(\"invalid charSet\"))\n }\n\n return {\n chars: options.chars,\n byChar: dicts.byChar,\n byCode: dicts.byCode,\n length: dicts.length,\n first,\n last,\n firstPositive: limits.firstPositive,\n mostPositive: limits.mostPositive,\n firstNegative: limits.firstNegative,\n mostNegative: limits.mostNegative,\n jitterRange,\n paddingDict: paddingRange,\n }\n })\n}\n\n// cache the base62 charSet since it's the default\nlet _base62CharSet: IndexedCharacterSet | null = null\n\nexport function base62CharSet(): IndexedCharacterSet {\n if (_base62CharSet) return _base62CharSet\n // We use Effect.runSync here because base62CharSet is a synchronous API\n // and we know the parameters are valid\n _base62CharSet = Effect.runSync(\n indexCharacterSet({\n // Base62 are all the alphanumeric characters, database and user friendly\n // For shorter strings and more room you could opt for more characters\n chars: \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n // This gives us nice human readable keys to start with a0 a1 etc\n firstPositive: \"a\",\n mostPositive: \"z\",\n mostNegative: \"A\",\n })\n )\n return _base62CharSet\n}\n\n// ============================================================================\n// Padding Functions\n// ============================================================================\n\nexport function makeSameLength(\n a: string,\n b: string,\n pad: \"start\" | \"end\",\n fillChar: string,\n forceLength?: number\n): [string, string] {\n const max = forceLength ?? Math.max(a.length, b.length)\n if (pad === \"start\") {\n return [a.padStart(max, fillChar), b.padStart(max, fillChar)]\n }\n return [a.padEnd(max, fillChar), b.padEnd(max, fillChar)]\n}\n\n// ============================================================================\n// Integer Length Functions\n// ============================================================================\n\nfunction distanceBetween(\n a: string,\n b: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<number, Error> {\n const indexA = charSet.byChar[a]\n const indexB = charSet.byChar[b]\n if (indexA === undefined || indexB === undefined) {\n return Effect.fail(new Error(\"invalid character in distance calculation\"))\n }\n return Effect.succeed(Math.abs(indexA - indexB))\n}\n\nfunction integerLengthFromSecondLevel(\n key: string,\n direction: \"positive\" | \"negative\",\n charSet: IndexedCharacterSet\n): Effect.Effect<number, Error> {\n if (key.length === 0) {\n return Effect.succeed(0)\n }\n const firstChar = key[0]\n if (!firstChar || firstChar > charSet.mostPositive || firstChar < charSet.mostNegative) {\n return Effect.fail(new Error(\"invalid firstChar on key\"))\n }\n if (firstChar === charSet.mostPositive && direction === \"positive\") {\n return Effect.gen(function* () {\n const totalPositiveRoom = yield* distanceBetween(firstChar, charSet.mostNegative, charSet)\n const rest = yield* integerLengthFromSecondLevel(key.slice(1), direction, charSet)\n return totalPositiveRoom + 1 + rest\n })\n }\n if (firstChar === charSet.mostNegative && direction === \"negative\") {\n return Effect.gen(function* () {\n const totalNegativeRoom = yield* distanceBetween(firstChar, charSet.mostPositive, charSet)\n const rest = yield* integerLengthFromSecondLevel(key.slice(1), direction, charSet)\n return totalNegativeRoom + 1 + rest\n })\n }\n if (direction === \"positive\") {\n return Effect.gen(function* () {\n const dist = yield* distanceBetween(firstChar, charSet.mostNegative, charSet)\n return dist + 2\n })\n } else {\n return Effect.gen(function* () {\n const dist = yield* distanceBetween(firstChar, charSet.mostPositive, charSet)\n return dist + 2\n })\n }\n}\n\nexport function integerLength(\n head: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<number, Error> {\n if (head.length === 0) {\n return Effect.fail(new Error(\"head cannot be empty\"))\n }\n const firstChar = head[0]\n if (!firstChar || firstChar > charSet.mostPositive || firstChar < charSet.mostNegative) {\n return Effect.fail(new Error(\"invalid firstChar on key\"))\n }\n if (firstChar === charSet.mostPositive) {\n return Effect.gen(function* () {\n const firstLevel = yield* distanceBetween(firstChar, charSet.firstPositive, charSet)\n const rest = yield* integerLengthFromSecondLevel(head.slice(1), \"positive\", charSet)\n return firstLevel + 1 + rest\n })\n }\n if (firstChar === charSet.mostNegative) {\n return Effect.gen(function* () {\n const firstLevel = yield* distanceBetween(firstChar, charSet.firstNegative, charSet)\n const rest = yield* integerLengthFromSecondLevel(head.slice(1), \"negative\", charSet)\n return firstLevel + 1 + rest\n })\n }\n const isPositiveRange = firstChar >= charSet.firstPositive\n if (isPositiveRange) {\n return Effect.gen(function* () {\n const dist = yield* distanceBetween(firstChar, charSet.firstPositive, charSet)\n return dist + 2\n })\n } else {\n return Effect.gen(function* () {\n const dist = yield* distanceBetween(firstChar, charSet.firstNegative, charSet)\n return dist + 2\n })\n }\n}\n\n// ============================================================================\n// Key as Number Functions\n// ============================================================================\n\nexport function encodeToCharSet(int: number, charSet: IndexedCharacterSet): Effect.Effect<string, Error> {\n if (int === 0) {\n const zero = charSet.byCode[0]\n if (zero === undefined) {\n return Effect.fail(new Error(\"invalid charSet: missing code 0\"))\n }\n return Effect.succeed(zero)\n }\n let res = \"\"\n const max = charSet.length\n while (int > 0) {\n const code = charSet.byCode[int % max]\n if (code === undefined) {\n return Effect.fail(new Error(\"invalid character code in encodeToCharSet\"))\n }\n res = code + res\n int = Math.floor(int / max)\n }\n return Effect.succeed(res)\n}\n\nexport function decodeCharSetToNumber(\n key: string,\n charSet: IndexedCharacterSet\n): number {\n let res = 0\n const length = key.length\n const max = charSet.length\n for (let i = 0; i < length; i++) {\n const char = key[i]\n if (char === undefined) {\n continue\n }\n const charIndex = charSet.byChar[char]\n if (charIndex === undefined) {\n continue\n }\n res += charIndex * Math.pow(max, length - i - 1)\n }\n return res\n}\n\nexport function addCharSetKeys(\n a: string,\n b: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n const base = charSet.length\n const [paddedA, paddedB] = makeSameLength(a, b, \"start\", charSet.first)\n\n const result: string[] = []\n let carry = 0\n\n // Iterate over the digits from right to left\n for (let i = paddedA.length - 1; i >= 0; i--) {\n const charA = paddedA[i]\n const charB = paddedB[i]\n if (!charA || !charB) {\n return Effect.fail(new Error(\"invalid character in addCharSetKeys\"))\n }\n const digitA = charSet.byChar[charA]\n const digitB = charSet.byChar[charB]\n if (digitA === undefined || digitB === undefined) {\n return Effect.fail(new Error(\"invalid character in addCharSetKeys\"))\n }\n const sum = digitA + digitB + carry\n carry = Math.floor(sum / base)\n const remainder = sum % base\n\n const codeChar = charSet.byCode[remainder]\n if (codeChar === undefined) {\n return Effect.fail(new Error(\"invalid character code in addCharSetKeys\"))\n }\n result.unshift(codeChar)\n }\n\n // If there's a carry left, add it to the result\n if (carry > 0) {\n const carryChar = charSet.byCode[carry]\n if (carryChar === undefined) {\n return Effect.fail(new Error(\"invalid carry character code\"))\n }\n result.unshift(carryChar)\n }\n\n return Effect.succeed(result.join(\"\"))\n}\n\nexport function subtractCharSetKeys(\n a: string,\n b: string,\n charSet: IndexedCharacterSet,\n stripLeadingZeros = true\n): Effect.Effect<string, Error> {\n const base = charSet.length\n const [paddedA, paddedB] = makeSameLength(a, b, \"start\", charSet.first)\n\n const result: string[] = []\n let borrow = 0\n\n // Iterate over the digits from right to left\n for (let i = paddedA.length - 1; i >= 0; i--) {\n const charA = paddedA[i]\n const charB = paddedB[i]\n if (!charA || !charB) {\n return Effect.fail(new Error(\"invalid character in subtractCharSetKeys\"))\n }\n let digitA = charSet.byChar[charA]\n const digitBValue = charSet.byChar[charB]\n if (digitA === undefined || digitBValue === undefined) {\n return Effect.fail(new Error(\"invalid character in subtractCharSetKeys\"))\n }\n const digitB = digitBValue + borrow\n\n // Handle borrowing\n if (digitA < digitB) {\n borrow = 1\n digitA += base\n } else {\n borrow = 0\n }\n\n const difference = digitA - digitB\n const codeChar = charSet.byCode[difference]\n if (codeChar === undefined) {\n return Effect.fail(new Error(\"invalid character code in subtractCharSetKeys\"))\n }\n result.unshift(codeChar)\n }\n\n // If there's a borrow left, we have a negative result, which is not supported\n if (borrow > 0) {\n return Effect.fail(\n new Error(\"Subtraction result is negative. Ensure a is greater than or equal to b.\")\n )\n }\n\n // Remove leading zeros\n while (\n stripLeadingZeros &&\n result.length > 1 &&\n result[0] === charSet.first\n ) {\n result.shift()\n }\n\n return Effect.succeed(result.join(\"\"))\n}\n\nexport function incrementKey(key: string, charSet: IndexedCharacterSet): Effect.Effect<string, Error> {\n const one = charSet.byCode[1]\n if (one === undefined) {\n return Effect.fail(new Error(\"invalid charSet: missing code 1\"))\n }\n return addCharSetKeys(key, one, charSet)\n}\n\nexport function decrementKey(key: string, charSet: IndexedCharacterSet): Effect.Effect<string, Error> {\n // we should not strip leading zeros here, this will break the sorting if the key already has leading zeros\n const one = charSet.byCode[1]\n if (one === undefined) {\n return Effect.fail(new Error(\"invalid charSet: missing code 1\"))\n }\n return subtractCharSetKeys(key, one, charSet, false)\n}\n\nexport function lexicalDistance(\n a: string,\n b: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<number, Error> {\n const [lower, upper] = makeSameLength(a, b, \"end\", charSet.first).sort()\n return Effect.gen(function* () {\n const distance = yield* subtractCharSetKeys(upper, lower, charSet)\n return decodeCharSetToNumber(distance, charSet)\n })\n}\n\nexport function midPoint(\n lower: string,\n upper: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n let [paddedLower, paddedUpper] = makeSameLength(\n lower,\n upper,\n \"end\",\n charSet.first\n )\n let distance = yield* lexicalDistance(paddedLower, paddedUpper, charSet)\n if (distance === 1) {\n // if the numbers are consecutive we need more padding\n paddedLower = paddedLower.padEnd(paddedLower.length + 1, charSet.first)\n // the new distance will always be the length of the charSet\n distance = charSet.length\n }\n const mid = yield* encodeToCharSet(Math.floor(distance / 2), charSet)\n return yield* addCharSetKeys(paddedLower, mid, charSet)\n })\n}\n\n// ============================================================================\n// Integer Functions\n// ============================================================================\n\nexport function startKey(charSet: IndexedCharacterSet): string {\n return charSet.firstPositive + charSet.byCode[0]\n}\n\nexport function validInteger(integer: string, charSet: IndexedCharacterSet): Effect.Effect<boolean, Error> {\n return Effect.gen(function* () {\n const length = yield* integerLength(integer, charSet)\n return length === integer.length\n })\n}\n\nexport function validateOrderKey(\n orderKey: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<void, Error> {\n return Effect.gen(function* () {\n yield* getIntegerPart(orderKey, charSet)\n })\n}\n\nexport function getIntegerPart(\n orderKey: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n const head = integerHead(orderKey, charSet)\n const integerPartLength = yield* integerLength(head, charSet)\n if (integerPartLength > orderKey.length) {\n return yield* Effect.fail(new Error(\"invalid order key length: \" + orderKey))\n }\n return orderKey.slice(0, integerPartLength)\n })\n}\n\nfunction validateInteger(integer: string, charSet: IndexedCharacterSet): Effect.Effect<void, Error> {\n return Effect.gen(function* () {\n const isValid = yield* validInteger(integer, charSet)\n if (!isValid) {\n return yield* Effect.fail(new Error(\"invalid integer length: \" + integer))\n }\n })\n}\n\nexport function integerHead(integer: string, charSet: IntegerLimits): string {\n let i = 0\n if (integer[0] === charSet.mostPositive) {\n while (integer[i] === charSet.mostPositive) {\n i = i + 1\n }\n }\n if (integer[0] === charSet.mostNegative) {\n while (integer[i] === charSet.mostNegative) {\n i = i + 1\n }\n }\n return integer.slice(0, i + 1)\n}\n\nexport function splitInteger(\n integer: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<[string, string], Error> {\n return Effect.gen(function* () {\n // We need to get the limits from the charSet\n const head = integerHead(integer, {\n firstPositive: charSet.firstPositive,\n mostPositive: charSet.mostPositive,\n firstNegative: charSet.firstNegative,\n mostNegative: charSet.mostNegative,\n })\n const tail = integer.slice(head.length)\n return [head, tail] as [string, string]\n })\n}\n\nexport function incrementIntegerHead(\n head: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n const inPositiveRange = head >= charSet.firstPositive\n const nextHead = yield* incrementKey(head, charSet)\n const headIsLimitMax = head[head.length - 1] === charSet.mostPositive\n const nextHeadIsLimitMax =\n nextHead[nextHead.length - 1] === charSet.mostPositive\n\n // we can not leave the head on the limit value, we have no way to know where the head ends\n if (inPositiveRange && nextHeadIsLimitMax) {\n return nextHead + charSet.mostNegative\n }\n // we are already at the limit of this level, so we need to go up a level\n if (!inPositiveRange && headIsLimitMax) {\n return head.slice(0, head.length - 1)\n }\n return nextHead\n })\n}\n\nexport function decrementIntegerHead(\n head: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n const inPositiveRange = head >= charSet.firstPositive\n const headIsLimitMin = head[head.length - 1] === charSet.mostNegative\n if (inPositiveRange && headIsLimitMin) {\n const nextLevel = head.slice(0, head.length - 1)\n // we can not leave the head on the limit value, we have no way to know where the head ends\n // so we take one extra step down\n const decremented = yield* decrementKey(nextLevel, charSet)\n return decremented\n }\n\n if (!inPositiveRange && headIsLimitMin) {\n return head + charSet.mostPositive\n }\n\n return yield* decrementKey(head, charSet)\n })\n}\n\nfunction startOnNewHead(\n head: string,\n limit: \"upper\" | \"lower\",\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n const newLength = yield* integerLength(head, charSet)\n const fillCharCode = limit === \"upper\" ? charSet.length - 1 : 0\n const fillChar = charSet.byCode[fillCharCode]\n if (fillChar === undefined) {\n return yield* Effect.fail(new Error(\"invalid fill character code\"))\n }\n return head + fillChar.repeat(newLength - head.length)\n })\n}\n\nexport function incrementInteger(\n integer: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n yield* validateInteger(integer, charSet)\n const [head, digs] = yield* splitInteger(integer, charSet)\n const maxChar = charSet.byCode[charSet.length - 1]\n if (maxChar === undefined) {\n return yield* Effect.fail(new Error(\"invalid charSet: missing max character\"))\n }\n const anyNonMaxedDigit = digs\n .split(\"\")\n .some((d) => d !== maxChar)\n\n // we have room to increment\n if (anyNonMaxedDigit) {\n const newDigits = yield* incrementKey(digs, charSet)\n return head + newDigits\n }\n const nextHead = yield* incrementIntegerHead(head, charSet)\n return yield* startOnNewHead(nextHead, \"lower\", charSet)\n })\n}\n\nexport function decrementInteger(\n integer: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n yield* validateInteger(integer, charSet)\n const [head, digs] = yield* splitInteger(integer, charSet)\n const minChar = charSet.byCode[0]\n if (minChar === undefined) {\n return yield* Effect.fail(new Error(\"invalid charSet: missing min character\"))\n }\n const anyNonLimitDigit = digs.split(\"\").some((d) => d !== minChar)\n\n // we have room to decrement\n if (anyNonLimitDigit) {\n const newDigits = yield* decrementKey(digs, charSet)\n return head + newDigits\n }\n const nextHead = yield* decrementIntegerHead(head, charSet)\n return yield* startOnNewHead(nextHead, \"upper\", charSet)\n })\n}\n\n// ============================================================================\n// Jittering Functions\n// ============================================================================\n\nexport function jitterString(\n orderKey: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error, Random.Random> {\n return Effect.gen(function* () {\n const randomValue = yield* Random.next\n const shift = yield* encodeToCharSet(\n Math.floor(randomValue * charSet.jitterRange),\n charSet\n )\n return yield* addCharSetKeys(orderKey, shift, charSet)\n })\n}\n\nexport function padAndJitterString(\n orderKey: string,\n numberOfChars: number,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error, Random.Random> {\n return Effect.gen(function* () {\n const paddedKey = orderKey.padEnd(\n orderKey.length + numberOfChars,\n charSet.first\n )\n return yield* jitterString(paddedKey, charSet)\n })\n}\n\nexport function paddingNeededForDistance(\n distance: number,\n charSet: IndexedCharacterSet\n): number {\n const gap = charSet.jitterRange - distance\n const firstBigger = Object.entries(charSet.paddingDict).find(\n ([_key, value]) => {\n return value > gap\n }\n )\n\n return firstBigger ? parseInt(firstBigger[0]) : 0\n}\n\nexport function paddingNeededForJitter(\n orderKey: string,\n b: string | null,\n charSet: IndexedCharacterSet\n): Effect.Effect<number, Error> {\n return Effect.gen(function* () {\n const integer = yield* getIntegerPart(orderKey, charSet)\n const nextInteger = yield* incrementInteger(integer, charSet)\n let needed = 0\n if (b !== null) {\n const distanceToB = yield* lexicalDistance(orderKey, b, charSet)\n if (distanceToB < charSet.jitterRange + 1) {\n needed = Math.max(needed, paddingNeededForDistance(distanceToB, charSet))\n }\n }\n const distanceToNextInteger = yield* lexicalDistance(orderKey, nextInteger, charSet)\n if (distanceToNextInteger < charSet.jitterRange + 1) {\n needed = Math.max(\n needed,\n paddingNeededForDistance(distanceToNextInteger, charSet)\n )\n }\n\n return needed\n })\n}\n\n// ============================================================================\n// Key Generation Functions\n// ============================================================================\n\n/**\n * Generate a key between two other keys.\n * If either lower or upper is null, the key will be generated at the start or end of the list.\n */\nexport function generateKeyBetween(\n lower: string | null,\n upper: string | null,\n charSet: IndexedCharacterSet = base62CharSet()\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n if (lower !== null) {\n yield* validateOrderKey(lower, charSet)\n }\n if (upper !== null) {\n yield* validateOrderKey(upper, charSet)\n }\n if (lower === null && upper === null) {\n return startKey(charSet)\n }\n if (lower === null) {\n const integer = yield* getIntegerPart(upper!, charSet)\n return yield* decrementInteger(integer, charSet)\n }\n if (upper === null) {\n const integer = yield* getIntegerPart(lower, charSet)\n return yield* incrementInteger(integer, charSet)\n }\n if (lower >= upper) {\n return yield* Effect.fail(new Error(lower + \" >= \" + upper))\n }\n return yield* midPoint(lower, upper, charSet)\n })\n}\n\ntype GenerateKeyBetweenFunc = (\n lower: string | null,\n upper: string | null,\n charSet?: IndexedCharacterSet\n) => Effect.Effect<string, Error>\n\ntype GenerateNKeysBetweenFunc = (\n lower: string | null,\n upper: string | null,\n n: number,\n charSet?: IndexedCharacterSet\n) => Effect.Effect<string[], Error>\n\nfunction spreadGeneratorResults(\n lower: string | null,\n upper: string | null,\n n: number,\n charSet: IndexedCharacterSet,\n generateKey: GenerateKeyBetweenFunc,\n generateNKeys: GenerateNKeysBetweenFunc\n): Effect.Effect<string[], Error> {\n if (n === 0) {\n return Effect.succeed([])\n }\n if (n === 1) {\n return generateKey(lower, upper, charSet).pipe(Effect.map((key) => [key]))\n }\n if (upper == null) {\n return Effect.gen(function* () {\n let newUpper = yield* generateKey(lower, upper, charSet)\n const result = [newUpper]\n for (let i = 0; i < n - 1; i++) {\n newUpper = yield* generateKey(newUpper, upper, charSet)\n result.push(newUpper)\n }\n return result\n })\n }\n if (lower == null) {\n return Effect.gen(function* () {\n let newLower = yield* generateKey(lower, upper, charSet)\n const result = [newLower]\n for (let i = 0; i < n - 1; i++) {\n newLower = yield* generateKey(lower, newLower, charSet)\n result.push(newLower)\n }\n result.reverse()\n return result\n })\n }\n return Effect.gen(function* () {\n const mid = Math.floor(n / 2)\n const midOrderKey = yield* generateKey(lower, upper, charSet)\n const leftKeys = yield* generateNKeys(lower, midOrderKey, mid, charSet)\n const rightKeys = yield* generateNKeys(midOrderKey, upper, n - mid - 1, charSet)\n return [...leftKeys, midOrderKey, ...rightKeys]\n })\n}\n\n/**\n * Generate any number of keys between two other keys.\n * If either lower or upper is null, the keys will be generated at the start or end of the list.\n */\nexport function generateNKeysBetween(\n a: string | null,\n b: string | null,\n n: number,\n charSet: IndexedCharacterSet = base62CharSet()\n): Effect.Effect<string[], Error> {\n return spreadGeneratorResults(\n a,\n b,\n n,\n charSet,\n (lower, upper, charSet = base62CharSet()) => generateKeyBetween(lower, upper, charSet),\n (lower, upper, n, charSet = base62CharSet()) => generateNKeysBetween(lower, upper, n, charSet)\n )\n}\n\n/**\n * Generate a key between two other keys with jitter.\n * If either lower or upper is null, the key will be generated at the start or end of the list.\n */\nexport function generateJitteredKeyBetween(\n lower: string | null,\n upper: string | null,\n charSet: IndexedCharacterSet = base62CharSet()\n): Effect.Effect<string, Error, Random.Random> {\n return Effect.gen(function* () {\n const key = yield* generateKeyBetween(lower, upper, charSet)\n const paddingNeeded = yield* paddingNeededForJitter(key, upper, charSet)\n if (paddingNeeded) {\n return yield* padAndJitterString(key, paddingNeeded, charSet)\n }\n return yield* jitterString(key, charSet)\n })\n}\n\n/**\n * Generate any number of keys between two other keys with jitter.\n * If either lower or upper is null, the keys will be generated at the start or end of the list.\n */\nexport function generateNJitteredKeysBetween(\n lower: string | null,\n upper: string | null,\n n: number,\n charSet: IndexedCharacterSet = base62CharSet()\n): Effect.Effect<string[], Error, Random.Random> {\n return Effect.gen(function* () {\n if (n === 0) {\n return []\n }\n if (n === 1) {\n const key = yield* generateJitteredKeyBetween(lower, upper, charSet)\n return [key]\n }\n if (upper == null) {\n let newUpper = yield* generateJitteredKeyBetween(lower, upper, charSet)\n const result = [newUpper]\n for (let i = 0; i < n - 1; i++) {\n newUpper = yield* generateJitteredKeyBetween(newUpper, upper, charSet)\n result.push(newUpper)\n }\n return result\n }\n if (lower == null) {\n let newLower = yield* generateJitteredKeyBetween(lower, upper, charSet)\n const result = [newLower]\n for (let i = 0; i < n - 1; i++) {\n newLower = yield* generateJitteredKeyBetween(lower, newLower, charSet)\n result.push(newLower)\n }\n result.reverse()\n return result\n }\n const mid = Math.floor(n / 2)\n const midOrderKey = yield* generateJitteredKeyBetween(lower, upper, charSet)\n const leftKeys = yield* generateNJitteredKeysBetween(lower, midOrderKey, mid, charSet)\n const rightKeys = yield* generateNJitteredKeysBetween(midOrderKey, upper, n - mid - 1, charSet)\n return [...leftKeys, midOrderKey, ...rightKeys]\n })\n}\n\n// ============================================================================\n// Index Generator Class\n// ============================================================================\n\nexport class IndexGenerator {\n private charSet: IndexedCharacterSet\n private useJitter: boolean\n private list: string[]\n private useGroups: boolean\n private groupIdLength: number\n\n constructor(list: string[], options: GeneratorOptions = {}) {\n this.charSet = options.charSet ?? base62CharSet()\n this.useJitter = options.useJitter ?? true\n this.list = list\n this.useGroups = !!options.groupIdLength && options.groupIdLength > 0\n this.groupIdLength = options.groupIdLength ?? 0\n }\n\n /**\n * Updates the list that the generator uses to generate keys.\n * The generator will not mutate the internal list when generating keys.\n */\n public updateList(list: string[]) {\n this.list = [...list].sort()\n }\n\n /**\n * Generate any number of keys at the start of the list (before the first key).\n * Optionally you can supply a groupId to generate keys at the start of a specific group.\n */\n public nKeysStart(n: number, groupId?: string): Effect.Effect<string[], Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n yield* Effect.try(() => {\n self.validateGroupId(groupId)\n })\n const firstKey = self.firstOfGroup(groupId)\n return yield* self.generateNKeysBetween(null, firstKey, n, groupId)\n })\n }\n\n /**\n * Generate a single key at the start of the list (before the first key).\n * Optionally you can supply a groupId to generate a key at the start of a specific group.\n */\n public keyStart(groupId?: string): Effect.Effect<string, Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n const keys = yield* self.nKeysStart(1, groupId)\n return keys[0]!\n })\n }\n\n /**\n * Generate any number of keys at the end of the list (after the last key).\n * Optionally you can supply a groupId to generate keys at the end of a specific group.\n */\n public nKeysEnd(n: number, groupId?: string): Effect.Effect<string[], Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n yield* Effect.try(() => {\n self.validateGroupId(groupId)\n })\n const lastKey = self.lastOfGroup(groupId)\n return yield* self.generateNKeysBetween(lastKey, null, n, groupId)\n })\n }\n\n /**\n * Generate a single key at the end of the list (after the last key).\n * Optionally you can supply a groupId to generate a key at the end of a specific group.\n */\n public keyEnd(groupId?: string): Effect.Effect<string, Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n const keys = yield* self.nKeysEnd(1, groupId)\n return keys[0]!\n })\n }\n\n /**\n * Generate any number of keys behind a specific key and in front of the next key.\n * GroupId will be inferred from the orderKey if working with groups\n */\n public nKeysAfter(orderKey: string, n: number): Effect.Effect<string[], Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n const keyAfter = yield* self.getKeyAfter(orderKey)\n return yield* self.generateNKeysBetween(orderKey, keyAfter, n, self.groupId(orderKey))\n })\n }\n\n /**\n * Generate a single key behind a specific key and in front of the next key.\n * GroupId will be inferred from the orderKey if working with groups\n */\n public keyAfter(orderKey: string): Effect.Effect<string, Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n const keys = yield* self.nKeysAfter(orderKey, 1)\n return keys[0]!\n })\n }\n\n /**\n * Generate any number of keys in front of a specific key and behind the previous key.\n * GroupId will be inferred from the orderKey if working with groups\n */\n public nKeysBefore(orderKey: string, n: number): Effect.Effect<string[], Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n const keyBefore = yield* self.getKeyBefore(orderKey)\n return yield* self.generateNKeysBetween(keyBefore, orderKey, n, self.groupId(orderKey))\n })\n }\n\n /**\n * Generate a single key in front of a specific key and behind the previous key.\n * GroupId will be inferred from the orderKey if working with groups\n */\n public keyBefore(orderKey: string): Effect.Effect<string, Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n const keys = yield* self.nKeysBefore(orderKey, 1)\n return keys[0]!\n })\n }\n\n /**\n * private function responsible for calling the correct generate function\n */\n private generateNKeysBetween(\n lowerKey: string | null,\n upperKey: string | null,\n n: number,\n groupId: string | undefined\n ): Effect.Effect<string[], Error, Random.Random> {\n const self = this\n const lower = self.groupLessKey(lowerKey)\n const upper = self.groupLessKey(upperKey)\n if (self.useJitter) {\n return Effect.gen(function* () {\n const keys = yield* generateNJitteredKeysBetween(lower, upper, n, self.charSet)\n return !groupId ? keys : keys.map((key) => groupId + key)\n })\n } else {\n // When not using jitter, we don't need Random, but TypeScript requires it\n // So we provide a default Random service that won't be used\n return Effect.gen(function* () {\n const keys = yield* generateNKeysBetween(lower, upper, n, self.charSet)\n return !groupId ? keys : keys.map((key) => groupId + key)\n }).pipe(Effect.provideService(Random as any, Random.make(Math.random())))\n }\n }\n\n /**\n * get the key before the supplied orderKey, if it exists and is in the same group\n */\n private getKeyBefore(orderKey: string): Effect.Effect<string | null, Error> {\n const index = this.list.indexOf(orderKey)\n if (index === -1) {\n return Effect.fail(new Error(`orderKey is not in the list`))\n }\n const before = this.list[index - 1]\n return Effect.succeed(!!before && this.isSameGroup(orderKey, before) ? before : null)\n }\n\n /**\n * get the key after the supplied orderKey, if it exists and is in the same group\n */\n private getKeyAfter(orderKey: string): Effect.Effect<string | null, Error> {\n const index = this.list.indexOf(orderKey)\n if (index === -1) {\n return Effect.fail(new Error(`orderKey is not in the list`))\n }\n const after = this.list[index + 1]\n return Effect.succeed(!!after && this.isSameGroup(orderKey, after) ? after : null)\n }\n\n /**\n * get the first key of the group (or the first key of the list if not using groups)\n */\n private firstOfGroup(groupId: string | undefined): string | null {\n if (!this.useGroups) return this.list[0] ?? null\n const first = this.list.find((key) => this.isPartOfGroup(key, groupId))\n return first ?? null\n }\n\n /**\n * get the last key of the group (or the last key of the list if not using groups)\n */\n private lastOfGroup(groupId: string | undefined): string | null {\n if (!this.useGroups) return this.list[this.list.length - 1] ?? null\n const allGroupItems = this.list.filter((key) =>\n this.isPartOfGroup(key, groupId)\n )\n const last = allGroupItems[allGroupItems.length - 1]\n return last ?? null\n }\n\n /**\n * throw an error if the groupId is invalid or supplied when not using groups\n */\n private validateGroupId(groupId: string | undefined): void {\n if (!this.useGroups) {\n if (groupId) {\n console.warn(\"groupId should not used when not using groups\")\n }\n return\n }\n if (!groupId) {\n throw new Error(\"groupId is required when using groups\")\n }\n if (groupId.length !== this.groupIdLength) {\n throw new Error(`groupId must be the lenght supplied in the options`)\n }\n }\n\n /**\n * get the groupId from the orderKey\n */\n private groupId(orderKey: string): string | undefined {\n if (!this.useGroups) return undefined\n return this.splitIntoGroupIdAndOrderKey(orderKey)[0]\n }\n\n /**\n * remove the groupId from the orderKey\n */\n private groupLessKey(orderKey: string | null): string | null {\n if (!this.useGroups) return orderKey\n return this.splitIntoGroupIdAndOrderKey(orderKey)[1]\n }\n\n /**\n * split the orderKey into groupId and key\n * if not using groups, orderKey will be the same as key\n */\n private splitIntoGroupIdAndOrderKey(\n orderKey: string | null\n ): [string | undefined, string | null] {\n if (!this.useGroups || !orderKey) {\n return [undefined, orderKey]\n }\n const groupId = orderKey.substring(0, this.groupIdLength)\n const key = orderKey.substring(this.groupIdLength)\n return [groupId, key]\n }\n\n /**\n * check if two keys are in the same group\n * if not using groups, keys will always be in the same group\n */\n private isSameGroup(a: string, b: string): boolean {\n if (!this.useGroups) return true\n const [aGroupId] = this.splitIntoGroupIdAndOrderKey(a)\n const [bGroupId] = this.splitIntoGroupIdAndOrderKey(b)\n return aGroupId === bGroupId\n }\n\n /**\n * check if the key is part of the group\n * if not using groups, key will always be part of the group\n */\n private isPartOfGroup(orderKey: string, groupId?: string): boolean {\n if (!this.useGroups) return true\n const [keyGroupId] = this.splitIntoGroupIdAndOrderKey(orderKey)\n return keyGroupId === groupId\n }\n}\n","import { Effect, Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport * as FractionalIndex from \"../FractionalIndex\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, AnyPrimitive, Validator, InferState, InferProxy, InferSnapshot } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators } from \"./shared\";\n\n\n/**\n * Entry in an ordered array with ID and fractional position\n */\nexport interface ArrayEntry<T> {\n readonly id: string; // Unique element identifier (UUID)\n readonly pos: string; // Fractional index for ordering\n readonly value: T; // The element value\n}\n\n/**\n * Sort array entries by their fractional position\n */\nconst sortByPos = <T,>(entries: readonly ArrayEntry<T>[]): ArrayEntry<T>[] =>\n [...entries].sort((a, b) => a.pos < b.pos ? -1 : a.pos > b.pos ? 1 : 0);\n\n/**\n * Generate a fractional position between two positions\n */\nconst generatePosBetween = (left: string | null, right: string | null): string => {\n const charSet = FractionalIndex.base62CharSet();\n return Effect.runSync(FractionalIndex.generateKeyBetween(left, right, charSet));\n};\n\n/**\n * Entry in an array snapshot with ID and value snapshot\n */\nexport interface ArrayEntrySnapshot<TElement extends AnyPrimitive> {\n readonly id: string;\n readonly value: InferSnapshot<TElement>;\n}\n\n/**\n * Snapshot type for arrays - always an array (never undefined)\n */\nexport type ArraySnapshot<TElement extends AnyPrimitive> = readonly ArrayEntrySnapshot<TElement>[];\n\nexport interface ArrayProxy<TElement extends AnyPrimitive> {\n /** Gets the current array entries (sorted by position) */\n get(): ArrayState<TElement>;\n /** Replaces the entire array with new values (generates new IDs and positions) */\n set(values: readonly InferState<TElement>[]): void;\n /** Appends a value to the end of the array */\n push(value: InferState<TElement>): void;\n /** Inserts a value at the specified visual index */\n insertAt(index: number, value: InferState<TElement>): void;\n /** Removes the element with the specified ID */\n remove(id: string): void;\n /** Moves an element to a new visual index */\n move(id: string, toIndex: number): void;\n /** Returns a proxy for the element with the specified ID */\n at(id: string): InferProxy<TElement>;\n /** Finds an element by predicate and returns its proxy */\n find(predicate: (value: InferState<TElement>, id: string) => boolean): InferProxy<TElement> | undefined;\n /** Returns a readonly snapshot of the array for rendering (always returns an array, never undefined) */\n toSnapshot(): ArraySnapshot<TElement>;\n}\n\n/** The state type for arrays - an array of entries */\nexport type ArrayState<TElement extends AnyPrimitive> = readonly ArrayEntry<InferState<TElement>>[];\n\ninterface ArrayPrimitiveSchema<TElement extends AnyPrimitive> {\n readonly required: boolean;\n readonly defaultValue: ArrayState<TElement> | undefined;\n readonly element: TElement;\n readonly validators: readonly Validator<ArrayState<TElement>>[];\n}\n\nexport class ArrayPrimitive<TElement extends AnyPrimitive>\n implements Primitive<ArrayState<TElement>, ArrayProxy<TElement>>\n{\n readonly _tag = \"ArrayPrimitive\" as const;\n readonly _State!: ArrayState<TElement>;\n readonly _Proxy!: ArrayProxy<TElement>;\n\n private readonly _schema: ArrayPrimitiveSchema<TElement>;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"array.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n insert: OperationDefinition.make({\n kind: \"array.insert\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n remove: OperationDefinition.make({\n kind: \"array.remove\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n move: OperationDefinition.make({\n kind: \"array.move\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: ArrayPrimitiveSchema<TElement>) {\n this._schema = schema;\n }\n\n /** Mark this array as required */\n required(): ArrayPrimitive<TElement> {\n return new ArrayPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this array */\n default(defaultValue: ArrayState<TElement>): ArrayPrimitive<TElement> {\n return new ArrayPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the element primitive */\n get element(): TElement {\n return this._schema.element;\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: ArrayState<TElement>) => boolean, message: string): ArrayPrimitive<TElement> {\n return new ArrayPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n /** Minimum array length */\n minLength(length: number): ArrayPrimitive<TElement> {\n return this.refine(\n (v) => v.length >= length,\n `Array must have at least ${length} elements`\n );\n }\n\n /** Maximum array length */\n maxLength(length: number): ArrayPrimitive<TElement> {\n return this.refine(\n (v) => v.length <= length,\n `Array must have at most ${length} elements`\n );\n }\n\n readonly _internal: PrimitiveInternal<ArrayState<TElement>, ArrayProxy<TElement>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): ArrayProxy<TElement> => {\n const elementPrimitive = this._schema.element;\n\n // Helper to get current state (sorted)\n const getCurrentState = (): ArrayEntry<InferState<TElement>>[] => {\n const state = env.getState(operationPath) as ArrayState<TElement> | undefined;\n if (!state || !globalThis.Array.isArray(state)) return [];\n return sortByPos(state);\n };\n\n return {\n get: (): ArrayState<TElement> => {\n return getCurrentState();\n },\n\n set: (values: readonly InferState<TElement>[]) => {\n // Generate entries with new IDs and sequential positions\n const entries: ArrayEntry<InferState<TElement>>[] = [];\n let prevPos: string | null = null;\n \n for (const value of values) {\n const id = env.generateId();\n const pos = generatePosBetween(prevPos, null);\n entries.push({ id, pos, value });\n prevPos = pos;\n }\n \n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, entries)\n );\n },\n\n push: (value: InferState<TElement>) => {\n const sorted = getCurrentState();\n const lastPos = sorted.length > 0 ? sorted[sorted.length - 1]!.pos : null;\n const id = env.generateId();\n const pos = generatePosBetween(lastPos, null);\n \n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, { id, pos, value })\n );\n },\n\n insertAt: (index: number, value: InferState<TElement>) => {\n const sorted = getCurrentState();\n const leftPos = index > 0 && sorted[index - 1] ? sorted[index - 1]!.pos : null;\n const rightPos = index < sorted.length && sorted[index] ? sorted[index]!.pos : null;\n \n const id = env.generateId();\n const pos = generatePosBetween(leftPos, rightPos);\n \n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, { id, pos, value })\n );\n },\n\n remove: (id: string) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.remove, { id })\n );\n },\n\n move: (id: string, toIndex: number) => {\n const sorted = getCurrentState();\n // Filter out the element being moved\n const without = sorted.filter(e => e.id !== id);\n \n const clampedIndex = Math.max(0, Math.min(toIndex, without.length));\n const leftPos = clampedIndex > 0 && without[clampedIndex - 1] ? without[clampedIndex - 1]!.pos : null;\n const rightPos = clampedIndex < without.length && without[clampedIndex] ? without[clampedIndex]!.pos : null;\n \n const pos = generatePosBetween(leftPos, rightPos);\n \n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.move, { id, pos })\n );\n },\n\n at: (id: string): InferProxy<TElement> => {\n // Use ID in path for element access\n const elementPath = operationPath.append(id);\n return elementPrimitive._internal.createProxy(env, elementPath) as InferProxy<TElement>;\n },\n\n find: (predicate: (value: InferState<TElement>, id: string) => boolean): InferProxy<TElement> | undefined => {\n const sorted = getCurrentState();\n const found = sorted.find(entry => predicate(entry.value, entry.id));\n if (!found) return undefined;\n \n const elementPath = operationPath.append(found.id);\n return elementPrimitive._internal.createProxy(env, elementPath) as InferProxy<TElement>;\n },\n\n toSnapshot: (): ArraySnapshot<TElement> => {\n const sorted = getCurrentState();\n return sorted.map(entry => {\n const elementPath = operationPath.append(entry.id);\n const elementProxy = elementPrimitive._internal.createProxy(env, elementPath);\n return {\n id: entry.id,\n value: (elementProxy as { toSnapshot(): InferSnapshot<TElement> }).toSnapshot(),\n };\n });\n },\n };\n },\n\n applyOperation: (\n state: ArrayState<TElement> | undefined,\n operation: Operation.Operation<any, any, any>\n ): ArrayState<TElement> => {\n const path = operation.path;\n const tokens = path.toTokens().filter((t: string) => t !== \"\");\n const currentState = state ?? [];\n\n let newState: ArrayState<TElement>;\n\n // If path is empty, this is an array-level operation\n if (tokens.length === 0) {\n switch (operation.kind) {\n case \"array.set\": {\n const payload = operation.payload;\n if (!globalThis.Array.isArray(payload)) {\n throw new ValidationError(`ArrayPrimitive.set requires an array payload`);\n }\n newState = payload as ArrayState<TElement>;\n break;\n }\n case \"array.insert\": {\n const { id, pos, value } = operation.payload as { id: string; pos: string; value: InferState<TElement> };\n newState = [...currentState, { id, pos, value }];\n break;\n }\n case \"array.remove\": {\n const { id } = operation.payload as { id: string };\n newState = currentState.filter(entry => entry.id !== id);\n break;\n }\n case \"array.move\": {\n const { id, pos } = operation.payload as { id: string; pos: string };\n newState = currentState.map(entry => \n entry.id === id ? { ...entry, pos } : entry\n );\n break;\n }\n default:\n throw new ValidationError(`ArrayPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n } else {\n // Otherwise, delegate to the element with the specified ID\n const elementId = tokens[0]!;\n const entryIndex = currentState.findIndex(entry => entry.id === elementId);\n \n if (entryIndex === -1) {\n throw new ValidationError(`Array element not found with ID: ${elementId}`);\n }\n\n const elementPrimitive = this._schema.element;\n const remainingPath = path.shift();\n const elementOperation = {\n ...operation,\n path: remainingPath,\n };\n\n const currentEntry = currentState[entryIndex]!;\n const newValue = elementPrimitive._internal.applyOperation(currentEntry.value, elementOperation);\n\n const mutableState = [...currentState];\n mutableState[entryIndex] = { ...currentEntry, value: newValue };\n newState = mutableState;\n }\n\n // Run validators on the new state\n runValidators(newState, this._schema.validators);\n\n return newState;\n },\n\n getInitialState: (): ArrayState<TElement> | undefined => {\n return this._schema.defaultValue;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n const clientPath = clientOp.path;\n const serverPath = serverOp.path;\n\n // If paths don't overlap at all, no transformation needed\n if (!OperationPath.pathsOverlap(clientPath, serverPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Handle array.remove from server - check if client is operating on removed element\n if (serverOp.kind === \"array.remove\") {\n const removedId = (serverOp.payload as { id: string }).id;\n const clientTokens = clientPath.toTokens().filter((t: string) => t !== \"\");\n const serverTokens = serverPath.toTokens().filter((t: string) => t !== \"\");\n\n // Check if client is operating on the removed element or its children\n if (clientTokens.length > serverTokens.length) {\n const elementId = clientTokens[serverTokens.length];\n if (elementId === removedId) {\n // Client operation targets a removed element - becomes noop\n return { type: \"noop\" };\n }\n }\n }\n\n // Both inserting into same array - no conflict (fractional indexing handles ordering)\n if (serverOp.kind === \"array.insert\" && clientOp.kind === \"array.insert\") {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Both moving elements in same array\n if (serverOp.kind === \"array.move\" && clientOp.kind === \"array.move\") {\n const serverMoveId = (serverOp.payload as { id: string }).id;\n const clientMoveId = (clientOp.payload as { id: string }).id;\n\n if (serverMoveId === clientMoveId) {\n // Client's move supersedes server's move (last-write-wins for position)\n return { type: \"transformed\", operation: clientOp };\n }\n // Different elements - no conflict\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For operations on same exact path: client wins (last-write-wins)\n if (OperationPath.pathsEqual(clientPath, serverPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // If server set entire array and client is operating on an element\n if (serverOp.kind === \"array.set\" && OperationPath.isPrefix(serverPath, clientPath)) {\n // Client's element operation may be invalid after array replacement\n // However, for optimistic updates, we let the client op proceed\n // and the server will validate/reject if needed\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Delegate to element primitive for nested operations\n const clientTokens = clientPath.toTokens().filter((t: string) => t !== \"\");\n const serverTokens = serverPath.toTokens().filter((t: string) => t !== \"\");\n\n // Both operations target children of this array\n if (clientTokens.length > 0 && serverTokens.length > 0) {\n const clientElementId = clientTokens[0];\n const serverElementId = serverTokens[0];\n\n // If operating on different elements, no conflict\n if (clientElementId !== serverElementId) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Same element - delegate to element primitive\n const elementPrimitive = this._schema.element;\n const clientOpForElement = {\n ...clientOp,\n path: clientOp.path.shift(),\n };\n const serverOpForElement = {\n ...serverOp,\n path: serverOp.path.shift(),\n };\n\n const result = elementPrimitive._internal.transformOperation(clientOpForElement, serverOpForElement);\n\n if (result.type === \"transformed\") {\n // Restore the original path prefix\n return {\n type: \"transformed\",\n operation: {\n ...result.operation,\n path: clientOp.path,\n },\n };\n }\n\n return result;\n }\n\n // Default: no transformation needed\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new ArrayPrimitive with the given element type */\nexport const Array = <TElement extends AnyPrimitive>(element: TElement): ArrayPrimitive<TElement> =>\n new ArrayPrimitive({ required: false, defaultValue: undefined, element, validators: [] });\n\n","import { Effect, Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, AnyPrimitive, InferState, InferProxy, InferSnapshot } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators } from \"./shared\";\n\n\n/**\n * Type to infer state from a lazy thunk\n */\nexport type InferLazyState<T extends () => AnyPrimitive> = InferState<ReturnType<T>>;\n\n/**\n * Type to infer proxy from a lazy thunk\n */\nexport type InferLazyProxy<T extends () => AnyPrimitive> = InferProxy<ReturnType<T>>;\n\n/**\n * Type to infer snapshot from a lazy thunk\n */\nexport type InferLazySnapshot<T extends () => AnyPrimitive> = InferSnapshot<ReturnType<T>>;\n\nexport class LazyPrimitive<TThunk extends () => AnyPrimitive>\n implements Primitive<InferLazyState<TThunk>, InferLazyProxy<TThunk>>\n{\n readonly _tag = \"LazyPrimitive\" as const;\n readonly _State!: InferLazyState<TThunk>;\n readonly _Proxy!: InferLazyProxy<TThunk>;\n\n private readonly _thunk: TThunk;\n private _resolved: ReturnType<TThunk> | undefined;\n\n constructor(thunk: TThunk) {\n this._thunk = thunk;\n }\n\n /** Resolve and cache the lazy primitive */\n private _resolve(): ReturnType<TThunk> {\n if (this._resolved === undefined) {\n this._resolved = this._thunk() as ReturnType<TThunk>;\n }\n return this._resolved;\n }\n\n /** Mark this lazy primitive as required (delegates to resolved) */\n required(): LazyPrimitive<TThunk> {\n // Note: For lazy, we can't easily propagate required to the resolved primitive\n // without resolving it first. This is a limitation.\n return this;\n }\n\n readonly _internal: PrimitiveInternal<InferLazyState<TThunk>, InferLazyProxy<TThunk>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): InferLazyProxy<TThunk> => {\n const resolved = this._resolve();\n return resolved._internal.createProxy(env, operationPath) as InferLazyProxy<TThunk>;\n },\n\n applyOperation: (\n state: InferLazyState<TThunk> | undefined,\n operation: Operation.Operation<any, any, any>\n ): InferLazyState<TThunk> => {\n const resolved = this._resolve();\n return resolved._internal.applyOperation(state, operation) as InferLazyState<TThunk>;\n },\n\n getInitialState: (): InferLazyState<TThunk> | undefined => {\n const resolved = this._resolve();\n return resolved._internal.getInitialState() as InferLazyState<TThunk> | undefined;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n // Delegate to resolved primitive\n const resolved = this._resolve();\n return resolved._internal.transformOperation(clientOp, serverOp);\n },\n };\n}\n\n/** Creates a new LazyPrimitive with the given thunk */\nexport const Lazy = <TThunk extends () => AnyPrimitive>(thunk: TThunk): LazyPrimitive<TThunk> =>\n new LazyPrimitive(thunk);\n\n","import { Effect, Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, AnyPrimitive, InferState, InferProxy, InferSnapshot } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { LiteralPrimitive } from \"./Literal\";\nimport { StructPrimitive } from \"./Struct\";\nimport { runValidators } from \"./shared\";\n\n\n/**\n * Type constraint for union variants - must be struct primitives\n */\nexport type UnionVariants = Record<string, StructPrimitive<any, any>>;\n\n/**\n * Infer the union state type from variants\n */\nexport type InferUnionState<TVariants extends UnionVariants> = {\n [K in keyof TVariants]: InferState<TVariants[K]>;\n}[keyof TVariants];\n\n/**\n * Infer the union snapshot type from variants\n */\nexport type InferUnionSnapshot<TVariants extends UnionVariants> = {\n [K in keyof TVariants]: InferSnapshot<TVariants[K]>;\n}[keyof TVariants];\n\n/**\n * Proxy for accessing union variants\n */\nexport interface UnionProxy<TVariants extends UnionVariants, TDiscriminator extends string, TDefined extends boolean = false> {\n /** Gets the current union value */\n get(): MaybeUndefined<InferUnionState<TVariants>, TDefined>;\n \n /** Sets the entire union value */\n set(value: InferUnionState<TVariants>): void;\n \n /** Access a specific variant's proxy (assumes the variant is active) */\n as<K extends keyof TVariants>(variant: K): InferProxy<TVariants[K]>;\n \n /** Pattern match on the variant type */\n match<R>(handlers: {\n [K in keyof TVariants]: (proxy: InferProxy<TVariants[K]>) => R;\n }): R | undefined;\n \n /** Returns a readonly snapshot of the union for rendering */\n toSnapshot(): MaybeUndefined<InferUnionSnapshot<TVariants>, TDefined>;\n}\n\ninterface UnionPrimitiveSchema<TVariants extends UnionVariants, TDiscriminator extends string> {\n readonly required: boolean;\n readonly defaultValue: InferUnionState<TVariants> | undefined;\n readonly discriminator: TDiscriminator;\n readonly variants: TVariants;\n}\n\nexport class UnionPrimitive<TVariants extends UnionVariants, TDiscriminator extends string = \"type\", TDefined extends boolean = false>\n implements Primitive<InferUnionState<TVariants>, UnionProxy<TVariants, TDiscriminator, TDefined>>\n{\n readonly _tag = \"UnionPrimitive\" as const;\n readonly _State!: InferUnionState<TVariants>;\n readonly _Proxy!: UnionProxy<TVariants, TDiscriminator, TDefined>;\n\n private readonly _schema: UnionPrimitiveSchema<TVariants, TDiscriminator>;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"union.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: UnionPrimitiveSchema<TVariants, TDiscriminator>) {\n this._schema = schema;\n }\n\n /** Mark this union as required */\n required(): UnionPrimitive<TVariants, TDiscriminator, true> {\n return new UnionPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this union */\n default(defaultValue: InferUnionState<TVariants>): UnionPrimitive<TVariants, TDiscriminator, true> {\n return new UnionPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the discriminator field name */\n get discriminator(): TDiscriminator {\n return this._schema.discriminator;\n }\n\n /** Get the variants */\n get variants(): TVariants {\n return this._schema.variants;\n }\n\n /** Find the variant key from a state value */\n private _findVariantKey(state: InferUnionState<TVariants>): keyof TVariants | undefined {\n if (typeof state !== \"object\" || state === null) {\n return undefined;\n }\n const discriminatorValue = (state as Record<string, unknown>)[this._schema.discriminator];\n \n // Find the variant that matches this discriminator value\n for (const key in this._schema.variants) {\n const variant = this._schema.variants[key]!;\n const discriminatorField = variant.fields[this._schema.discriminator];\n if (discriminatorField && discriminatorField._tag === \"LiteralPrimitive\") {\n const literalPrimitive = discriminatorField as LiteralPrimitive<any, any>;\n if (literalPrimitive.literal === discriminatorValue) {\n return key;\n }\n }\n }\n return undefined;\n }\n\n readonly _internal: PrimitiveInternal<InferUnionState<TVariants>, UnionProxy<TVariants, TDiscriminator, TDefined>> = {\n createProxy: (\n env: ProxyEnvironment.ProxyEnvironment,\n operationPath: OperationPath.OperationPath\n ): UnionProxy<TVariants, TDiscriminator, TDefined> => {\n const variants = this._schema.variants;\n const defaultValue = this._schema.defaultValue;\n\n return {\n get: (): MaybeUndefined<InferUnionState<TVariants>, TDefined> => {\n const state = env.getState(operationPath) as InferUnionState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferUnionState<TVariants>, TDefined>;\n },\n set: (value: InferUnionState<TVariants>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n as: <K extends keyof TVariants>(variant: K): InferProxy<TVariants[K]> => {\n const variantPrimitive = variants[variant];\n if (!variantPrimitive) {\n throw new ValidationError(`Unknown variant: ${globalThis.String(variant)}`);\n }\n return variantPrimitive._internal.createProxy(env, operationPath) as InferProxy<TVariants[K]>;\n },\n match: <R,>(handlers: { [K in keyof TVariants]: (proxy: InferProxy<TVariants[K]>) => R }): R | undefined => {\n const state = env.getState(operationPath) as InferUnionState<TVariants> | undefined;\n if (!state) return undefined;\n \n const variantKey = this._findVariantKey(state);\n if (!variantKey) return undefined;\n \n const handler = handlers[variantKey];\n if (!handler) return undefined;\n \n const variantProxy = variants[variantKey]!._internal.createProxy(env, operationPath) as InferProxy<TVariants[typeof variantKey]>;\n return handler(variantProxy);\n },\n toSnapshot: (): MaybeUndefined<InferUnionSnapshot<TVariants>, TDefined> => {\n const state = env.getState(operationPath) as InferUnionState<TVariants> | undefined;\n const effectiveState = state ?? defaultValue;\n if (!effectiveState) {\n return undefined as MaybeUndefined<InferUnionSnapshot<TVariants>, TDefined>;\n }\n \n const variantKey = this._findVariantKey(effectiveState);\n if (!variantKey) {\n return undefined as MaybeUndefined<InferUnionSnapshot<TVariants>, TDefined>;\n }\n \n const variantPrimitive = variants[variantKey]!;\n const variantProxy = variantPrimitive._internal.createProxy(env, operationPath);\n return (variantProxy as unknown as { toSnapshot(): InferUnionSnapshot<TVariants> }).toSnapshot() as MaybeUndefined<InferUnionSnapshot<TVariants>, TDefined>;\n },\n };\n },\n\n applyOperation: (\n state: InferUnionState<TVariants> | undefined,\n operation: Operation.Operation<any, any, any>\n ): InferUnionState<TVariants> => {\n const path = operation.path;\n const tokens = path.toTokens().filter((t: string) => t !== \"\");\n\n // If path is empty, this is a union-level operation\n if (tokens.length === 0) {\n if (operation.kind !== \"union.set\") {\n throw new ValidationError(`UnionPrimitive root cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"object\" || payload === null) {\n throw new ValidationError(`UnionPrimitive.set requires an object payload`);\n }\n\n // Validate that the discriminator field exists and matches a variant\n const discriminatorValue = (payload as Record<string, unknown>)[this._schema.discriminator];\n if (discriminatorValue === undefined) {\n throw new ValidationError(`UnionPrimitive.set requires a \"${this._schema.discriminator}\" discriminator field`);\n }\n\n return payload as InferUnionState<TVariants>;\n }\n\n // Otherwise, delegate to the active variant\n // We need to determine which variant is active based on current state\n if (state === undefined) {\n throw new ValidationError(`Cannot apply nested operation to undefined union state`);\n }\n\n const variantKey = this._findVariantKey(state);\n if (variantKey === undefined) {\n throw new ValidationError(`Cannot determine active variant from state`);\n }\n\n const variantPrimitive = this._schema.variants[variantKey]!;\n const newState = variantPrimitive._internal.applyOperation(\n state as InferState<typeof variantPrimitive>,\n operation\n );\n\n return newState as InferUnionState<TVariants>;\n },\n\n getInitialState: (): InferUnionState<TVariants> | undefined => {\n return this._schema.defaultValue;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n const clientPath = clientOp.path;\n const serverPath = serverOp.path;\n\n // If paths don't overlap at all, no transformation needed\n if (!OperationPath.pathsOverlap(clientPath, serverPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n const clientTokens = clientPath.toTokens().filter((t: string) => t !== \"\");\n const serverTokens = serverPath.toTokens().filter((t: string) => t !== \"\");\n\n // If both are at root level (union.set operations)\n if (clientTokens.length === 0 && serverTokens.length === 0) {\n // Client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n }\n\n // If server set entire union and client is updating a field\n if (serverTokens.length === 0 && serverOp.kind === \"union.set\") {\n // Client's field operation proceeds - optimistic update\n // Server will validate/reject if needed\n return { type: \"transformed\", operation: clientOp };\n }\n\n // If client set entire union and server is updating a field\n if (clientTokens.length === 0 && clientOp.kind === \"union.set\") {\n // Client's union.set supersedes server's field update\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Both operations target fields within the union\n // Since union variants are struct primitives, delegate to the first variant\n // that matches (they all should have the same field structure for the overlapping field)\n if (clientTokens.length > 0 && serverTokens.length > 0) {\n const clientField = clientTokens[0];\n const serverField = serverTokens[0];\n\n // Different fields - no conflict\n if (clientField !== serverField) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Same field - delegate to a variant (use first variant as they share structure)\n const variantKeys = Object.keys(this._schema.variants);\n if (variantKeys.length === 0) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n const firstVariant = this._schema.variants[variantKeys[0]!]!;\n const result = firstVariant._internal.transformOperation(clientOp, serverOp);\n\n return result;\n }\n\n // Default: no transformation needed\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Options for creating a Union primitive */\nexport interface UnionOptions<TVariants extends UnionVariants, TDiscriminator extends string> {\n /** The field name used to discriminate between variants (defaults to \"type\") */\n readonly discriminator?: TDiscriminator;\n /** The variant struct primitives */\n readonly variants: TVariants;\n}\n\n/** Creates a new UnionPrimitive with the given variants */\nexport function Union<TVariants extends UnionVariants>(\n options: UnionOptions<TVariants, \"type\">\n): UnionPrimitive<TVariants, \"type\", false>;\nexport function Union<TVariants extends UnionVariants, TDiscriminator extends string>(\n options: UnionOptions<TVariants, TDiscriminator>\n): UnionPrimitive<TVariants, TDiscriminator, false>;\nexport function Union<TVariants extends UnionVariants, TDiscriminator extends string = \"type\">(\n options: UnionOptions<TVariants, TDiscriminator>\n): UnionPrimitive<TVariants, TDiscriminator, false> {\n const discriminator = (options.discriminator ?? \"type\") as TDiscriminator;\n return new UnionPrimitive({\n required: false,\n defaultValue: undefined,\n discriminator,\n variants: options.variants,\n });\n}\n\n","import { Effect, Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { AnyPrimitive, InferState } from \"../Primitive\";\nimport { StructPrimitive } from \"./Struct\";\n\n\n/**\n * Any TreeNodePrimitive type - used for generic constraints.\n */\nexport type AnyTreeNodePrimitive = TreeNodePrimitive<string, StructPrimitive<any>, readonly AnyTreeNodePrimitive[] | (() => readonly AnyTreeNodePrimitive[])>;\n\n/**\n * Resolves children type - handles both array and lazy thunk\n */\nexport type ResolveChildren<TChildren extends readonly AnyTreeNodePrimitive[] | (() => readonly AnyTreeNodePrimitive[])> =\n TChildren extends () => readonly AnyTreeNodePrimitive[] ? ReturnType<TChildren> : TChildren;\n\n/**\n * Infer the data state type from a TreeNodePrimitive\n */\nexport type InferTreeNodeDataState<T extends AnyTreeNodePrimitive> = \n T extends TreeNodePrimitive<any, infer TData, any> ? InferState<TData> : never;\n\n/**\n * Infer the type literal from a TreeNodePrimitive\n */\nexport type InferTreeNodeType<T extends AnyTreeNodePrimitive> =\n T extends TreeNodePrimitive<infer TType, any, any> ? TType : never;\n\n/**\n * Infer the allowed children from a TreeNodePrimitive\n */\nexport type InferTreeNodeChildren<T extends AnyTreeNodePrimitive> =\n T extends TreeNodePrimitive<any, any, infer TChildren> ? ResolveChildren<TChildren>[number] : never;\n\n/**\n * Configuration for a TreeNode primitive\n */\nexport interface TreeNodeConfig<\n TData extends StructPrimitive<any>,\n TChildren extends readonly AnyTreeNodePrimitive[] | (() => readonly AnyTreeNodePrimitive[])\n> {\n readonly data: TData;\n readonly children: TChildren;\n}\n\n/**\n * TreeNodePrimitive - defines a node type with its data schema and allowed children\n */\nexport class TreeNodePrimitive<\n TType extends string,\n TData extends StructPrimitive<any>,\n TChildren extends readonly AnyTreeNodePrimitive[] | (() => readonly AnyTreeNodePrimitive[])\n> {\n readonly _tag = \"TreeNodePrimitive\" as const;\n readonly _Type!: TType;\n readonly _Data!: TData;\n readonly _Children!: TChildren;\n\n private readonly _type: TType;\n private readonly _data: TData;\n private readonly _children: TChildren;\n private _resolvedChildren: readonly AnyTreeNodePrimitive[] | undefined;\n\n constructor(type: TType, config: TreeNodeConfig<TData, TChildren>) {\n this._type = type;\n this._data = config.data;\n this._children = config.children;\n }\n\n /** Get the node type identifier */\n get type(): TType {\n return this._type;\n }\n\n /** Get the data primitive */\n get data(): TData {\n return this._data;\n }\n\n /** Get resolved children (resolves lazy thunk if needed) */\n get children(): ResolveChildren<TChildren> {\n if (this._resolvedChildren === undefined) {\n if (typeof this._children === \"function\") {\n this._resolvedChildren = (this._children as () => readonly AnyTreeNodePrimitive[])();\n } else {\n this._resolvedChildren = this._children as readonly AnyTreeNodePrimitive[];\n }\n }\n return this._resolvedChildren as ResolveChildren<TChildren>;\n }\n\n /** Check if a child type is allowed */\n isChildAllowed(childType: string): boolean {\n return this.children.some(child => child.type === childType);\n }\n}\n\n/** Creates a new TreeNodePrimitive with the given type and config */\nexport const TreeNode = <\n TType extends string,\n TData extends StructPrimitive<any>,\n TChildren extends readonly AnyTreeNodePrimitive[] | (() => readonly AnyTreeNodePrimitive[])\n>(\n type: TType,\n config: TreeNodeConfig<TData, TChildren>\n): TreeNodePrimitive<TType, TData, TChildren> =>\n new TreeNodePrimitive(type, config);\n\n","import { Effect, Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport * as FractionalIndex from \"../FractionalIndex\";\nimport type { Primitive, PrimitiveInternal, Validator, InferProxy } from \"./shared\";\nimport { ValidationError } from \"./shared\";\nimport { runValidators } from \"./shared\";\nimport type { AnyTreeNodePrimitive, InferTreeNodeType, InferTreeNodeDataState, InferTreeNodeChildren } from \"./TreeNode\";\nimport { InferStructState } from \"./Struct\";\n\n\n/**\n * A node in the tree state (flat storage format)\n */\nexport interface TreeNodeState {\n readonly id: string; // Unique node identifier (UUID)\n readonly type: string; // Node type discriminator\n readonly parentId: string | null; // Parent node ID (null for root)\n readonly pos: string; // Fractional index for sibling ordering\n readonly data: unknown; // Node-specific data\n}\n\n/**\n * Typed node state for a specific node type\n */\nexport interface TypedTreeNodeState<TNode extends AnyTreeNodePrimitive> {\n readonly id: string;\n readonly type: InferTreeNodeType<TNode>;\n readonly parentId: string | null;\n readonly pos: string;\n readonly data: InferTreeNodeDataState<TNode>;\n}\n\n/**\n * The state type for trees - a flat array of nodes\n */\nexport type TreeState<TRoot extends AnyTreeNodePrimitive> = readonly TreeNodeState[];\n\n/**\n * Helper to get children sorted by position\n */\nconst getOrderedChildren = (\n nodes: readonly TreeNodeState[],\n parentId: string | null\n): TreeNodeState[] => {\n return [...nodes]\n .filter(n => n.parentId === parentId)\n .sort((a, b) => a.pos < b.pos ? -1 : a.pos > b.pos ? 1 : 0);\n};\n\n/**\n * Get all descendant IDs of a node (recursive)\n */\nconst getDescendantIds = (\n nodes: readonly TreeNodeState[],\n nodeId: string\n): string[] => {\n const children = nodes.filter(n => n.parentId === nodeId);\n const descendantIds: string[] = [];\n for (const child of children) {\n descendantIds.push(child.id);\n descendantIds.push(...getDescendantIds(nodes, child.id));\n }\n return descendantIds;\n};\n\n/**\n * Check if moving a node to a new parent would create a cycle\n */\nconst wouldCreateCycle = (\n nodes: readonly TreeNodeState[],\n nodeId: string,\n newParentId: string | null\n): boolean => {\n if (newParentId === null) return false;\n if (newParentId === nodeId) return true;\n \n const descendants = getDescendantIds(nodes, nodeId);\n return descendants.includes(newParentId);\n};\n\n/**\n * Generate a fractional position between two positions\n */\nconst generateTreePosBetween = (left: string | null, right: string | null): string => {\n const charSet = FractionalIndex.base62CharSet();\n return Effect.runSync(FractionalIndex.generateKeyBetween(left, right, charSet));\n};\n\n/**\n * Snapshot of a single node for UI rendering (data properties spread at node level)\n */\nexport type TreeNodeSnapshot<TNode extends AnyTreeNodePrimitive> = {\n readonly id: string;\n readonly type: InferTreeNodeType<TNode>;\n readonly children: TreeNodeSnapshot<InferTreeNodeChildren<TNode>>[];\n} & InferTreeNodeDataState<TNode>;\n\n/**\n * Infer the snapshot type for a tree (recursive tree structure for UI)\n */\nexport type InferTreeSnapshot<T extends TreePrimitive<any>> =\n T extends TreePrimitive<infer TRoot> ? TreeNodeSnapshot<TRoot> : never;\n\n/**\n * Typed proxy for a specific node type - provides type-safe data access\n */\nexport interface TypedNodeProxy<TNode extends AnyTreeNodePrimitive> {\n /** The node ID */\n readonly id: string;\n /** The node type */\n readonly type: InferTreeNodeType<TNode>;\n /** Access the node's data proxy */\n readonly data: InferProxy<TNode[\"data\"]>;\n /** Get the raw node state */\n get(): TypedTreeNodeState<TNode>;\n}\n\n/**\n * Node proxy with type narrowing capabilities\n */\nexport interface TreeNodeProxyBase<TRoot extends AnyTreeNodePrimitive> {\n /** The node ID */\n readonly id: string;\n /** The node type (string) */\n readonly type: string;\n /** Type guard - narrows the proxy to a specific node type */\n is<TNode extends AnyTreeNodePrimitive>(\n nodeType: TNode\n ): this is TypedNodeProxy<TNode>;\n /** Type assertion - returns typed proxy (throws if wrong type) */\n as<TNode extends AnyTreeNodePrimitive>(\n nodeType: TNode\n ): TypedNodeProxy<TNode>;\n /** Get the raw node state */\n get(): TreeNodeState;\n}\n\n/**\n * Proxy for accessing and modifying tree nodes\n */\nexport interface TreeProxy<TRoot extends AnyTreeNodePrimitive> {\n /** Gets the entire tree state (flat array of nodes) */\n get(): TreeState<TRoot>;\n \n /** Replaces the entire tree */\n set(nodes: TreeState<TRoot>): void;\n \n /** Gets the root node state */\n root(): TypedTreeNodeState<TRoot> | undefined;\n \n /** Gets ordered children states of a parent (null for root's children) */\n children(parentId: string | null): TreeNodeState[];\n \n /** Gets a node proxy by ID with type narrowing capabilities */\n node(id: string): TreeNodeProxyBase<TRoot> | undefined;\n \n /** Insert a new node as the first child */\n insertFirst<TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string;\n \n /** Insert a new node as the last child */\n insertLast<TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string;\n \n /** Insert a new node at a specific index among siblings */\n insertAt<TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n index: number,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string;\n \n /** Insert a new node after a sibling */\n insertAfter<TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string;\n \n /** Insert a new node before a sibling */\n insertBefore<TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string;\n \n /** Remove a node and all its descendants */\n remove(id: string): void;\n \n /** Move a node to a new parent at a specific index */\n move(nodeId: string, newParentId: string | null, toIndex: number): void;\n \n /** Move a node after a sibling */\n moveAfter(nodeId: string, siblingId: string): void;\n \n /** Move a node before a sibling */\n moveBefore(nodeId: string, siblingId: string): void;\n \n /** Move a node to be the first child of a parent */\n moveToFirst(nodeId: string, newParentId: string | null): void;\n \n /** Move a node to be the last child of a parent */\n moveToLast(nodeId: string, newParentId: string | null): void;\n \n /** Returns a typed proxy for a specific node's data */\n at<TNode extends AnyTreeNodePrimitive>(\n id: string,\n nodeType: TNode\n ): InferProxy<TNode[\"data\"]>;\n \n /** Convert tree to a nested snapshot for UI rendering */\n toSnapshot(): TreeNodeSnapshot<TRoot> | undefined;\n}\n\ninterface TreePrimitiveSchema<TRoot extends AnyTreeNodePrimitive> {\n readonly required: boolean;\n readonly defaultValue: TreeState<TRoot> | undefined;\n readonly root: TRoot;\n readonly validators: readonly Validator<TreeState<TRoot>>[];\n}\n\nexport class TreePrimitive<TRoot extends AnyTreeNodePrimitive>\n implements Primitive<TreeState<TRoot>, TreeProxy<TRoot>>\n{\n readonly _tag = \"TreePrimitive\" as const;\n readonly _State!: TreeState<TRoot>;\n readonly _Proxy!: TreeProxy<TRoot>;\n\n private readonly _schema: TreePrimitiveSchema<TRoot>;\n private _nodeTypeRegistry: Map<string, AnyTreeNodePrimitive> | undefined;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"tree.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n insert: OperationDefinition.make({\n kind: \"tree.insert\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n remove: OperationDefinition.make({\n kind: \"tree.remove\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n move: OperationDefinition.make({\n kind: \"tree.move\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: TreePrimitiveSchema<TRoot>) {\n this._schema = schema;\n }\n\n /** Mark this tree as required */\n required(): TreePrimitive<TRoot> {\n return new TreePrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this tree */\n default(defaultValue: TreeState<TRoot>): TreePrimitive<TRoot> {\n return new TreePrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the root node type */\n get root(): TRoot {\n return this._schema.root;\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: TreeState<TRoot>) => boolean, message: string): TreePrimitive<TRoot> {\n return new TreePrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n /**\n * Build a registry of all node types reachable from root\n */\n private _buildNodeTypeRegistry(): Map<string, AnyTreeNodePrimitive> {\n if (this._nodeTypeRegistry !== undefined) {\n return this._nodeTypeRegistry;\n }\n\n const registry = new Map<string, AnyTreeNodePrimitive>();\n const visited = new Set<string>();\n\n const visit = (node: AnyTreeNodePrimitive) => {\n if (visited.has(node.type)) return;\n visited.add(node.type);\n registry.set(node.type, node);\n\n for (const child of node.children) {\n visit(child);\n }\n };\n\n visit(this._schema.root);\n this._nodeTypeRegistry = registry;\n return registry;\n }\n\n /**\n * Get a node type primitive by its type string\n */\n private _getNodeTypePrimitive(type: string): AnyTreeNodePrimitive {\n const registry = this._buildNodeTypeRegistry();\n const nodeType = registry.get(type);\n if (!nodeType) {\n throw new ValidationError(`Unknown node type: ${type}`);\n }\n return nodeType;\n }\n\n /**\n * Validate that a node type can be a child of a parent node type\n */\n private _validateChildType(\n parentType: string | null,\n childType: string\n ): void {\n if (parentType === null) {\n // Root level - child must be the root type\n if (childType !== this._schema.root.type) {\n throw new ValidationError(\n `Root node must be of type \"${this._schema.root.type}\", got \"${childType}\"`\n );\n }\n return;\n }\n\n const parentNodePrimitive = this._getNodeTypePrimitive(parentType);\n if (!parentNodePrimitive.isChildAllowed(childType)) {\n const allowedTypes = parentNodePrimitive.children.map(c => c.type).join(\", \");\n throw new ValidationError(\n `Node type \"${childType}\" is not allowed as a child of \"${parentType}\". ` +\n `Allowed types: ${allowedTypes || \"none\"}`\n );\n }\n }\n\n readonly _internal: PrimitiveInternal<TreeState<TRoot>, TreeProxy<TRoot>> = {\n createProxy: (\n env: ProxyEnvironment.ProxyEnvironment,\n operationPath: OperationPath.OperationPath\n ): TreeProxy<TRoot> => {\n // Helper to get current state\n const getCurrentState = (): TreeState<TRoot> => {\n const state = env.getState(operationPath) as TreeState<TRoot> | undefined;\n return state ?? [];\n };\n\n // Helper to get parent type from state\n const getParentType = (parentId: string | null): string | null => {\n if (parentId === null) return null;\n const state = getCurrentState();\n const parent = state.find(n => n.id === parentId);\n return parent?.type ?? null;\n };\n\n // Helper to create a node proxy with type narrowing\n const createNodeProxy = (nodeState: TreeNodeState): TreeNodeProxyBase<TRoot> => {\n return {\n id: nodeState.id,\n type: nodeState.type,\n \n is: <TNode extends AnyTreeNodePrimitive>(\n nodeType: TNode\n ): boolean => {\n return nodeState.type === nodeType.type;\n },\n \n as: <TNode extends AnyTreeNodePrimitive>(\n nodeType: TNode\n ): TypedNodeProxy<TNode> => {\n if (nodeState.type !== nodeType.type) {\n throw new ValidationError(\n `Node is of type \"${nodeState.type}\", not \"${nodeType.type}\"`\n );\n }\n const nodePath = operationPath.append(nodeState.id);\n return {\n id: nodeState.id,\n type: nodeType.type as InferTreeNodeType<TNode>,\n data: nodeType.data._internal.createProxy(env, nodePath) as InferProxy<TNode[\"data\"]>,\n get: () => nodeState as TypedTreeNodeState<TNode>,\n };\n },\n \n get: () => nodeState,\n } as TreeNodeProxyBase<TRoot>;\n };\n\n // Helper to build recursive snapshot\n const buildSnapshot = (\n nodeId: string,\n nodes: readonly TreeNodeState[]\n ): TreeNodeSnapshot<TRoot> | undefined => {\n const node = nodes.find(n => n.id === nodeId);\n if (!node) return undefined;\n\n const childNodes = getOrderedChildren(nodes, nodeId);\n const children: TreeNodeSnapshot<any>[] = [];\n for (const child of childNodes) {\n const childSnapshot = buildSnapshot(child.id, nodes);\n if (childSnapshot) {\n children.push(childSnapshot);\n }\n }\n\n // Spread data properties at node level\n return {\n id: node.id,\n type: node.type,\n ...(node.data as object),\n children,\n } as unknown as TreeNodeSnapshot<TRoot>;\n };\n\n return {\n get: (): TreeState<TRoot> => {\n return getCurrentState();\n },\n\n set: (nodes: TreeState<TRoot>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, nodes)\n );\n },\n\n root: (): TypedTreeNodeState<TRoot> | undefined => {\n const state = getCurrentState();\n const rootNode = state.find(n => n.parentId === null);\n return rootNode as TypedTreeNodeState<TRoot> | undefined;\n },\n\n children: (parentId: string | null): TreeNodeState[] => {\n const state = getCurrentState();\n return getOrderedChildren(state, parentId);\n },\n\n node: (id: string): TreeNodeProxyBase<TRoot> | undefined => {\n const state = getCurrentState();\n const nodeState = state.find(n => n.id === id);\n if (!nodeState) return undefined;\n return createNodeProxy(nodeState);\n },\n\n insertFirst: <TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string => {\n const state = getCurrentState();\n const siblings = getOrderedChildren(state, parentId);\n const firstPos = siblings.length > 0 ? siblings[0]!.pos : null;\n const pos = generateTreePosBetween(null, firstPos);\n const id = env.generateId();\n\n // Validate parent exists (if not root)\n if (parentId !== null && !state.find(n => n.id === parentId)) {\n throw new ValidationError(`Parent node not found: ${parentId}`);\n }\n\n // Validate child type is allowed\n const parentType = getParentType(parentId);\n this._validateChildType(parentType, nodeType.type);\n\n // Validate single root\n if (parentId === null && state.some(n => n.parentId === null)) {\n throw new ValidationError(\"Tree already has a root node\");\n }\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data,\n })\n );\n\n return id;\n },\n\n insertLast: <TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string => {\n const state = getCurrentState();\n const siblings = getOrderedChildren(state, parentId);\n const lastPos = siblings.length > 0 ? siblings[siblings.length - 1]!.pos : null;\n const pos = generateTreePosBetween(lastPos, null);\n const id = env.generateId();\n\n // Validate parent exists (if not root)\n if (parentId !== null && !state.find(n => n.id === parentId)) {\n throw new ValidationError(`Parent node not found: ${parentId}`);\n }\n\n // Validate child type is allowed\n const parentType = getParentType(parentId);\n this._validateChildType(parentType, nodeType.type);\n\n // Validate single root\n if (parentId === null && state.some(n => n.parentId === null)) {\n throw new ValidationError(\"Tree already has a root node\");\n }\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data,\n })\n );\n\n return id;\n },\n\n insertAt: <TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n index: number,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string => {\n const state = getCurrentState();\n const siblings = getOrderedChildren(state, parentId);\n const clampedIndex = Math.max(0, Math.min(index, siblings.length));\n const leftPos = clampedIndex > 0 && siblings[clampedIndex - 1] ? siblings[clampedIndex - 1]!.pos : null;\n const rightPos = clampedIndex < siblings.length && siblings[clampedIndex] ? siblings[clampedIndex]!.pos : null;\n const pos = generateTreePosBetween(leftPos, rightPos);\n const id = env.generateId();\n\n // Validate parent exists (if not root)\n if (parentId !== null && !state.find(n => n.id === parentId)) {\n throw new ValidationError(`Parent node not found: ${parentId}`);\n }\n\n // Validate child type is allowed\n const parentType = getParentType(parentId);\n this._validateChildType(parentType, nodeType.type);\n\n // Validate single root\n if (parentId === null && state.some(n => n.parentId === null)) {\n throw new ValidationError(\"Tree already has a root node\");\n }\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data,\n })\n );\n\n return id;\n },\n\n insertAfter: <TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string => {\n const state = getCurrentState();\n const sibling = state.find(n => n.id === siblingId);\n if (!sibling) {\n throw new ValidationError(`Sibling node not found: ${siblingId}`);\n }\n\n const parentId = sibling.parentId;\n const siblings = getOrderedChildren(state, parentId);\n const siblingIndex = siblings.findIndex(n => n.id === siblingId);\n const nextSibling = siblings[siblingIndex + 1];\n const pos = generateTreePosBetween(sibling.pos, nextSibling?.pos ?? null);\n const id = env.generateId();\n\n // Validate child type is allowed\n const parentType = getParentType(parentId);\n this._validateChildType(parentType, nodeType.type);\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data,\n })\n );\n\n return id;\n },\n\n insertBefore: <TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string => {\n const state = getCurrentState();\n const sibling = state.find(n => n.id === siblingId);\n if (!sibling) {\n throw new ValidationError(`Sibling node not found: ${siblingId}`);\n }\n\n const parentId = sibling.parentId;\n const siblings = getOrderedChildren(state, parentId);\n const siblingIndex = siblings.findIndex(n => n.id === siblingId);\n const prevSibling = siblings[siblingIndex - 1];\n const pos = generateTreePosBetween(prevSibling?.pos ?? null, sibling.pos);\n const id = env.generateId();\n\n // Validate child type is allowed\n const parentType = getParentType(parentId);\n this._validateChildType(parentType, nodeType.type);\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data,\n })\n );\n\n return id;\n },\n\n remove: (id: string) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.remove, { id })\n );\n },\n\n move: (nodeId: string, newParentId: string | null, toIndex: number) => {\n const state = getCurrentState();\n const node = state.find(n => n.id === nodeId);\n if (!node) {\n throw new ValidationError(`Node not found: ${nodeId}`);\n }\n\n // Validate parent exists (if not moving to root)\n if (newParentId !== null && !state.find(n => n.id === newParentId)) {\n throw new ValidationError(`Parent node not found: ${newParentId}`);\n }\n\n // Validate no cycle\n if (wouldCreateCycle(state, nodeId, newParentId)) {\n throw new ValidationError(\"Move would create a cycle in the tree\");\n }\n\n // Validate child type is allowed in new parent\n const newParentType = newParentId === null ? null : state.find(n => n.id === newParentId)?.type ?? null;\n this._validateChildType(newParentType, node.type);\n\n // Validate not moving root to a parent\n if (node.parentId === null && newParentId !== null) {\n throw new ValidationError(\"Cannot move root node to have a parent\");\n }\n\n // Calculate new position among new siblings (excluding self)\n const siblings = getOrderedChildren(state, newParentId).filter(n => n.id !== nodeId);\n const clampedIndex = Math.max(0, Math.min(toIndex, siblings.length));\n const leftPos = clampedIndex > 0 && siblings[clampedIndex - 1] ? siblings[clampedIndex - 1]!.pos : null;\n const rightPos = clampedIndex < siblings.length && siblings[clampedIndex] ? siblings[clampedIndex]!.pos : null;\n const pos = generateTreePosBetween(leftPos, rightPos);\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.move, {\n id: nodeId,\n parentId: newParentId,\n pos,\n })\n );\n },\n\n moveAfter: (nodeId: string, siblingId: string) => {\n const state = getCurrentState();\n const node = state.find(n => n.id === nodeId);\n const sibling = state.find(n => n.id === siblingId);\n \n if (!node) {\n throw new ValidationError(`Node not found: ${nodeId}`);\n }\n if (!sibling) {\n throw new ValidationError(`Sibling node not found: ${siblingId}`);\n }\n\n const newParentId = sibling.parentId;\n\n // Validate no cycle\n if (wouldCreateCycle(state, nodeId, newParentId)) {\n throw new ValidationError(\"Move would create a cycle in the tree\");\n }\n\n // Validate child type is allowed in new parent\n const newParentType = newParentId === null ? null : state.find(n => n.id === newParentId)?.type ?? null;\n this._validateChildType(newParentType, node.type);\n\n // Validate not moving root to a parent\n if (node.parentId === null && newParentId !== null) {\n throw new ValidationError(\"Cannot move root node to have a parent\");\n }\n\n const siblings = getOrderedChildren(state, newParentId).filter(n => n.id !== nodeId);\n const siblingIndex = siblings.findIndex(n => n.id === siblingId);\n const nextSibling = siblings[siblingIndex + 1];\n const pos = generateTreePosBetween(sibling.pos, nextSibling?.pos ?? null);\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.move, {\n id: nodeId,\n parentId: newParentId,\n pos,\n })\n );\n },\n\n moveBefore: (nodeId: string, siblingId: string) => {\n const state = getCurrentState();\n const node = state.find(n => n.id === nodeId);\n const sibling = state.find(n => n.id === siblingId);\n \n if (!node) {\n throw new ValidationError(`Node not found: ${nodeId}`);\n }\n if (!sibling) {\n throw new ValidationError(`Sibling node not found: ${siblingId}`);\n }\n\n const newParentId = sibling.parentId;\n\n // Validate no cycle\n if (wouldCreateCycle(state, nodeId, newParentId)) {\n throw new ValidationError(\"Move would create a cycle in the tree\");\n }\n\n // Validate child type is allowed in new parent\n const newParentType = newParentId === null ? null : state.find(n => n.id === newParentId)?.type ?? null;\n this._validateChildType(newParentType, node.type);\n\n // Validate not moving root to a parent\n if (node.parentId === null && newParentId !== null) {\n throw new ValidationError(\"Cannot move root node to have a parent\");\n }\n\n const siblings = getOrderedChildren(state, newParentId).filter(n => n.id !== nodeId);\n const siblingIndex = siblings.findIndex(n => n.id === siblingId);\n const prevSibling = siblings[siblingIndex - 1];\n const pos = generateTreePosBetween(prevSibling?.pos ?? null, sibling.pos);\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.move, {\n id: nodeId,\n parentId: newParentId,\n pos,\n })\n );\n },\n\n moveToFirst: (nodeId: string, newParentId: string | null) => {\n const state = getCurrentState();\n const node = state.find(n => n.id === nodeId);\n \n if (!node) {\n throw new ValidationError(`Node not found: ${nodeId}`);\n }\n\n // Validate parent exists (if not moving to root)\n if (newParentId !== null && !state.find(n => n.id === newParentId)) {\n throw new ValidationError(`Parent node not found: ${newParentId}`);\n }\n\n // Validate no cycle\n if (wouldCreateCycle(state, nodeId, newParentId)) {\n throw new ValidationError(\"Move would create a cycle in the tree\");\n }\n\n // Validate child type is allowed in new parent\n const newParentType = newParentId === null ? null : state.find(n => n.id === newParentId)?.type ?? null;\n this._validateChildType(newParentType, node.type);\n\n // Validate not moving root to a parent\n if (node.parentId === null && newParentId !== null) {\n throw new ValidationError(\"Cannot move root node to have a parent\");\n }\n\n const siblings = getOrderedChildren(state, newParentId).filter(n => n.id !== nodeId);\n const firstPos = siblings.length > 0 ? siblings[0]!.pos : null;\n const pos = generateTreePosBetween(null, firstPos);\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.move, {\n id: nodeId,\n parentId: newParentId,\n pos,\n })\n );\n },\n\n moveToLast: (nodeId: string, newParentId: string | null) => {\n const state = getCurrentState();\n const node = state.find(n => n.id === nodeId);\n \n if (!node) {\n throw new ValidationError(`Node not found: ${nodeId}`);\n }\n\n // Validate parent exists (if not moving to root)\n if (newParentId !== null && !state.find(n => n.id === newParentId)) {\n throw new ValidationError(`Parent node not found: ${newParentId}`);\n }\n\n // Validate no cycle\n if (wouldCreateCycle(state, nodeId, newParentId)) {\n throw new ValidationError(\"Move would create a cycle in the tree\");\n }\n\n // Validate child type is allowed in new parent\n const newParentType = newParentId === null ? null : state.find(n => n.id === newParentId)?.type ?? null;\n this._validateChildType(newParentType, node.type);\n\n // Validate not moving root to a parent\n if (node.parentId === null && newParentId !== null) {\n throw new ValidationError(\"Cannot move root node to have a parent\");\n }\n\n const siblings = getOrderedChildren(state, newParentId).filter(n => n.id !== nodeId);\n const lastPos = siblings.length > 0 ? siblings[siblings.length - 1]!.pos : null;\n const pos = generateTreePosBetween(lastPos, null);\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.move, {\n id: nodeId,\n parentId: newParentId,\n pos,\n })\n );\n },\n\n at: <TNode extends AnyTreeNodePrimitive>(\n id: string,\n nodeType: TNode\n ): InferProxy<TNode[\"data\"]> => {\n // Get the node to verify its type\n const state = getCurrentState();\n const node = state.find(n => n.id === id);\n if (!node) {\n throw new ValidationError(`Node not found: ${id}`);\n }\n if (node.type !== nodeType.type) {\n throw new ValidationError(\n `Node is of type \"${node.type}\", not \"${nodeType.type}\"`\n );\n }\n\n const nodePath = operationPath.append(id);\n return nodeType.data._internal.createProxy(env, nodePath) as InferProxy<TNode[\"data\"]>;\n },\n\n toSnapshot: (): TreeNodeSnapshot<TRoot> | undefined => {\n const state = getCurrentState();\n const rootNode = state.find(n => n.parentId === null);\n if (!rootNode) return undefined;\n return buildSnapshot(rootNode.id, state);\n },\n };\n },\n\n applyOperation: (\n state: TreeState<TRoot> | undefined,\n operation: Operation.Operation<any, any, any>\n ): TreeState<TRoot> => {\n const path = operation.path;\n const tokens = path.toTokens().filter((t: string) => t !== \"\");\n const currentState = state ?? [];\n\n let newState: TreeState<TRoot>;\n\n // If path is empty, this is a tree-level operation\n if (tokens.length === 0) {\n switch (operation.kind) {\n case \"tree.set\": {\n const payload = operation.payload;\n if (!globalThis.Array.isArray(payload)) {\n throw new ValidationError(`TreePrimitive.set requires an array payload`);\n }\n newState = payload as TreeState<TRoot>;\n break;\n }\n case \"tree.insert\": {\n const { id, type, parentId, pos, data } = operation.payload as {\n id: string;\n type: string;\n parentId: string | null;\n pos: string;\n data: unknown;\n };\n newState = [...currentState, { id, type, parentId, pos, data }] as TreeState<TRoot>;\n break;\n }\n case \"tree.remove\": {\n const { id } = operation.payload as { id: string };\n // Get all descendants to remove\n const descendantIds = getDescendantIds(currentState, id);\n const idsToRemove = new Set([id, ...descendantIds]);\n newState = currentState.filter(node => !idsToRemove.has(node.id));\n break;\n }\n case \"tree.move\": {\n const { id, parentId, pos } = operation.payload as {\n id: string;\n parentId: string | null;\n pos: string;\n };\n newState = currentState.map(node =>\n node.id === id ? { ...node, parentId, pos } : node\n ) as TreeState<TRoot>;\n break;\n }\n default:\n throw new ValidationError(`TreePrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n } else {\n // Otherwise, delegate to the node's data primitive\n const nodeId = tokens[0]!;\n const nodeIndex = currentState.findIndex(node => node.id === nodeId);\n \n if (nodeIndex === -1) {\n throw new ValidationError(`Tree node not found with ID: ${nodeId}`);\n }\n\n const node = currentState[nodeIndex]!;\n const nodeTypePrimitive = this._getNodeTypePrimitive(node.type);\n const remainingPath = path.shift();\n const nodeOperation = {\n ...operation,\n path: remainingPath,\n };\n\n const newData = nodeTypePrimitive.data._internal.applyOperation(\n node.data as InferStructState<any> | undefined,\n nodeOperation\n );\n\n const mutableState = [...currentState];\n mutableState[nodeIndex] = { ...node, data: newData };\n newState = mutableState as TreeState<TRoot>;\n }\n\n // Run validators on the new state\n runValidators(newState, this._schema.validators);\n\n return newState;\n },\n\n getInitialState: (): TreeState<TRoot> | undefined => {\n if (this._schema.defaultValue !== undefined) {\n return this._schema.defaultValue;\n }\n\n // Automatically create a root node with default data\n const rootNodeType = this._schema.root;\n const rootData = rootNodeType.data._internal.getInitialState() ?? {};\n const rootId = crypto.randomUUID();\n const rootPos = generateTreePosBetween(null, null);\n\n return [{\n id: rootId,\n type: rootNodeType.type,\n parentId: null,\n pos: rootPos,\n data: rootData,\n }] as TreeState<TRoot>;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n const clientPath = clientOp.path;\n const serverPath = serverOp.path;\n\n // If paths don't overlap at all, no transformation needed\n if (!OperationPath.pathsOverlap(clientPath, serverPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Handle tree.remove from server - check if client is operating on removed node or descendants\n if (serverOp.kind === \"tree.remove\") {\n const removedId = (serverOp.payload as { id: string }).id;\n const clientTokens = clientPath.toTokens().filter((t: string) => t !== \"\");\n const serverTokens = serverPath.toTokens().filter((t: string) => t !== \"\");\n\n // Check if client operation targets the removed node or uses it\n if (clientOp.kind === \"tree.move\") {\n const movePayload = clientOp.payload as { id: string; parentId: string | null };\n // If moving the removed node or moving to a removed parent\n if (movePayload.id === removedId || movePayload.parentId === removedId) {\n return { type: \"noop\" };\n }\n }\n\n if (clientOp.kind === \"tree.insert\") {\n const insertPayload = clientOp.payload as { parentId: string | null };\n // If inserting into a removed parent\n if (insertPayload.parentId === removedId) {\n return { type: \"noop\" };\n }\n }\n\n // Check if client is operating on a node that was removed\n if (clientTokens.length > serverTokens.length) {\n const nodeId = clientTokens[serverTokens.length];\n if (nodeId === removedId) {\n return { type: \"noop\" };\n }\n }\n }\n\n // Both inserting - no conflict (fractional indexing handles order)\n if (serverOp.kind === \"tree.insert\" && clientOp.kind === \"tree.insert\") {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Both moving same node - client wins\n if (serverOp.kind === \"tree.move\" && clientOp.kind === \"tree.move\") {\n const serverMoveId = (serverOp.payload as { id: string }).id;\n const clientMoveId = (clientOp.payload as { id: string }).id;\n\n if (serverMoveId === clientMoveId) {\n return { type: \"transformed\", operation: clientOp };\n }\n // Different nodes - no conflict\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same exact path: client wins (last-write-wins)\n if (OperationPath.pathsEqual(clientPath, serverPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // If server set entire tree and client is operating on a node\n if (serverOp.kind === \"tree.set\" && OperationPath.isPrefix(serverPath, clientPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Delegate to node data primitive for nested operations\n const clientTokens = clientPath.toTokens().filter((t: string) => t !== \"\");\n const serverTokens = serverPath.toTokens().filter((t: string) => t !== \"\");\n\n // Both operations target children of this tree\n if (clientTokens.length > 0 && serverTokens.length > 0) {\n const clientNodeId = clientTokens[0];\n const serverNodeId = serverTokens[0];\n\n // If operating on different nodes, no conflict\n if (clientNodeId !== serverNodeId) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Same node - would need to delegate to node's data primitive\n // For simplicity, let client win\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Default: no transformation needed\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Options for creating a Tree primitive */\nexport interface TreeOptions<TRoot extends AnyTreeNodePrimitive> {\n /** The root node type */\n readonly root: TRoot;\n}\n\n/** Creates a new TreePrimitive with the given root node type */\nexport const Tree = <TRoot extends AnyTreeNodePrimitive>(\n options: TreeOptions<TRoot>\n): TreePrimitive<TRoot> =>\n new TreePrimitive({\n required: false,\n defaultValue: undefined,\n root: options.root,\n validators: [],\n });\n","\n// =============================================================================\n// Re-export all primitives from separate files\n// =============================================================================\n\nexport * from \"./primitives/shared\";\n\n// String Primitive\nexport * from \"./primitives/String\";\n// Struct Primitive\nexport * from \"./primitives/Struct\";\n\n// Boolean Primitive\nexport * from \"./primitives/Boolean\";\n\n// Number Primitive\nexport * from \"./primitives/Number\";\n// Literal Primitive\nexport * from \"./primitives/Literal\";\n\n// Array Primitive\nexport * from \"./primitives/Array\";\n// Lazy Primitive\nexport * from \"./primitives/Lazy\";\n\n// Union Primitive\nexport * from \"./primitives/Union\";\n\n// TreeNode Primitive\nexport * from \"./primitives/TreeNode\";\n// Tree Primitive\nexport * from \"./primitives/Tree\";","import * as Operation from \"./Operation\";\nimport * as OperationPath from \"./OperationPath\";\n\nexport type ProxyEnvironment = {\n /** Adds an operation to be collected/applied */\n readonly addOperation: (operation: Operation.Operation<any, any, any>) => void;\n /** Gets the current state at the given path */\n readonly getState: (path: OperationPath.OperationPath) => unknown;\n /** Generates a unique ID (UUID) for array elements */\n readonly generateId: () => string;\n};\n\nexport interface ProxyEnvironmentOptions {\n /** Callback when an operation is added */\n readonly onOperation: (operation: Operation.Operation<any, any, any>) => void;\n /** Function to retrieve current state at a path (defaults to returning undefined) */\n readonly getState?: (path: OperationPath.OperationPath) => unknown;\n /** Optional: Custom ID generator (defaults to crypto.randomUUID) */\n readonly generateId?: () => string;\n}\n\n/** Default UUID generator using crypto.randomUUID */\nconst defaultGenerateId = (): string => {\n return crypto.randomUUID();\n};\n\n/** Default state getter that always returns undefined */\nconst defaultGetState = (_path: OperationPath.OperationPath): unknown => {\n return undefined;\n};\n\n/**\n * Creates a ProxyEnvironment.\n * @param optionsOrCallback - Either an options object or a simple callback for operations\n */\nexport const make = (\n optionsOrCallback: ProxyEnvironmentOptions | ((operation: Operation.Operation<any, any, any>) => void)\n): ProxyEnvironment => {\n // Support both old callback style and new options object\n const options: ProxyEnvironmentOptions =\n typeof optionsOrCallback === \"function\"\n ? { onOperation: optionsOrCallback }\n : optionsOrCallback;\n\n return {\n addOperation: (operation: Operation.Operation<any, any, any>) => {\n options.onOperation(operation);\n },\n getState: options.getState ?? defaultGetState,\n generateId: options.generateId ?? defaultGenerateId,\n };\n};\n","import * as Operation from \"./Operation\";\n\n/**\n * A Transaction represents a group of operations that were applied atomically.\n */\nexport interface Transaction {\n /** Unique identifier for this transaction */\n readonly id: string;\n /** Operations contained in this transaction */\n readonly ops: ReadonlyArray<Operation.Operation<any, any, any>>;\n /** Timestamp when the transaction was created */\n readonly timestamp: number;\n}\n\n/**\n * Creates a new Transaction with the given operations.\n */\nexport const make = (ops: ReadonlyArray<Operation.Operation<any, any, any>>): Transaction => ({\n id: crypto.randomUUID(),\n ops,\n timestamp: Date.now(),\n});\n\n/**\n * Creates an empty Transaction.\n */\nexport const empty = (): Transaction => make([]);\n\n/**\n * Checks if a transaction is empty (has no operations).\n */\nexport const isEmpty = (tx: Transaction): boolean => tx.ops.length === 0;\n\n/**\n * Merges multiple transactions into one.\n */\nexport const merge = (txs: ReadonlyArray<Transaction>): Transaction => {\n const allOps = txs.flatMap(tx => tx.ops);\n return make(allOps);\n};\n\n\n/**\n * Encoded representation of a Transaction for network transport.\n */\nexport interface EncodedTransaction {\n readonly id: string;\n readonly ops: ReadonlyArray<Operation.EncodedOperation>;\n readonly timestamp: number;\n}\n\n/**\n * Encodes a Transaction to a JSON-serializable format for network transport.\n * @param transaction - The transaction to encode.\n * @returns The encoded representation.\n */\nexport const encode = (transaction: Transaction): EncodedTransaction => ({\n id: transaction.id,\n ops: transaction.ops.map(Operation.encode),\n timestamp: transaction.timestamp,\n});\n\n/**\n * Decodes an encoded transaction back to a Transaction.\n * @param encoded - The encoded representation.\n * @returns The decoded Transaction.\n */\nexport const decode = (encoded: EncodedTransaction): Transaction => ({\n id: encoded.id,\n ops: encoded.ops.map(Operation.decode),\n timestamp: encoded.timestamp,\n});\n","import * as Operation from \"./Operation\";\nimport * as OperationPath from \"./OperationPath\";\nimport * as ProxyEnvironment from \"./ProxyEnvironment\";\nimport * as Transaction from \"./Transaction\";\nimport type * as Primitive from \"./Primitive\";\n\n// =============================================================================\n// Document Errors\n// =============================================================================\n\n/**\n * Error thrown when attempting to start a nested transaction.\n */\nexport class NestedTransactionError extends Error {\n readonly _tag = \"NestedTransactionError\";\n constructor() {\n super(\"Nested transactions are not supported\");\n this.name = \"NestedTransactionError\";\n }\n}\n\n/**\n * Error thrown when an operation fails to apply.\n */\nexport class OperationError extends Error {\n readonly _tag = \"OperationError\";\n constructor(message: string) {\n super(message);\n this.name = \"OperationError\";\n }\n}\n\n// =============================================================================\n// Document Interface\n// =============================================================================\n\n/**\n * A Document manages state for a primitive-based schema with transaction support.\n */\nexport interface Document<TSchema extends Primitive.AnyPrimitive> {\n /** The schema defining this document's structure */\n readonly schema: TSchema;\n \n /** Root proxy for accessing and modifying document data */\n readonly root: Primitive.InferProxy<TSchema>;\n \n /** Returns the current document state */\n get(): Primitive.InferState<TSchema> | undefined;\n \n /**\n * Returns a readonly snapshot of the entire document state for rendering.\n * The snapshot is a type-safe, readonly structure where:\n * - Required fields and fields with defaults are guaranteed to be defined\n * - Optional fields may be undefined\n */\n toSnapshot(): Primitive.InferSnapshot<TSchema>;\n \n /**\n * Runs a function within a transaction.\n * All operations are collected and applied atomically.\n * If the function throws, all changes are rolled back.\n * @returns The return value of the function\n */\n transaction<R>(fn: (root: Primitive.InferProxy<TSchema>) => R): R;\n \n /**\n * Applies external operations (e.g., from server/peers) to the document.\n * These operations are NOT added to pending operations.\n */\n apply(ops: ReadonlyArray<Operation.Operation<any, any, any>>): void;\n \n /**\n * Returns pending local operations as a Transaction and clears the buffer.\n */\n flush(): Transaction.Transaction;\n}\n\n// =============================================================================\n// Document Options\n// =============================================================================\n\nexport interface DocumentOptions<TSchema extends Primitive.AnyPrimitive> {\n /** Initial state for the document */\n readonly initial?: Primitive.InferState<TSchema>;\n}\n\n// =============================================================================\n// Document Implementation\n// =============================================================================\n\n/**\n * Creates a new Document for the given schema.\n */\nexport const make = <TSchema extends Primitive.AnyPrimitive>(\n schema: TSchema,\n options?: DocumentOptions<TSchema>\n): Document<TSchema> => {\n // Internal state\n let _state: Primitive.InferState<TSchema> | undefined = \n options?.initial ?? schema._internal.getInitialState();\n \n // Pending operations buffer (local changes not yet flushed)\n let _pending: Operation.Operation<any, any, any>[] = [];\n \n // Transaction state\n let _inTransaction = false;\n let _txOps: Operation.Operation<any, any, any>[] = [];\n let _txBaseState: Primitive.InferState<TSchema> | undefined = undefined;\n\n /**\n * Gets state at the given path.\n */\n const getStateAtPath = (path: OperationPath.OperationPath): unknown => {\n const tokens = path.toTokens().filter(t => t !== \"\");\n \n if (tokens.length === 0) {\n return _state;\n }\n \n let current: unknown = _state;\n for (const token of tokens) {\n if (current === null || current === undefined) {\n return undefined;\n }\n \n if (typeof current === \"object\") {\n // Handle array entries (which have { id, pos, value } structure)\n if (Array.isArray(current)) {\n // Try to find by ID in array entries\n const entry = current.find((e: any) => e.id === token);\n if (entry) {\n current = entry.value;\n continue;\n }\n }\n \n // Handle regular object property access\n current = (current as Record<string, unknown>)[token];\n } else {\n return undefined;\n }\n }\n \n return current;\n };\n\n /**\n * Applies a single operation to the current state.\n */\n const applyOperation = (op: Operation.Operation<any, any, any>): void => {\n try {\n _state = schema._internal.applyOperation(_state, op);\n } catch (error) {\n if (error instanceof Error) {\n throw new OperationError(error.message);\n }\n throw new OperationError(String(error));\n }\n };\n\n /**\n * Handles an operation from a proxy.\n * In transaction mode: collects operations, applies to state immediately for subsequent reads.\n * Outside transaction mode: auto-wraps in a single-operation transaction.\n */\n const handleOperation = (op: Operation.Operation<any, any, any>): void => {\n if (_inTransaction) {\n // In transaction: collect op and apply immediately for subsequent reads\n _txOps.push(op);\n applyOperation(op);\n } else {\n // Not in transaction: auto-wrap in single-operation transaction\n const baseState = _state;\n try {\n applyOperation(op);\n _pending.push(op);\n } catch (error) {\n // Rollback on error\n _state = baseState;\n throw error;\n }\n }\n };\n\n /**\n * Creates a ProxyEnvironment for the document.\n */\n const createEnv = (): ProxyEnvironment.ProxyEnvironment => {\n return ProxyEnvironment.make({\n onOperation: handleOperation,\n getState: getStateAtPath,\n });\n };\n\n // Create the root proxy\n const env = createEnv();\n const rootProxy = schema._internal.createProxy(env, OperationPath.make(\"\")) as Primitive.InferProxy<TSchema>;\n\n // Document implementation\n const document: Document<TSchema> = {\n schema,\n root: rootProxy,\n \n get: (): Primitive.InferState<TSchema> | undefined => {\n return _state;\n },\n \n toSnapshot: (): Primitive.InferSnapshot<TSchema> => {\n return (rootProxy as { toSnapshot(): Primitive.InferSnapshot<TSchema> }).toSnapshot();\n },\n \n transaction: <R,>(fn: (root: Primitive.InferProxy<TSchema>) => R): R => {\n if (_inTransaction) {\n throw new NestedTransactionError();\n }\n \n // Start transaction\n _inTransaction = true;\n _txOps = [];\n _txBaseState = _state;\n \n try {\n // Execute the transaction function\n const result = fn(rootProxy);\n \n // Commit: add transaction ops to pending\n _pending.push(..._txOps);\n \n return result;\n } catch (error) {\n // Rollback: restore base state\n _state = _txBaseState;\n throw error;\n } finally {\n // Clean up transaction state\n _inTransaction = false;\n _txOps = [];\n _txBaseState = undefined;\n }\n },\n \n apply: (ops: ReadonlyArray<Operation.Operation<any, any, any>>): void => {\n for (const op of ops) {\n applyOperation(op);\n }\n },\n \n flush: (): Transaction.Transaction => {\n const tx = Transaction.make(_pending);\n _pending = [];\n return tx;\n },\n };\n\n return document;\n};\n","import type * as Operation from \"./Operation\";\n\n// =============================================================================\n// Transform Result Types\n// =============================================================================\n\n/**\n * Result of transforming an operation against another operation.\n */\nexport type TransformResult =\n | { type: \"transformed\"; operation: Operation.Operation<any, any, any> }\n | { type: \"noop\" } // Operation becomes a no-op (already superseded)\n | { type: \"conflict\"; reason: string };\n","/**\n * @since 0.0.1\n * Presence module for ephemeral per-connection state.\n * Used by both client and server for schema validation.\n */\nimport * as Schema from \"effect/Schema\";\n\n// =============================================================================\n// Presence Types\n// =============================================================================\n\n/**\n * A Presence schema wrapper that holds an Effect Schema for validation.\n * This is used by both client and server to validate presence data.\n */\nexport interface Presence<TData> {\n readonly _tag: \"Presence\";\n /** The Effect Schema used for validation */\n readonly schema: Schema.Schema<TData>;\n /** Branded type marker for inference */\n readonly _Data: TData;\n}\n\n/**\n * Options for creating a Presence instance.\n */\nexport interface PresenceOptions<TData> {\n /** The Effect Schema defining the presence data structure */\n readonly schema: Schema.Schema<TData>;\n}\n\n/**\n * Infer the data type from a Presence instance.\n */\nexport type Infer<P extends Presence<any>> = P[\"_Data\"];\n\n/**\n * Any Presence type (for generic constraints).\n */\nexport type AnyPresence = Presence<any>;\n\n// =============================================================================\n// Presence Entry (for storage/transport)\n// =============================================================================\n\n/**\n * A presence entry as stored/transmitted.\n */\nexport interface PresenceEntry<TData = unknown> {\n /** The presence data */\n readonly data: TData;\n /** Optional user ID from authentication */\n readonly userId?: string;\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\n/**\n * Creates a new Presence schema wrapper.\n *\n * @example\n * ```typescript\n * import { Presence } from \"@voidhash/mimic\";\n * import { Schema } from \"effect\";\n *\n * const CursorPresence = Presence.make({\n * schema: Schema.Struct({\n * name: Schema.String,\n * cursor: Schema.Struct({\n * x: Schema.Number,\n * y: Schema.Number,\n * }),\n * }),\n * });\n * ```\n */\nexport const make = <TData,>(options: PresenceOptions<TData>): Presence<TData> => ({\n _tag: \"Presence\",\n schema: options.schema,\n _Data: undefined as unknown as TData,\n});\n\n// =============================================================================\n// Validation Functions\n// =============================================================================\n\n/**\n * Validates unknown data against a Presence schema.\n * Throws a ParseError if validation fails.\n *\n * @param presence - The Presence instance with the schema\n * @param data - Unknown data to validate\n * @returns The validated and typed data\n * @throws ParseError if validation fails\n */\nexport const validate = <TData,>(\n presence: Presence<TData>,\n data: unknown\n): TData => {\n return Schema.decodeUnknownSync(presence.schema)(data);\n};\n\n/**\n * Safely validates unknown data against a Presence schema.\n * Returns undefined if validation fails instead of throwing.\n *\n * @param presence - The Presence instance with the schema\n * @param data - Unknown data to validate\n * @returns The validated data or undefined if invalid\n */\nexport const validateSafe = <TData,>(\n presence: Presence<TData>,\n data: unknown\n): TData | undefined => {\n try {\n return Schema.decodeUnknownSync(presence.schema)(data);\n } catch {\n return undefined;\n }\n};\n\n/**\n * Checks if unknown data is valid according to a Presence schema.\n *\n * @param presence - The Presence instance with the schema\n * @param data - Unknown data to check\n * @returns true if valid, false otherwise\n */\nexport const isValid = <TData,>(\n presence: Presence<TData>,\n data: unknown\n): data is TData => {\n try {\n Schema.decodeUnknownSync(presence.schema)(data);\n return true;\n } catch {\n return false;\n }\n};\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["make","make","tokensInternal: ReadonlyArray<OperationPathToken>","encode","decode","encode","OperationPath.encode","decode","OperationPath.decode","OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","String","OperationDefinition.make","snapshot: Record<string, unknown>","Operation.fromDefinition","newState: InferStructState<TFields>","initialState: Record<string, unknown>","OperationPath.pathsOverlap","OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","Number","OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","byCode: Record<number, string>","byChar: Record<string, number>","paddingDict: Record<number, number>","paddingDict","_base62CharSet: IndexedCharacterSet | null","result: string[]","FractionalIndex.base62CharSet","FractionalIndex.generateKeyBetween","OperationDefinition.make","entries: ArrayEntry<InferState<TElement>>[]","prevPos: string | null","Operation.fromDefinition","newState: ArrayState<TElement>","OperationPath.pathsOverlap","clientTokens","serverTokens","OperationPath.pathsEqual","OperationPath.isPrefix","Array","OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","syntheticOp: Operation.Operation<any, any, any>","descendantIds: string[]","FractionalIndex.base62CharSet","FractionalIndex.generateKeyBetween","OperationDefinition.make","children: TreeNodeSnapshot<any>[]","Operation.fromDefinition","newState: TreeState<TRoot>","node","OperationPath.pathsOverlap","clientTokens","serverTokens","OperationPath.pathsEqual","OperationPath.isPrefix","make","options: ProxyEnvironmentOptions","make","Operation.encode","Operation.decode","make","_state: Primitive.InferState<TSchema> | undefined","_pending: Operation.Operation<any, any, any>[]","_txOps: Operation.Operation<any, any, any>[]","_txBaseState: Primitive.InferState<TSchema> | undefined","current: unknown","ProxyEnvironment.make","OperationPath.make","Transaction.make","Schema"],"sources":["../src/primitives/shared.ts","../src/OperationDefinition.ts","../src/OperationPath.ts","../src/Operation.ts","../src/primitives/String.ts","../src/primitives/Struct.ts","../src/primitives/Boolean.ts","../src/primitives/Number.ts","../src/primitives/Literal.ts","../src/FractionalIndex.ts","../src/primitives/Array.ts","../src/primitives/Lazy.ts","../src/primitives/Union.ts","../src/primitives/Either.ts","../src/primitives/TreeNode.ts","../src/primitives/Tree.ts","../src/Primitive.ts","../src/ProxyEnvironment.ts","../src/Transaction.ts","../src/Document.ts","../src/Transform.ts","../src/Presence.ts"],"sourcesContent":["import * as Operation from \"../Operation\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as Transform from \"../Transform\";\n\n// =============================================================================\n// Primitive Interface & Type Utilities\n// =============================================================================\n\n/**\n * Base interface that all primitives must implement.\n * Provides type inference helpers and internal operations.\n */\nexport interface Primitive<TState, TProxy> {\n readonly _tag: string;\n readonly _State: TState;\n readonly _Proxy: TProxy;\n readonly _internal: PrimitiveInternal<TState, TProxy>;\n }\n \n /**\n * Internal operations that each primitive must provide.\n */\n export interface PrimitiveInternal<TState, TProxy> {\n /** Creates a proxy for generating operations */\n readonly createProxy: (env: ProxyEnvironment.ProxyEnvironment, path: OperationPath.OperationPath) => TProxy;\n /** Applies an operation to the current state, returning the new state */\n readonly applyOperation: (state: TState | undefined, operation: Operation.Operation<any, any, any>) => TState;\n /** Returns the initial/default state for this primitive */\n readonly getInitialState: () => TState | undefined;\n /**\n * Transforms a client operation against a server operation.\n * Used for operational transformation (OT) conflict resolution.\n * \n * @param clientOp - The client's operation to transform\n * @param serverOp - The server's operation that has already been applied\n * @returns TransformResult indicating how the client operation should be handled\n */\n readonly transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ) => Transform.TransformResult;\n }\n \n /**\n * Any primitive type - used for generic constraints.\n */\n export type AnyPrimitive = Primitive<any, any>;\n \n /**\n * Infer the state type from a primitive.\n */\n export type InferState<T> = T extends Primitive<infer S, any> ? S : never;\n \n /**\n * Infer the proxy type from a primitive.\n */\n export type InferProxy<T> = T extends Primitive<any, infer P> ? P : never;\n \n /**\n * Helper type to conditionally add undefined based on TDefined.\n * When TDefined is true, the value is guaranteed to be defined (via required() or default()).\n * When TDefined is false, the value may be undefined.\n */\n export type MaybeUndefined<T, TDefined extends boolean> = TDefined extends true ? T : T | undefined;\n \n /**\n * Infer the snapshot type from a primitive.\n * The snapshot is a readonly, type-safe structure suitable for rendering.\n */\n export type InferSnapshot<T> = T extends Primitive<any, infer P>\n ? P extends { toSnapshot(): infer S } ? S : never\n : never;\n \n // =============================================================================\n // Validation Errors\n // =============================================================================\n \n export class ValidationError extends Error {\n readonly _tag = \"ValidationError\";\n constructor(message: string) {\n super(message);\n this.name = \"ValidationError\";\n }\n }\n \n // =============================================================================\n // Validation Infrastructure\n // =============================================================================\n \n /**\n * A validator that checks a value and returns whether it's valid.\n */\n export interface Validator<T> {\n readonly validate: (value: T) => boolean;\n readonly message: string;\n }\n \n\n/**\n * Runs all validators against a value, throwing ValidationError if any fail.\n */\nexport function runValidators<T>(value: T, validators: readonly { validate: (value: T) => boolean; message: string }[]): void {\n for (const validator of validators) {\n if (!validator.validate(value)) {\n throw new ValidationError(validator.message);\n }\n }\n}\n\n/**\n * Checks if an operation is compatible with the given operation definitions.\n * @param operation - The operation to check.\n * @param operationDefinitions - The operation definitions to check against.\n * @returns True if the operation is compatible, false otherwise.\n */\nexport function isCompatibleOperation(operation: Operation.Operation<any, any, any>, operationDefinitions: Record<string, OperationDefinition.OperationDefinition<any, any, any>>) {\n const values = Object.values(operationDefinitions);\n return values.some(value => value.kind === operation.kind);\n}\n\n","import { Schema } from \"effect\";\n\ntype Mutable<T> = T extends ReadonlyArray<infer U> ? Array<U> : { -readonly [K in keyof T]: T[K] };\n\nexport interface OperationDefinition<TKind, TPayload extends Schema.Schema.Any, TTarget extends Schema.Schema.Any> {\n readonly kind: TKind\n readonly payload: TPayload\n readonly target: TTarget\n}\n\nexport const make = <TKind, TPayload extends Schema.Schema.Any, TTarget extends Schema.Schema.Any>(options: {\n readonly kind: TKind\n readonly payload: TPayload\n readonly target: TTarget\n readonly apply: (payload: Schema.Schema.Type<TPayload>, target: Mutable<Schema.Schema.Type<TTarget>>) => void\n}) => {\n return {\n kind: options.kind,\n payload: options.payload,\n target: options.target,\n apply: options.apply\n } as const;\n}","// export type OperationPath = string\nexport type OperationPathToken = string\n\nexport interface OperationPath {\n readonly _tag: \"OperationPath\"\n readonly toTokens: () => ReadonlyArray<OperationPathToken>\n readonly concat: (other: OperationPath) => OperationPath\n readonly append: (token: OperationPathToken) => OperationPath\n readonly pop: () => OperationPath\n readonly shift: () => OperationPath\n}\n\nconst parseStringPath = (stringPath: string): ReadonlyArray<OperationPathToken> => {\n return stringPath.split(\"/\")\n}\n\nconst makeStringPathFromTokens = (tokens: ReadonlyArray<OperationPathToken>): string => {\n return tokens.join(\"/\")\n}\n\n/**\n * Creates a new operation path.\n * @param stringPath - The string path to create the path from.\n * @returns The new operation path.\n */\nexport function make(stringPath?: string): OperationPath {\n\n const tokensInternal: ReadonlyArray<OperationPathToken> = stringPath ? parseStringPath(stringPath) : []\n\n /**\n * Returns the tokens of the path.\n * @returns The tokens of the path.\n */\n const toTokens = () => {\n return tokensInternal\n }\n\n /**\n * Concatenates two paths.\n * @param other - The other path to concatenate.\n * @returns The new path.\n */\n const concat = (other: OperationPath): OperationPath => {\n return make(makeStringPathFromTokens(toTokens().concat(other.toTokens())))\n }\n\n /**\n * Appends a token to the path.\n * @param token - The token to append.\n * @returns The new path.\n */\n const append = (token: OperationPathToken): OperationPath => {\n return make(makeStringPathFromTokens(toTokens().concat([token])))\n }\n\n /**\n * Removes the last token from the path.\n * @returns The new path.\n */\n const pop = (): OperationPath => {\n return make(makeStringPathFromTokens(toTokens().slice(0, -1)))\n }\n\n /**\n * Removes the first token from the path.\n * @returns The new path.\n */\n const shift = (): OperationPath => {\n return make(makeStringPathFromTokens(toTokens().slice(1)))\n }\n\n return {\n _tag: \"OperationPath\",\n toTokens,\n concat,\n append,\n pop,\n shift\n } as const\n}\n\n/**\n * Creates a new operation path from tokens.\n * @param tokens - The tokens to create the path from.\n * @returns The new operation path.\n */\nexport function fromTokens(tokens: ReadonlyArray<OperationPathToken>): OperationPath {\n return make(makeStringPathFromTokens(tokens))\n}\n\n// =============================================================================\n// Path Utility Functions\n// =============================================================================\n\n/**\n * Checks if two operation paths overlap (one is prefix of the other or equal).\n */\nexport const pathsOverlap = (\n pathA: OperationPath,\n pathB: OperationPath\n): boolean => {\n const tokensA = pathA.toTokens().filter((t) => t !== \"\");\n const tokensB = pathB.toTokens().filter((t) => t !== \"\");\n\n const minLength = Math.min(tokensA.length, tokensB.length);\n\n for (let i = 0; i < minLength; i++) {\n if (tokensA[i] !== tokensB[i]) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * Checks if pathA is a prefix of pathB (pathA is ancestor of pathB).\n */\nexport const isPrefix = (\n pathA: OperationPath,\n pathB: OperationPath\n): boolean => {\n const tokensA = pathA.toTokens().filter((t) => t !== \"\");\n const tokensB = pathB.toTokens().filter((t) => t !== \"\");\n\n if (tokensA.length > tokensB.length) {\n return false;\n }\n\n for (let i = 0; i < tokensA.length; i++) {\n if (tokensA[i] !== tokensB[i]) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * Checks if two paths are exactly equal.\n */\nexport const pathsEqual = (\n pathA: OperationPath,\n pathB: OperationPath\n): boolean => {\n const tokensA = pathA.toTokens().filter((t) => t !== \"\");\n const tokensB = pathB.toTokens().filter((t) => t !== \"\");\n\n if (tokensA.length !== tokensB.length) {\n return false;\n }\n\n for (let i = 0; i < tokensA.length; i++) {\n if (tokensA[i] !== tokensB[i]) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * Gets the relative path of pathB with respect to pathA.\n * Assumes pathA is a prefix of pathB.\n */\nexport const getRelativePath = (\n basePath: OperationPath,\n fullPath: OperationPath\n): string[] => {\n const baseTokens = basePath.toTokens().filter((t) => t !== \"\");\n const fullTokens = fullPath.toTokens().filter((t) => t !== \"\");\n\n return fullTokens.slice(baseTokens.length);\n};\n\n/**\n * Encoded representation of an OperationPath for network transport.\n */\nexport type EncodedOperationPath = string;\n\n/**\n * Encodes an OperationPath to a string for network transport.\n * @param path - The operation path to encode.\n * @returns The encoded string representation.\n */\nexport const encode = (path: OperationPath): EncodedOperationPath => {\n return makeStringPathFromTokens(path.toTokens());\n};\n\n/**\n * Decodes an encoded string back to an OperationPath.\n * @param encoded - The encoded string representation.\n * @returns The decoded OperationPath.\n */\nexport const decode = (encoded: EncodedOperationPath): OperationPath => {\n return make(encoded);\n};","\nimport * as OperationPath from \"./OperationPath\"\nimport * as OperationDefinition from \"./OperationDefinition\"\nimport { Schema } from \"effect\";\n\n\nexport type Operation<TKind, TPayload extends Schema.Schema.Any, TDef extends OperationDefinition.OperationDefinition<TKind, TPayload, any>> = {\n readonly kind: TKind\n readonly path: OperationPath.OperationPath\n readonly payload: Schema.Schema.Type<TPayload>,\n\n} & TDef\n\nexport const fromDefinition = <TKind, TPayload extends Schema.Schema.Any, TDef extends OperationDefinition.OperationDefinition<TKind, TPayload, any>>(operationPath: OperationPath.OperationPath, definition: TDef, payload: Schema.Schema.Type<TPayload>): Operation<TKind, TPayload, TDef> => {\n return {\n kind: definition.kind,\n path: operationPath,\n payload: payload,\n } as Operation<TKind, TPayload, TDef>\n}\n\n/**\n * Encoded representation of an Operation for network transport.\n */\nexport interface EncodedOperation {\n readonly kind: unknown\n readonly path: OperationPath.EncodedOperationPath\n readonly payload: unknown\n}\n\n/**\n * Encodes an Operation to a JSON-serializable format for network transport.\n * @param operation - The operation to encode.\n * @returns The encoded representation.\n */\nexport const encode = <TKind, TPayload extends Schema.Schema.Any, TDef extends OperationDefinition.OperationDefinition<TKind, TPayload, any>>(\n operation: Operation<TKind, TPayload, TDef>\n): EncodedOperation => {\n return {\n kind: operation.kind,\n path: OperationPath.encode(operation.path),\n payload: operation.payload,\n }\n}\n\n/**\n * Decodes an encoded operation back to an Operation.\n * Note: This returns a partial operation without the definition methods.\n * The caller must have the operation definitions to fully reconstruct if needed.\n * @param encoded - The encoded representation.\n * @returns The decoded Operation (without definition-specific methods).\n */\nexport const decode = (encoded: EncodedOperation): Operation<unknown, Schema.Schema.Any, any> => {\n return {\n kind: encoded.kind,\n path: OperationPath.decode(encoded.path),\n payload: encoded.payload,\n } as Operation<unknown, Schema.Schema.Any, any>\n}","import { Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, Validator } from \"./shared\";\nimport { runValidators, isCompatibleOperation, ValidationError } from \"./shared\";\n\n// =============================================================================\n// String Primitive\n// =============================================================================\n\nexport interface StringProxy<TDefined extends boolean = false> {\n /** Gets the current string value */\n get(): MaybeUndefined<string, TDefined>;\n /** Sets the string value, generating a string.set operation */\n set(value: string): void;\n /** Returns a readonly snapshot of the string value for rendering */\n toSnapshot(): MaybeUndefined<string, TDefined>;\n}\n\ninterface StringPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: string | undefined;\n readonly validators: readonly Validator<string>[];\n}\n\nexport class StringPrimitive<TDefined extends boolean = false> implements Primitive<string, StringProxy<TDefined>> {\n readonly _tag = \"StringPrimitive\" as const;\n readonly _State!: string;\n readonly _Proxy!: StringProxy<TDefined>;\n\n private readonly _schema: StringPrimitiveSchema;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"string.set\" as const,\n payload: Schema.String,\n target: Schema.String,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: StringPrimitiveSchema) {\n this._schema = schema;\n }\n\n /** Mark this string as required */\n required(): StringPrimitive<true> {\n return new StringPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this string */\n default(defaultValue: string): StringPrimitive<true> {\n return new StringPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: string) => boolean, message: string): StringPrimitive<TDefined> {\n return new StringPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n /** Minimum string length */\n min(length: number): StringPrimitive<TDefined> {\n return this.refine(\n (v) => v.length >= length,\n `String must be at least ${length} characters`\n );\n }\n\n /** Maximum string length */\n max(length: number): StringPrimitive<TDefined> {\n return this.refine(\n (v) => v.length <= length,\n `String must be at most ${length} characters`\n );\n }\n\n /** Exact string length */\n length(exact: number): StringPrimitive<TDefined> {\n return this.refine(\n (v) => v.length === exact,\n `String must be exactly ${exact} characters`\n );\n }\n\n /** Match a regex pattern */\n regex(pattern: RegExp, message?: string): StringPrimitive<TDefined> {\n return this.refine(\n (v) => pattern.test(v),\n message ?? `String must match pattern ${pattern}`\n );\n }\n\n /** Validate as email format */\n email(): StringPrimitive<TDefined> {\n // Simple email regex - covers most common cases\n const emailPattern = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return this.refine(\n (v) => emailPattern.test(v),\n \"Invalid email format\"\n );\n }\n\n /** Validate as URL format */\n url(): StringPrimitive<TDefined> {\n return this.refine(\n (v) => {\n try {\n new URL(v);\n return true;\n } catch {\n return false;\n }\n },\n \"Invalid URL format\"\n );\n }\n\n readonly _internal: PrimitiveInternal<string, StringProxy<TDefined>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): StringProxy<TDefined> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<string, TDefined> => {\n const state = env.getState(operationPath) as string | undefined;\n return (state ?? defaultValue) as MaybeUndefined<string, TDefined>;\n },\n set: (value: string) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<string, TDefined> => {\n const state = env.getState(operationPath) as string | undefined;\n return (state ?? defaultValue) as MaybeUndefined<string, TDefined>;\n },\n };\n },\n\n applyOperation: (state: string | undefined, operation: Operation.Operation<any, any, any>): string => {\n if (!isCompatibleOperation(operation, this._opDefinitions)) {\n throw new ValidationError(`StringPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"string\") {\n throw new ValidationError(`StringPrimitive.set requires a string payload, got: ${typeof payload}`);\n }\n\n // Run validators\n runValidators(payload, this._schema.validators);\n\n return payload;\n },\n\n getInitialState: (): string | undefined => {\n return this._schema.defaultValue;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n // Client operation proceeds as-is\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new StringPrimitive */\nexport const String = (): StringPrimitive<false> =>\n new StringPrimitive({ required: false, defaultValue: undefined, validators: [] });\n\n","import { Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, AnyPrimitive, Validator, InferState, InferProxy, InferSnapshot } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators } from \"./shared\";\n\n\n/**\n * Maps a schema definition to its state type.\n * { name: StringPrimitive, age: NumberPrimitive } -> { name: string, age: number }\n */\nexport type InferStructState<TFields extends Record<string, AnyPrimitive>> = {\n readonly [K in keyof TFields]: InferState<TFields[K]>;\n};\n\n/**\n * Maps a schema definition to its snapshot type.\n * Each field's snapshot type is inferred from the field primitive.\n */\nexport type InferStructSnapshot<TFields extends Record<string, AnyPrimitive>> = {\n readonly [K in keyof TFields]: InferSnapshot<TFields[K]>;\n};\n\n/**\n * Maps a schema definition to its proxy type.\n * Provides nested field access + get()/set()/toSnapshot() methods for the whole struct.\n */\nexport type StructProxy<TFields extends Record<string, AnyPrimitive>, TDefined extends boolean = false> = {\n readonly [K in keyof TFields]: InferProxy<TFields[K]>;\n} & {\n /** Gets the entire struct value */\n get(): MaybeUndefined<InferStructState<TFields>, TDefined>;\n /** Sets the entire struct value */\n set(value: InferStructState<TFields>): void;\n /** Returns a readonly snapshot of the struct for rendering */\n toSnapshot(): MaybeUndefined<InferStructSnapshot<TFields>, TDefined>;\n};\n\ninterface StructPrimitiveSchema<TFields extends Record<string, AnyPrimitive>> {\n readonly required: boolean;\n readonly defaultValue: InferStructState<TFields> | undefined;\n readonly fields: TFields;\n readonly validators: readonly Validator<InferStructState<TFields>>[];\n}\n\nexport class StructPrimitive<TFields extends Record<string, AnyPrimitive>, TDefined extends boolean = false>\n implements Primitive<InferStructState<TFields>, StructProxy<TFields, TDefined>>\n{\n readonly _tag = \"StructPrimitive\" as const;\n readonly _State!: InferStructState<TFields>;\n readonly _Proxy!: StructProxy<TFields, TDefined>;\n\n private readonly _schema: StructPrimitiveSchema<TFields>;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"struct.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: StructPrimitiveSchema<TFields>) {\n this._schema = schema;\n }\n\n /** Mark this struct as required */\n required(): StructPrimitive<TFields, true> {\n return new StructPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this struct */\n default(defaultValue: InferStructState<TFields>): StructPrimitive<TFields, true> {\n return new StructPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the fields schema */\n get fields(): TFields {\n return this._schema.fields;\n }\n\n /** Add a custom validation rule (useful for cross-field validation) */\n refine(fn: (value: InferStructState<TFields>) => boolean, message: string): StructPrimitive<TFields, TDefined> {\n return new StructPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n readonly _internal: PrimitiveInternal<InferStructState<TFields>, StructProxy<TFields, TDefined>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): StructProxy<TFields, TDefined> => {\n const fields = this._schema.fields;\n const defaultValue = this._schema.defaultValue;\n\n // Helper to build a snapshot by calling toSnapshot on each field\n const buildSnapshot = (): InferStructSnapshot<TFields> | undefined => {\n const state = env.getState(operationPath);\n \n // Build snapshot from field proxies (they handle their own defaults)\n const snapshot: Record<string, unknown> = {};\n let hasAnyDefinedField = false;\n \n for (const key in fields) {\n const fieldPrimitive = fields[key]!;\n const fieldPath = operationPath.append(key);\n const fieldProxy = fieldPrimitive._internal.createProxy(env, fieldPath);\n const fieldSnapshot = (fieldProxy as { toSnapshot(): unknown }).toSnapshot();\n snapshot[key] = fieldSnapshot;\n if (fieldSnapshot !== undefined) {\n hasAnyDefinedField = true;\n }\n }\n \n // Return undefined only if there's no state, no struct default, and no field snapshots\n if (state === undefined && defaultValue === undefined && !hasAnyDefinedField) {\n return undefined;\n }\n \n return snapshot as InferStructSnapshot<TFields>;\n };\n\n // Create the base object with get/set/toSnapshot methods\n const base = {\n get: (): MaybeUndefined<InferStructState<TFields>, TDefined> => {\n const state = env.getState(operationPath) as InferStructState<TFields> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferStructState<TFields>, TDefined>;\n },\n set: (value: InferStructState<TFields>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<InferStructSnapshot<TFields>, TDefined> => {\n const snapshot = buildSnapshot();\n return snapshot as MaybeUndefined<InferStructSnapshot<TFields>, TDefined>;\n },\n };\n\n // Use a JavaScript Proxy to intercept field access\n return new globalThis.Proxy(base as StructProxy<TFields, TDefined>, {\n get: (target, prop, receiver) => {\n // Return base methods (get, set, toSnapshot)\n if (prop === \"get\") {\n return target.get;\n }\n if (prop === \"set\") {\n return target.set;\n }\n if (prop === \"toSnapshot\") {\n return target.toSnapshot;\n }\n\n // Handle symbol properties (like Symbol.toStringTag)\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n\n // Check if prop is a field in the schema\n if (prop in fields) {\n const fieldPrimitive = fields[prop as keyof TFields]!;\n const fieldPath = operationPath.append(prop as string);\n return fieldPrimitive._internal.createProxy(env, fieldPath);\n }\n\n return undefined;\n },\n has: (target, prop) => {\n if (prop === \"get\" || prop === \"set\" || prop === \"toSnapshot\") return true;\n if (typeof prop === \"string\" && prop in fields) return true;\n return false;\n },\n });\n },\n\n applyOperation: (\n state: InferStructState<TFields> | undefined,\n operation: Operation.Operation<any, any, any>\n ): InferStructState<TFields> => {\n const path = operation.path;\n const tokens = path.toTokens().filter((t: string) => t !== \"\");\n\n let newState: InferStructState<TFields>;\n\n // If path is empty or root, this is a struct.set operation\n if (tokens.length === 0) {\n if (operation.kind !== \"struct.set\") {\n throw new ValidationError(`StructPrimitive root cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"object\" || payload === null) {\n throw new ValidationError(`StructPrimitive.set requires an object payload`);\n }\n\n newState = payload as InferStructState<TFields>;\n } else {\n // Otherwise, delegate to the appropriate field primitive\n const fieldName = tokens[0] as keyof TFields;\n if (!(fieldName in this._schema.fields)) {\n throw new ValidationError(`Unknown field: ${globalThis.String(fieldName)}`);\n }\n\n const fieldPrimitive = this._schema.fields[fieldName]!;\n const remainingPath = path.shift();\n const fieldOperation = {\n ...operation,\n path: remainingPath,\n };\n\n // Get the current field state\n const currentState = state ?? ({} as InferStructState<TFields>);\n const currentFieldState = currentState[fieldName] as InferState<typeof fieldPrimitive> | undefined;\n\n // Apply the operation to the field\n const newFieldState = fieldPrimitive._internal.applyOperation(currentFieldState, fieldOperation);\n\n // Build updated state\n newState = {\n ...currentState,\n [fieldName]: newFieldState,\n };\n }\n\n // Run validators on the new state\n runValidators(newState, this._schema.validators);\n\n return newState;\n },\n\n getInitialState: (): InferStructState<TFields> | undefined => {\n if (this._schema.defaultValue !== undefined) {\n return this._schema.defaultValue;\n }\n\n // Build initial state from field defaults\n const fields = this._schema.fields;\n const initialState: Record<string, unknown> = {};\n let hasAnyDefault = false;\n\n for (const key in fields) {\n const fieldDefault = fields[key]!._internal.getInitialState();\n if (fieldDefault !== undefined) {\n initialState[key] = fieldDefault;\n hasAnyDefault = true;\n }\n }\n\n return hasAnyDefault ? (initialState as InferStructState<TFields>) : undefined;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n const clientPath = clientOp.path;\n const serverPath = serverOp.path;\n\n // If paths don't overlap at all, no transformation needed\n if (!OperationPath.pathsOverlap(clientPath, serverPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n const clientTokens = clientPath.toTokens().filter((t: string) => t !== \"\");\n const serverTokens = serverPath.toTokens().filter((t: string) => t !== \"\");\n\n // If both are at root level (struct.set operations)\n if (clientTokens.length === 0 && serverTokens.length === 0) {\n // Client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n }\n\n // If server set entire struct and client is updating a field\n if (serverTokens.length === 0 && serverOp.kind === \"struct.set\") {\n // Client's field operation proceeds - optimistic update\n // Server will validate/reject if needed\n return { type: \"transformed\", operation: clientOp };\n }\n\n // If client set entire struct and server is updating a field\n if (clientTokens.length === 0 && clientOp.kind === \"struct.set\") {\n // Client's struct.set supersedes server's field update\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Both operations target fields\n if (clientTokens.length > 0 && serverTokens.length > 0) {\n const clientField = clientTokens[0] as keyof TFields;\n const serverField = serverTokens[0] as keyof TFields;\n\n // Different fields - no conflict\n if (clientField !== serverField) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Same field - delegate to field primitive\n const fieldPrimitive = this._schema.fields[clientField];\n if (!fieldPrimitive) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n const clientOpForField = {\n ...clientOp,\n path: clientOp.path.shift(),\n };\n const serverOpForField = {\n ...serverOp,\n path: serverOp.path.shift(),\n };\n\n const result = fieldPrimitive._internal.transformOperation(clientOpForField, serverOpForField);\n\n if (result.type === \"transformed\") {\n // Restore the original path\n return {\n type: \"transformed\",\n operation: {\n ...result.operation,\n path: clientOp.path,\n },\n };\n }\n\n return result;\n }\n\n // Default: no transformation needed\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new StructPrimitive with the given fields */\nexport const Struct = <TFields extends Record<string, AnyPrimitive>>(\n fields: TFields\n): StructPrimitive<TFields, false> =>\n new StructPrimitive({ required: false, defaultValue: undefined, fields, validators: [] });\n\n","import { Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, Validator } from \"./shared\";\nimport { runValidators, isCompatibleOperation, ValidationError } from \"./shared\";\n\n\nexport interface BooleanProxy<TDefined extends boolean = false> {\n /** Gets the current boolean value */\n get(): MaybeUndefined<boolean, TDefined>;\n /** Sets the boolean value, generating a boolean.set operation */\n set(value: boolean): void;\n /** Returns a readonly snapshot of the boolean value for rendering */\n toSnapshot(): MaybeUndefined<boolean, TDefined>;\n}\n\ninterface BooleanPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: boolean | undefined;\n readonly validators: readonly Validator<boolean>[];\n}\n\nexport class BooleanPrimitive<TDefined extends boolean = false> implements Primitive<boolean, BooleanProxy<TDefined>> {\n readonly _tag = \"BooleanPrimitive\" as const;\n readonly _State!: boolean;\n readonly _Proxy!: BooleanProxy<TDefined>;\n\n private readonly _schema: BooleanPrimitiveSchema;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"boolean.set\" as const,\n payload: Schema.Boolean,\n target: Schema.Boolean,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: BooleanPrimitiveSchema) {\n this._schema = schema;\n }\n\n /** Mark this boolean as required */\n required(): BooleanPrimitive<true> {\n return new BooleanPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this boolean */\n default(defaultValue: boolean): BooleanPrimitive<true> {\n return new BooleanPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: boolean) => boolean, message: string): BooleanPrimitive<TDefined> {\n return new BooleanPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n readonly _internal: PrimitiveInternal<boolean, BooleanProxy<TDefined>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): BooleanProxy<TDefined> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<boolean, TDefined> => {\n const state = env.getState(operationPath) as boolean | undefined;\n return (state ?? defaultValue) as MaybeUndefined<boolean, TDefined>;\n },\n set: (value: boolean) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<boolean, TDefined> => {\n const state = env.getState(operationPath) as boolean | undefined;\n return (state ?? defaultValue) as MaybeUndefined<boolean, TDefined>;\n },\n };\n },\n\n applyOperation: (state: boolean | undefined, operation: Operation.Operation<any, any, any>): boolean => {\n if (operation.kind !== \"boolean.set\") {\n throw new ValidationError(`BooleanPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"boolean\") {\n throw new ValidationError(`BooleanPrimitive.set requires a boolean payload, got: ${typeof payload}`);\n }\n\n // Run validators\n runValidators(payload, this._schema.validators);\n\n return payload;\n },\n\n getInitialState: (): boolean | undefined => {\n return this._schema.defaultValue;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new BooleanPrimitive */\nexport const Boolean = (): BooleanPrimitive<false> =>\n new BooleanPrimitive({ required: false, defaultValue: undefined, validators: [] });\n\n","import { Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, AnyPrimitive, Validator } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators, isCompatibleOperation } from \"./shared\";\n\n\nexport interface NumberProxy<TDefined extends boolean = false> {\n /** Gets the current number value */\n get(): MaybeUndefined<number, TDefined>;\n /** Sets the number value, generating a number.set operation */\n set(value: number): void;\n /** Returns a readonly snapshot of the number value for rendering */\n toSnapshot(): MaybeUndefined<number, TDefined>;\n}\n\ninterface NumberPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: number | undefined;\n readonly validators: readonly Validator<number>[];\n}\n\nexport class NumberPrimitive<TDefined extends boolean = false> implements Primitive<number, NumberProxy<TDefined>> {\n readonly _tag = \"NumberPrimitive\" as const;\n readonly _State!: number;\n readonly _Proxy!: NumberProxy<TDefined>;\n\n private readonly _schema: NumberPrimitiveSchema;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"number.set\" as const,\n payload: Schema.Number,\n target: Schema.Number,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: NumberPrimitiveSchema) {\n this._schema = schema;\n }\n\n /** Mark this number as required */\n required(): NumberPrimitive<true> {\n return new NumberPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this number */\n default(defaultValue: number): NumberPrimitive<true> {\n return new NumberPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: number) => boolean, message: string): NumberPrimitive<TDefined> {\n return new NumberPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n /** Minimum value (inclusive) */\n min(value: number): NumberPrimitive<TDefined> {\n return this.refine(\n (v) => v >= value,\n `Number must be at least ${value}`\n );\n }\n\n /** Maximum value (inclusive) */\n max(value: number): NumberPrimitive<TDefined> {\n return this.refine(\n (v) => v <= value,\n `Number must be at most ${value}`\n );\n }\n\n /** Must be positive (> 0) */\n positive(): NumberPrimitive<TDefined> {\n return this.refine(\n (v) => v > 0,\n \"Number must be positive\"\n );\n }\n\n /** Must be negative (< 0) */\n negative(): NumberPrimitive<TDefined> {\n return this.refine(\n (v) => v < 0,\n \"Number must be negative\"\n );\n }\n\n /** Must be an integer */\n int(): NumberPrimitive<TDefined> {\n return this.refine(\n (v) => globalThis.Number.isInteger(v),\n \"Number must be an integer\"\n );\n }\n\n readonly _internal: PrimitiveInternal<number, NumberProxy<TDefined>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): NumberProxy<TDefined> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<number, TDefined> => {\n const state = env.getState(operationPath) as number | undefined;\n return (state ?? defaultValue) as MaybeUndefined<number, TDefined>;\n },\n set: (value: number) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<number, TDefined> => {\n const state = env.getState(operationPath) as number | undefined;\n return (state ?? defaultValue) as MaybeUndefined<number, TDefined>;\n },\n };\n },\n\n applyOperation: (state: number | undefined, operation: Operation.Operation<any, any, any>): number => {\n if (operation.kind !== \"number.set\") {\n throw new ValidationError(`NumberPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"number\") {\n throw new ValidationError(`NumberPrimitive.set requires a number payload, got: ${typeof payload}`);\n }\n\n // Run validators\n runValidators(payload, this._schema.validators);\n\n return payload;\n },\n\n getInitialState: (): number | undefined => {\n return this._schema.defaultValue;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new NumberPrimitive */\nexport const Number = (): NumberPrimitive<false> =>\n new NumberPrimitive({ required: false, defaultValue: undefined, validators: [] });\n\n","import { Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, AnyPrimitive, Validator } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators, isCompatibleOperation } from \"./shared\";\n\n\n/** Valid literal types */\nexport type LiteralValue = string | number | boolean | null;\n\nexport interface LiteralProxy<T extends LiteralValue, TDefined extends boolean = false> {\n /** Gets the current literal value */\n get(): MaybeUndefined<T, TDefined>;\n /** Sets the literal value (must match the exact literal type) */\n set(value: T): void;\n /** Returns a readonly snapshot of the literal value for rendering */\n toSnapshot(): MaybeUndefined<T, TDefined>;\n}\n\ninterface LiteralPrimitiveSchema<T extends LiteralValue> {\n readonly required: boolean;\n readonly defaultValue: T | undefined;\n readonly literal: T;\n}\n\nexport class LiteralPrimitive<T extends LiteralValue, TDefined extends boolean = false> implements Primitive<T, LiteralProxy<T, TDefined>> {\n readonly _tag = \"LiteralPrimitive\" as const;\n readonly _State!: T;\n readonly _Proxy!: LiteralProxy<T, TDefined>;\n\n private readonly _schema: LiteralPrimitiveSchema<T>;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"literal.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: LiteralPrimitiveSchema<T>) {\n this._schema = schema;\n }\n\n /** Mark this literal as required */\n required(): LiteralPrimitive<T, true> {\n return new LiteralPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this literal */\n default(defaultValue: T): LiteralPrimitive<T, true> {\n return new LiteralPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the literal value this primitive represents */\n get literal(): T {\n return this._schema.literal;\n }\n\n readonly _internal: PrimitiveInternal<T, LiteralProxy<T, TDefined>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): LiteralProxy<T, TDefined> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<T, TDefined> => {\n const state = env.getState(operationPath) as T | undefined;\n return (state ?? defaultValue) as MaybeUndefined<T, TDefined>;\n },\n set: (value: T) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<T, TDefined> => {\n const state = env.getState(operationPath) as T | undefined;\n return (state ?? defaultValue) as MaybeUndefined<T, TDefined>;\n },\n };\n },\n\n applyOperation: (state: T | undefined, operation: Operation.Operation<any, any, any>): T => {\n if (operation.kind !== \"literal.set\") {\n throw new ValidationError(`LiteralPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (payload !== this._schema.literal) {\n throw new ValidationError(\n `LiteralPrimitive.set requires the exact literal value \"${globalThis.String(this._schema.literal)}\", got: \"${globalThis.String(payload)}\"`\n );\n }\n\n return payload as T;\n },\n\n getInitialState: (): T | undefined => {\n return this._schema.defaultValue;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new LiteralPrimitive with the given literal value */\nexport const Literal = <T extends LiteralValue>(literal: T): LiteralPrimitive<T, false> =>\n new LiteralPrimitive({ required: false, defaultValue: undefined, literal });\n\n","import { Effect, Random } from \"effect\"\n\n// ============================================================================\n// Types and Interfaces\n// ============================================================================\n\nexport interface IndexCharacterSetOptions {\n chars: string // sorted string of unique characters like \"0123456789ABC\"\n jitterRange?: number // default is 1/5 of the total range created by adding 3 characters\n firstPositive?: string // default is the middle character\n mostPositive?: string // default is the last character\n mostNegative?: string // default is the first character\n}\n\nexport interface IndexedCharacterSet {\n chars: string\n byChar: Record<string, number>\n byCode: Record<number, string>\n paddingDict: Record<number, number>\n length: number\n first: string\n last: string\n firstPositive: string\n mostPositive: string\n firstNegative: string\n mostNegative: string\n jitterRange: number\n}\n\nexport type IntegerLimits = {\n firstPositive: string\n mostPositive: string\n firstNegative: string\n mostNegative: string\n}\n\nexport interface GeneratorOptions {\n charSet?: IndexedCharacterSet\n useJitter?: boolean\n groupIdLength?: number\n}\n\n// ============================================================================\n// Character Set Functions\n// ============================================================================\n\ntype CharSetDicts = {\n byCode: Record<number, string>\n byChar: Record<string, number>\n length: number\n}\n\nfunction createCharSetDicts(charSet: string): CharSetDicts {\n const byCode: Record<number, string> = {}\n const byChar: Record<string, number> = {}\n const length = charSet.length\n\n for (let i = 0; i < length; i++) {\n const char = charSet[i]\n if (char === undefined) {\n throw new Error(\"invalid charSet: missing character at index \" + i)\n }\n byCode[i] = char\n byChar[char] = i\n }\n return {\n byCode: byCode,\n byChar: byChar,\n length: length,\n }\n}\n\nfunction integerLimits(\n dicts: CharSetDicts,\n firstPositive?: string,\n mostPositive?: string,\n mostNegative?: string\n): Effect.Effect<IntegerLimits, Error> {\n return Effect.gen(function* () {\n const firstPositiveIndex = firstPositive\n ? dicts.byChar[firstPositive]\n : Math.ceil(dicts.length / 2)\n const mostPositiveIndex = mostPositive\n ? dicts.byChar[mostPositive]\n : dicts.length - 1\n const mostNegativeIndex = mostNegative ? dicts.byChar[mostNegative] : 0\n\n if (\n firstPositiveIndex === undefined ||\n mostPositiveIndex === undefined ||\n mostNegativeIndex === undefined\n ) {\n return yield* Effect.fail(new Error(\"invalid charSet\"))\n }\n if (mostPositiveIndex - firstPositiveIndex < 3) {\n return yield* Effect.fail(\n new Error(\"mostPositive must be at least 3 characters away from neutral\")\n )\n }\n if (firstPositiveIndex - mostNegativeIndex < 3) {\n return yield* Effect.fail(\n new Error(\"mostNegative must be at least 3 characters away from neutral\")\n )\n }\n\n const firstPositiveChar = dicts.byCode[firstPositiveIndex]\n const mostPositiveChar = dicts.byCode[mostPositiveIndex]\n const firstNegativeChar = dicts.byCode[firstPositiveIndex - 1]\n const mostNegativeChar = dicts.byCode[mostNegativeIndex]\n\n if (\n firstPositiveChar === undefined ||\n mostPositiveChar === undefined ||\n firstNegativeChar === undefined ||\n mostNegativeChar === undefined\n ) {\n return yield* Effect.fail(new Error(\"invalid charSet\"))\n }\n\n return {\n firstPositive: firstPositiveChar,\n mostPositive: mostPositiveChar,\n firstNegative: firstNegativeChar,\n mostNegative: mostNegativeChar,\n }\n })\n}\n\nfunction paddingDict(jitterRange: number, charSetLength: number): Record<number, number> {\n const paddingDict: Record<number, number> = {}\n for (let i = 0; i < 100; i++) {\n const value = Math.pow(charSetLength, i)\n paddingDict[i] = value\n if (value > jitterRange) {\n break\n }\n }\n return paddingDict\n}\n\nexport function validateChars(characters: string): Effect.Effect<void, Error> {\n if (characters.length < 7) {\n return Effect.fail(new Error(\"charSet must be at least 7 characters long\"))\n }\n const chars = characters.split(\"\")\n const sorted = chars.sort()\n const isEqual = sorted.join(\"\") === characters\n if (!isEqual) {\n return Effect.fail(new Error(\"charSet must be sorted\"))\n }\n return Effect.void\n}\n\nexport function indexCharacterSet(\n options: IndexCharacterSetOptions\n): Effect.Effect<IndexedCharacterSet, Error> {\n return Effect.gen(function* () {\n yield* validateChars(options.chars)\n const dicts = createCharSetDicts(options.chars)\n const limits = yield* integerLimits(\n dicts,\n options.firstPositive,\n options.mostPositive,\n options.mostNegative\n )\n // 1/5 of the total range if we add 3 characters, TODO: feels a bit arbitrary and could be improved\n const jitterRange =\n options.jitterRange ?? Math.floor(Math.pow(dicts.length, 3) / 5)\n\n const paddingRange = paddingDict(jitterRange, dicts.length)\n\n const first = dicts.byCode[0]\n const last = dicts.byCode[dicts.length - 1]\n\n if (first === undefined || last === undefined) {\n return yield* Effect.fail(new Error(\"invalid charSet\"))\n }\n\n return {\n chars: options.chars,\n byChar: dicts.byChar,\n byCode: dicts.byCode,\n length: dicts.length,\n first,\n last,\n firstPositive: limits.firstPositive,\n mostPositive: limits.mostPositive,\n firstNegative: limits.firstNegative,\n mostNegative: limits.mostNegative,\n jitterRange,\n paddingDict: paddingRange,\n }\n })\n}\n\n// cache the base62 charSet since it's the default\nlet _base62CharSet: IndexedCharacterSet | null = null\n\nexport function base62CharSet(): IndexedCharacterSet {\n if (_base62CharSet) return _base62CharSet\n // We use Effect.runSync here because base62CharSet is a synchronous API\n // and we know the parameters are valid\n _base62CharSet = Effect.runSync(\n indexCharacterSet({\n // Base62 are all the alphanumeric characters, database and user friendly\n // For shorter strings and more room you could opt for more characters\n chars: \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n // This gives us nice human readable keys to start with a0 a1 etc\n firstPositive: \"a\",\n mostPositive: \"z\",\n mostNegative: \"A\",\n })\n )\n return _base62CharSet\n}\n\n// ============================================================================\n// Padding Functions\n// ============================================================================\n\nexport function makeSameLength(\n a: string,\n b: string,\n pad: \"start\" | \"end\",\n fillChar: string,\n forceLength?: number\n): [string, string] {\n const max = forceLength ?? Math.max(a.length, b.length)\n if (pad === \"start\") {\n return [a.padStart(max, fillChar), b.padStart(max, fillChar)]\n }\n return [a.padEnd(max, fillChar), b.padEnd(max, fillChar)]\n}\n\n// ============================================================================\n// Integer Length Functions\n// ============================================================================\n\nfunction distanceBetween(\n a: string,\n b: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<number, Error> {\n const indexA = charSet.byChar[a]\n const indexB = charSet.byChar[b]\n if (indexA === undefined || indexB === undefined) {\n return Effect.fail(new Error(\"invalid character in distance calculation\"))\n }\n return Effect.succeed(Math.abs(indexA - indexB))\n}\n\nfunction integerLengthFromSecondLevel(\n key: string,\n direction: \"positive\" | \"negative\",\n charSet: IndexedCharacterSet\n): Effect.Effect<number, Error> {\n if (key.length === 0) {\n return Effect.succeed(0)\n }\n const firstChar = key[0]\n if (!firstChar || firstChar > charSet.mostPositive || firstChar < charSet.mostNegative) {\n return Effect.fail(new Error(\"invalid firstChar on key\"))\n }\n if (firstChar === charSet.mostPositive && direction === \"positive\") {\n return Effect.gen(function* () {\n const totalPositiveRoom = yield* distanceBetween(firstChar, charSet.mostNegative, charSet)\n const rest = yield* integerLengthFromSecondLevel(key.slice(1), direction, charSet)\n return totalPositiveRoom + 1 + rest\n })\n }\n if (firstChar === charSet.mostNegative && direction === \"negative\") {\n return Effect.gen(function* () {\n const totalNegativeRoom = yield* distanceBetween(firstChar, charSet.mostPositive, charSet)\n const rest = yield* integerLengthFromSecondLevel(key.slice(1), direction, charSet)\n return totalNegativeRoom + 1 + rest\n })\n }\n if (direction === \"positive\") {\n return Effect.gen(function* () {\n const dist = yield* distanceBetween(firstChar, charSet.mostNegative, charSet)\n return dist + 2\n })\n } else {\n return Effect.gen(function* () {\n const dist = yield* distanceBetween(firstChar, charSet.mostPositive, charSet)\n return dist + 2\n })\n }\n}\n\nexport function integerLength(\n head: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<number, Error> {\n if (head.length === 0) {\n return Effect.fail(new Error(\"head cannot be empty\"))\n }\n const firstChar = head[0]\n if (!firstChar || firstChar > charSet.mostPositive || firstChar < charSet.mostNegative) {\n return Effect.fail(new Error(\"invalid firstChar on key\"))\n }\n if (firstChar === charSet.mostPositive) {\n return Effect.gen(function* () {\n const firstLevel = yield* distanceBetween(firstChar, charSet.firstPositive, charSet)\n const rest = yield* integerLengthFromSecondLevel(head.slice(1), \"positive\", charSet)\n return firstLevel + 1 + rest\n })\n }\n if (firstChar === charSet.mostNegative) {\n return Effect.gen(function* () {\n const firstLevel = yield* distanceBetween(firstChar, charSet.firstNegative, charSet)\n const rest = yield* integerLengthFromSecondLevel(head.slice(1), \"negative\", charSet)\n return firstLevel + 1 + rest\n })\n }\n const isPositiveRange = firstChar >= charSet.firstPositive\n if (isPositiveRange) {\n return Effect.gen(function* () {\n const dist = yield* distanceBetween(firstChar, charSet.firstPositive, charSet)\n return dist + 2\n })\n } else {\n return Effect.gen(function* () {\n const dist = yield* distanceBetween(firstChar, charSet.firstNegative, charSet)\n return dist + 2\n })\n }\n}\n\n// ============================================================================\n// Key as Number Functions\n// ============================================================================\n\nexport function encodeToCharSet(int: number, charSet: IndexedCharacterSet): Effect.Effect<string, Error> {\n if (int === 0) {\n const zero = charSet.byCode[0]\n if (zero === undefined) {\n return Effect.fail(new Error(\"invalid charSet: missing code 0\"))\n }\n return Effect.succeed(zero)\n }\n let res = \"\"\n const max = charSet.length\n while (int > 0) {\n const code = charSet.byCode[int % max]\n if (code === undefined) {\n return Effect.fail(new Error(\"invalid character code in encodeToCharSet\"))\n }\n res = code + res\n int = Math.floor(int / max)\n }\n return Effect.succeed(res)\n}\n\nexport function decodeCharSetToNumber(\n key: string,\n charSet: IndexedCharacterSet\n): number {\n let res = 0\n const length = key.length\n const max = charSet.length\n for (let i = 0; i < length; i++) {\n const char = key[i]\n if (char === undefined) {\n continue\n }\n const charIndex = charSet.byChar[char]\n if (charIndex === undefined) {\n continue\n }\n res += charIndex * Math.pow(max, length - i - 1)\n }\n return res\n}\n\nexport function addCharSetKeys(\n a: string,\n b: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n const base = charSet.length\n const [paddedA, paddedB] = makeSameLength(a, b, \"start\", charSet.first)\n\n const result: string[] = []\n let carry = 0\n\n // Iterate over the digits from right to left\n for (let i = paddedA.length - 1; i >= 0; i--) {\n const charA = paddedA[i]\n const charB = paddedB[i]\n if (!charA || !charB) {\n return Effect.fail(new Error(\"invalid character in addCharSetKeys\"))\n }\n const digitA = charSet.byChar[charA]\n const digitB = charSet.byChar[charB]\n if (digitA === undefined || digitB === undefined) {\n return Effect.fail(new Error(\"invalid character in addCharSetKeys\"))\n }\n const sum = digitA + digitB + carry\n carry = Math.floor(sum / base)\n const remainder = sum % base\n\n const codeChar = charSet.byCode[remainder]\n if (codeChar === undefined) {\n return Effect.fail(new Error(\"invalid character code in addCharSetKeys\"))\n }\n result.unshift(codeChar)\n }\n\n // If there's a carry left, add it to the result\n if (carry > 0) {\n const carryChar = charSet.byCode[carry]\n if (carryChar === undefined) {\n return Effect.fail(new Error(\"invalid carry character code\"))\n }\n result.unshift(carryChar)\n }\n\n return Effect.succeed(result.join(\"\"))\n}\n\nexport function subtractCharSetKeys(\n a: string,\n b: string,\n charSet: IndexedCharacterSet,\n stripLeadingZeros = true\n): Effect.Effect<string, Error> {\n const base = charSet.length\n const [paddedA, paddedB] = makeSameLength(a, b, \"start\", charSet.first)\n\n const result: string[] = []\n let borrow = 0\n\n // Iterate over the digits from right to left\n for (let i = paddedA.length - 1; i >= 0; i--) {\n const charA = paddedA[i]\n const charB = paddedB[i]\n if (!charA || !charB) {\n return Effect.fail(new Error(\"invalid character in subtractCharSetKeys\"))\n }\n let digitA = charSet.byChar[charA]\n const digitBValue = charSet.byChar[charB]\n if (digitA === undefined || digitBValue === undefined) {\n return Effect.fail(new Error(\"invalid character in subtractCharSetKeys\"))\n }\n const digitB = digitBValue + borrow\n\n // Handle borrowing\n if (digitA < digitB) {\n borrow = 1\n digitA += base\n } else {\n borrow = 0\n }\n\n const difference = digitA - digitB\n const codeChar = charSet.byCode[difference]\n if (codeChar === undefined) {\n return Effect.fail(new Error(\"invalid character code in subtractCharSetKeys\"))\n }\n result.unshift(codeChar)\n }\n\n // If there's a borrow left, we have a negative result, which is not supported\n if (borrow > 0) {\n return Effect.fail(\n new Error(\"Subtraction result is negative. Ensure a is greater than or equal to b.\")\n )\n }\n\n // Remove leading zeros\n while (\n stripLeadingZeros &&\n result.length > 1 &&\n result[0] === charSet.first\n ) {\n result.shift()\n }\n\n return Effect.succeed(result.join(\"\"))\n}\n\nexport function incrementKey(key: string, charSet: IndexedCharacterSet): Effect.Effect<string, Error> {\n const one = charSet.byCode[1]\n if (one === undefined) {\n return Effect.fail(new Error(\"invalid charSet: missing code 1\"))\n }\n return addCharSetKeys(key, one, charSet)\n}\n\nexport function decrementKey(key: string, charSet: IndexedCharacterSet): Effect.Effect<string, Error> {\n // we should not strip leading zeros here, this will break the sorting if the key already has leading zeros\n const one = charSet.byCode[1]\n if (one === undefined) {\n return Effect.fail(new Error(\"invalid charSet: missing code 1\"))\n }\n return subtractCharSetKeys(key, one, charSet, false)\n}\n\nexport function lexicalDistance(\n a: string,\n b: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<number, Error> {\n const [lower, upper] = makeSameLength(a, b, \"end\", charSet.first).sort()\n return Effect.gen(function* () {\n const distance = yield* subtractCharSetKeys(upper, lower, charSet)\n return decodeCharSetToNumber(distance, charSet)\n })\n}\n\nexport function midPoint(\n lower: string,\n upper: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n let [paddedLower, paddedUpper] = makeSameLength(\n lower,\n upper,\n \"end\",\n charSet.first\n )\n let distance = yield* lexicalDistance(paddedLower, paddedUpper, charSet)\n if (distance === 1) {\n // if the numbers are consecutive we need more padding\n paddedLower = paddedLower.padEnd(paddedLower.length + 1, charSet.first)\n // the new distance will always be the length of the charSet\n distance = charSet.length\n }\n const mid = yield* encodeToCharSet(Math.floor(distance / 2), charSet)\n return yield* addCharSetKeys(paddedLower, mid, charSet)\n })\n}\n\n// ============================================================================\n// Integer Functions\n// ============================================================================\n\nexport function startKey(charSet: IndexedCharacterSet): string {\n return charSet.firstPositive + charSet.byCode[0]\n}\n\nexport function validInteger(integer: string, charSet: IndexedCharacterSet): Effect.Effect<boolean, Error> {\n return Effect.gen(function* () {\n const length = yield* integerLength(integer, charSet)\n return length === integer.length\n })\n}\n\nexport function validateOrderKey(\n orderKey: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<void, Error> {\n return Effect.gen(function* () {\n yield* getIntegerPart(orderKey, charSet)\n })\n}\n\nexport function getIntegerPart(\n orderKey: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n const head = integerHead(orderKey, charSet)\n const integerPartLength = yield* integerLength(head, charSet)\n if (integerPartLength > orderKey.length) {\n return yield* Effect.fail(new Error(\"invalid order key length: \" + orderKey))\n }\n return orderKey.slice(0, integerPartLength)\n })\n}\n\nfunction validateInteger(integer: string, charSet: IndexedCharacterSet): Effect.Effect<void, Error> {\n return Effect.gen(function* () {\n const isValid = yield* validInteger(integer, charSet)\n if (!isValid) {\n return yield* Effect.fail(new Error(\"invalid integer length: \" + integer))\n }\n })\n}\n\nexport function integerHead(integer: string, charSet: IntegerLimits): string {\n let i = 0\n if (integer[0] === charSet.mostPositive) {\n while (integer[i] === charSet.mostPositive) {\n i = i + 1\n }\n }\n if (integer[0] === charSet.mostNegative) {\n while (integer[i] === charSet.mostNegative) {\n i = i + 1\n }\n }\n return integer.slice(0, i + 1)\n}\n\nexport function splitInteger(\n integer: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<[string, string], Error> {\n return Effect.gen(function* () {\n // We need to get the limits from the charSet\n const head = integerHead(integer, {\n firstPositive: charSet.firstPositive,\n mostPositive: charSet.mostPositive,\n firstNegative: charSet.firstNegative,\n mostNegative: charSet.mostNegative,\n })\n const tail = integer.slice(head.length)\n return [head, tail] as [string, string]\n })\n}\n\nexport function incrementIntegerHead(\n head: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n const inPositiveRange = head >= charSet.firstPositive\n const nextHead = yield* incrementKey(head, charSet)\n const headIsLimitMax = head[head.length - 1] === charSet.mostPositive\n const nextHeadIsLimitMax =\n nextHead[nextHead.length - 1] === charSet.mostPositive\n\n // we can not leave the head on the limit value, we have no way to know where the head ends\n if (inPositiveRange && nextHeadIsLimitMax) {\n return nextHead + charSet.mostNegative\n }\n // we are already at the limit of this level, so we need to go up a level\n if (!inPositiveRange && headIsLimitMax) {\n return head.slice(0, head.length - 1)\n }\n return nextHead\n })\n}\n\nexport function decrementIntegerHead(\n head: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n const inPositiveRange = head >= charSet.firstPositive\n const headIsLimitMin = head[head.length - 1] === charSet.mostNegative\n if (inPositiveRange && headIsLimitMin) {\n const nextLevel = head.slice(0, head.length - 1)\n // we can not leave the head on the limit value, we have no way to know where the head ends\n // so we take one extra step down\n const decremented = yield* decrementKey(nextLevel, charSet)\n return decremented\n }\n\n if (!inPositiveRange && headIsLimitMin) {\n return head + charSet.mostPositive\n }\n\n return yield* decrementKey(head, charSet)\n })\n}\n\nfunction startOnNewHead(\n head: string,\n limit: \"upper\" | \"lower\",\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n const newLength = yield* integerLength(head, charSet)\n const fillCharCode = limit === \"upper\" ? charSet.length - 1 : 0\n const fillChar = charSet.byCode[fillCharCode]\n if (fillChar === undefined) {\n return yield* Effect.fail(new Error(\"invalid fill character code\"))\n }\n return head + fillChar.repeat(newLength - head.length)\n })\n}\n\nexport function incrementInteger(\n integer: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n yield* validateInteger(integer, charSet)\n const [head, digs] = yield* splitInteger(integer, charSet)\n const maxChar = charSet.byCode[charSet.length - 1]\n if (maxChar === undefined) {\n return yield* Effect.fail(new Error(\"invalid charSet: missing max character\"))\n }\n const anyNonMaxedDigit = digs\n .split(\"\")\n .some((d) => d !== maxChar)\n\n // we have room to increment\n if (anyNonMaxedDigit) {\n const newDigits = yield* incrementKey(digs, charSet)\n return head + newDigits\n }\n const nextHead = yield* incrementIntegerHead(head, charSet)\n return yield* startOnNewHead(nextHead, \"lower\", charSet)\n })\n}\n\nexport function decrementInteger(\n integer: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n yield* validateInteger(integer, charSet)\n const [head, digs] = yield* splitInteger(integer, charSet)\n const minChar = charSet.byCode[0]\n if (minChar === undefined) {\n return yield* Effect.fail(new Error(\"invalid charSet: missing min character\"))\n }\n const anyNonLimitDigit = digs.split(\"\").some((d) => d !== minChar)\n\n // we have room to decrement\n if (anyNonLimitDigit) {\n const newDigits = yield* decrementKey(digs, charSet)\n return head + newDigits\n }\n const nextHead = yield* decrementIntegerHead(head, charSet)\n return yield* startOnNewHead(nextHead, \"upper\", charSet)\n })\n}\n\n// ============================================================================\n// Jittering Functions\n// ============================================================================\n\nexport function jitterString(\n orderKey: string,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error, Random.Random> {\n return Effect.gen(function* () {\n const randomValue = yield* Random.next\n const shift = yield* encodeToCharSet(\n Math.floor(randomValue * charSet.jitterRange),\n charSet\n )\n return yield* addCharSetKeys(orderKey, shift, charSet)\n })\n}\n\nexport function padAndJitterString(\n orderKey: string,\n numberOfChars: number,\n charSet: IndexedCharacterSet\n): Effect.Effect<string, Error, Random.Random> {\n return Effect.gen(function* () {\n const paddedKey = orderKey.padEnd(\n orderKey.length + numberOfChars,\n charSet.first\n )\n return yield* jitterString(paddedKey, charSet)\n })\n}\n\nexport function paddingNeededForDistance(\n distance: number,\n charSet: IndexedCharacterSet\n): number {\n const gap = charSet.jitterRange - distance\n const firstBigger = Object.entries(charSet.paddingDict).find(\n ([_key, value]) => {\n return value > gap\n }\n )\n\n return firstBigger ? parseInt(firstBigger[0]) : 0\n}\n\nexport function paddingNeededForJitter(\n orderKey: string,\n b: string | null,\n charSet: IndexedCharacterSet\n): Effect.Effect<number, Error> {\n return Effect.gen(function* () {\n const integer = yield* getIntegerPart(orderKey, charSet)\n const nextInteger = yield* incrementInteger(integer, charSet)\n let needed = 0\n if (b !== null) {\n const distanceToB = yield* lexicalDistance(orderKey, b, charSet)\n if (distanceToB < charSet.jitterRange + 1) {\n needed = Math.max(needed, paddingNeededForDistance(distanceToB, charSet))\n }\n }\n const distanceToNextInteger = yield* lexicalDistance(orderKey, nextInteger, charSet)\n if (distanceToNextInteger < charSet.jitterRange + 1) {\n needed = Math.max(\n needed,\n paddingNeededForDistance(distanceToNextInteger, charSet)\n )\n }\n\n return needed\n })\n}\n\n// ============================================================================\n// Key Generation Functions\n// ============================================================================\n\n/**\n * Generate a key between two other keys.\n * If either lower or upper is null, the key will be generated at the start or end of the list.\n */\nexport function generateKeyBetween(\n lower: string | null,\n upper: string | null,\n charSet: IndexedCharacterSet = base62CharSet()\n): Effect.Effect<string, Error> {\n return Effect.gen(function* () {\n if (lower !== null) {\n yield* validateOrderKey(lower, charSet)\n }\n if (upper !== null) {\n yield* validateOrderKey(upper, charSet)\n }\n if (lower === null && upper === null) {\n return startKey(charSet)\n }\n if (lower === null) {\n const integer = yield* getIntegerPart(upper!, charSet)\n return yield* decrementInteger(integer, charSet)\n }\n if (upper === null) {\n const integer = yield* getIntegerPart(lower, charSet)\n return yield* incrementInteger(integer, charSet)\n }\n if (lower >= upper) {\n return yield* Effect.fail(new Error(lower + \" >= \" + upper))\n }\n return yield* midPoint(lower, upper, charSet)\n })\n}\n\ntype GenerateKeyBetweenFunc = (\n lower: string | null,\n upper: string | null,\n charSet?: IndexedCharacterSet\n) => Effect.Effect<string, Error>\n\ntype GenerateNKeysBetweenFunc = (\n lower: string | null,\n upper: string | null,\n n: number,\n charSet?: IndexedCharacterSet\n) => Effect.Effect<string[], Error>\n\nfunction spreadGeneratorResults(\n lower: string | null,\n upper: string | null,\n n: number,\n charSet: IndexedCharacterSet,\n generateKey: GenerateKeyBetweenFunc,\n generateNKeys: GenerateNKeysBetweenFunc\n): Effect.Effect<string[], Error> {\n if (n === 0) {\n return Effect.succeed([])\n }\n if (n === 1) {\n return generateKey(lower, upper, charSet).pipe(Effect.map((key) => [key]))\n }\n if (upper == null) {\n return Effect.gen(function* () {\n let newUpper = yield* generateKey(lower, upper, charSet)\n const result = [newUpper]\n for (let i = 0; i < n - 1; i++) {\n newUpper = yield* generateKey(newUpper, upper, charSet)\n result.push(newUpper)\n }\n return result\n })\n }\n if (lower == null) {\n return Effect.gen(function* () {\n let newLower = yield* generateKey(lower, upper, charSet)\n const result = [newLower]\n for (let i = 0; i < n - 1; i++) {\n newLower = yield* generateKey(lower, newLower, charSet)\n result.push(newLower)\n }\n result.reverse()\n return result\n })\n }\n return Effect.gen(function* () {\n const mid = Math.floor(n / 2)\n const midOrderKey = yield* generateKey(lower, upper, charSet)\n const leftKeys = yield* generateNKeys(lower, midOrderKey, mid, charSet)\n const rightKeys = yield* generateNKeys(midOrderKey, upper, n - mid - 1, charSet)\n return [...leftKeys, midOrderKey, ...rightKeys]\n })\n}\n\n/**\n * Generate any number of keys between two other keys.\n * If either lower or upper is null, the keys will be generated at the start or end of the list.\n */\nexport function generateNKeysBetween(\n a: string | null,\n b: string | null,\n n: number,\n charSet: IndexedCharacterSet = base62CharSet()\n): Effect.Effect<string[], Error> {\n return spreadGeneratorResults(\n a,\n b,\n n,\n charSet,\n (lower, upper, charSet = base62CharSet()) => generateKeyBetween(lower, upper, charSet),\n (lower, upper, n, charSet = base62CharSet()) => generateNKeysBetween(lower, upper, n, charSet)\n )\n}\n\n/**\n * Generate a key between two other keys with jitter.\n * If either lower or upper is null, the key will be generated at the start or end of the list.\n */\nexport function generateJitteredKeyBetween(\n lower: string | null,\n upper: string | null,\n charSet: IndexedCharacterSet = base62CharSet()\n): Effect.Effect<string, Error, Random.Random> {\n return Effect.gen(function* () {\n const key = yield* generateKeyBetween(lower, upper, charSet)\n const paddingNeeded = yield* paddingNeededForJitter(key, upper, charSet)\n if (paddingNeeded) {\n return yield* padAndJitterString(key, paddingNeeded, charSet)\n }\n return yield* jitterString(key, charSet)\n })\n}\n\n/**\n * Generate any number of keys between two other keys with jitter.\n * If either lower or upper is null, the keys will be generated at the start or end of the list.\n */\nexport function generateNJitteredKeysBetween(\n lower: string | null,\n upper: string | null,\n n: number,\n charSet: IndexedCharacterSet = base62CharSet()\n): Effect.Effect<string[], Error, Random.Random> {\n return Effect.gen(function* () {\n if (n === 0) {\n return []\n }\n if (n === 1) {\n const key = yield* generateJitteredKeyBetween(lower, upper, charSet)\n return [key]\n }\n if (upper == null) {\n let newUpper = yield* generateJitteredKeyBetween(lower, upper, charSet)\n const result = [newUpper]\n for (let i = 0; i < n - 1; i++) {\n newUpper = yield* generateJitteredKeyBetween(newUpper, upper, charSet)\n result.push(newUpper)\n }\n return result\n }\n if (lower == null) {\n let newLower = yield* generateJitteredKeyBetween(lower, upper, charSet)\n const result = [newLower]\n for (let i = 0; i < n - 1; i++) {\n newLower = yield* generateJitteredKeyBetween(lower, newLower, charSet)\n result.push(newLower)\n }\n result.reverse()\n return result\n }\n const mid = Math.floor(n / 2)\n const midOrderKey = yield* generateJitteredKeyBetween(lower, upper, charSet)\n const leftKeys = yield* generateNJitteredKeysBetween(lower, midOrderKey, mid, charSet)\n const rightKeys = yield* generateNJitteredKeysBetween(midOrderKey, upper, n - mid - 1, charSet)\n return [...leftKeys, midOrderKey, ...rightKeys]\n })\n}\n\n// ============================================================================\n// Index Generator Class\n// ============================================================================\n\nexport class IndexGenerator {\n private charSet: IndexedCharacterSet\n private useJitter: boolean\n private list: string[]\n private useGroups: boolean\n private groupIdLength: number\n\n constructor(list: string[], options: GeneratorOptions = {}) {\n this.charSet = options.charSet ?? base62CharSet()\n this.useJitter = options.useJitter ?? true\n this.list = list\n this.useGroups = !!options.groupIdLength && options.groupIdLength > 0\n this.groupIdLength = options.groupIdLength ?? 0\n }\n\n /**\n * Updates the list that the generator uses to generate keys.\n * The generator will not mutate the internal list when generating keys.\n */\n public updateList(list: string[]) {\n this.list = [...list].sort()\n }\n\n /**\n * Generate any number of keys at the start of the list (before the first key).\n * Optionally you can supply a groupId to generate keys at the start of a specific group.\n */\n public nKeysStart(n: number, groupId?: string): Effect.Effect<string[], Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n yield* Effect.try(() => {\n self.validateGroupId(groupId)\n })\n const firstKey = self.firstOfGroup(groupId)\n return yield* self.generateNKeysBetween(null, firstKey, n, groupId)\n })\n }\n\n /**\n * Generate a single key at the start of the list (before the first key).\n * Optionally you can supply a groupId to generate a key at the start of a specific group.\n */\n public keyStart(groupId?: string): Effect.Effect<string, Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n const keys = yield* self.nKeysStart(1, groupId)\n return keys[0]!\n })\n }\n\n /**\n * Generate any number of keys at the end of the list (after the last key).\n * Optionally you can supply a groupId to generate keys at the end of a specific group.\n */\n public nKeysEnd(n: number, groupId?: string): Effect.Effect<string[], Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n yield* Effect.try(() => {\n self.validateGroupId(groupId)\n })\n const lastKey = self.lastOfGroup(groupId)\n return yield* self.generateNKeysBetween(lastKey, null, n, groupId)\n })\n }\n\n /**\n * Generate a single key at the end of the list (after the last key).\n * Optionally you can supply a groupId to generate a key at the end of a specific group.\n */\n public keyEnd(groupId?: string): Effect.Effect<string, Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n const keys = yield* self.nKeysEnd(1, groupId)\n return keys[0]!\n })\n }\n\n /**\n * Generate any number of keys behind a specific key and in front of the next key.\n * GroupId will be inferred from the orderKey if working with groups\n */\n public nKeysAfter(orderKey: string, n: number): Effect.Effect<string[], Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n const keyAfter = yield* self.getKeyAfter(orderKey)\n return yield* self.generateNKeysBetween(orderKey, keyAfter, n, self.groupId(orderKey))\n })\n }\n\n /**\n * Generate a single key behind a specific key and in front of the next key.\n * GroupId will be inferred from the orderKey if working with groups\n */\n public keyAfter(orderKey: string): Effect.Effect<string, Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n const keys = yield* self.nKeysAfter(orderKey, 1)\n return keys[0]!\n })\n }\n\n /**\n * Generate any number of keys in front of a specific key and behind the previous key.\n * GroupId will be inferred from the orderKey if working with groups\n */\n public nKeysBefore(orderKey: string, n: number): Effect.Effect<string[], Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n const keyBefore = yield* self.getKeyBefore(orderKey)\n return yield* self.generateNKeysBetween(keyBefore, orderKey, n, self.groupId(orderKey))\n })\n }\n\n /**\n * Generate a single key in front of a specific key and behind the previous key.\n * GroupId will be inferred from the orderKey if working with groups\n */\n public keyBefore(orderKey: string): Effect.Effect<string, Error, Random.Random> {\n const self = this\n return Effect.gen(function* () {\n const keys = yield* self.nKeysBefore(orderKey, 1)\n return keys[0]!\n })\n }\n\n /**\n * private function responsible for calling the correct generate function\n */\n private generateNKeysBetween(\n lowerKey: string | null,\n upperKey: string | null,\n n: number,\n groupId: string | undefined\n ): Effect.Effect<string[], Error, Random.Random> {\n const self = this\n const lower = self.groupLessKey(lowerKey)\n const upper = self.groupLessKey(upperKey)\n if (self.useJitter) {\n return Effect.gen(function* () {\n const keys = yield* generateNJitteredKeysBetween(lower, upper, n, self.charSet)\n return !groupId ? keys : keys.map((key) => groupId + key)\n })\n } else {\n // When not using jitter, we don't need Random, but TypeScript requires it\n // So we provide a default Random service that won't be used\n return Effect.gen(function* () {\n const keys = yield* generateNKeysBetween(lower, upper, n, self.charSet)\n return !groupId ? keys : keys.map((key) => groupId + key)\n }).pipe(Effect.provideService(Random as any, Random.make(Math.random())))\n }\n }\n\n /**\n * get the key before the supplied orderKey, if it exists and is in the same group\n */\n private getKeyBefore(orderKey: string): Effect.Effect<string | null, Error> {\n const index = this.list.indexOf(orderKey)\n if (index === -1) {\n return Effect.fail(new Error(`orderKey is not in the list`))\n }\n const before = this.list[index - 1]\n return Effect.succeed(!!before && this.isSameGroup(orderKey, before) ? before : null)\n }\n\n /**\n * get the key after the supplied orderKey, if it exists and is in the same group\n */\n private getKeyAfter(orderKey: string): Effect.Effect<string | null, Error> {\n const index = this.list.indexOf(orderKey)\n if (index === -1) {\n return Effect.fail(new Error(`orderKey is not in the list`))\n }\n const after = this.list[index + 1]\n return Effect.succeed(!!after && this.isSameGroup(orderKey, after) ? after : null)\n }\n\n /**\n * get the first key of the group (or the first key of the list if not using groups)\n */\n private firstOfGroup(groupId: string | undefined): string | null {\n if (!this.useGroups) return this.list[0] ?? null\n const first = this.list.find((key) => this.isPartOfGroup(key, groupId))\n return first ?? null\n }\n\n /**\n * get the last key of the group (or the last key of the list if not using groups)\n */\n private lastOfGroup(groupId: string | undefined): string | null {\n if (!this.useGroups) return this.list[this.list.length - 1] ?? null\n const allGroupItems = this.list.filter((key) =>\n this.isPartOfGroup(key, groupId)\n )\n const last = allGroupItems[allGroupItems.length - 1]\n return last ?? null\n }\n\n /**\n * throw an error if the groupId is invalid or supplied when not using groups\n */\n private validateGroupId(groupId: string | undefined): void {\n if (!this.useGroups) {\n if (groupId) {\n console.warn(\"groupId should not used when not using groups\")\n }\n return\n }\n if (!groupId) {\n throw new Error(\"groupId is required when using groups\")\n }\n if (groupId.length !== this.groupIdLength) {\n throw new Error(`groupId must be the lenght supplied in the options`)\n }\n }\n\n /**\n * get the groupId from the orderKey\n */\n private groupId(orderKey: string): string | undefined {\n if (!this.useGroups) return undefined\n return this.splitIntoGroupIdAndOrderKey(orderKey)[0]\n }\n\n /**\n * remove the groupId from the orderKey\n */\n private groupLessKey(orderKey: string | null): string | null {\n if (!this.useGroups) return orderKey\n return this.splitIntoGroupIdAndOrderKey(orderKey)[1]\n }\n\n /**\n * split the orderKey into groupId and key\n * if not using groups, orderKey will be the same as key\n */\n private splitIntoGroupIdAndOrderKey(\n orderKey: string | null\n ): [string | undefined, string | null] {\n if (!this.useGroups || !orderKey) {\n return [undefined, orderKey]\n }\n const groupId = orderKey.substring(0, this.groupIdLength)\n const key = orderKey.substring(this.groupIdLength)\n return [groupId, key]\n }\n\n /**\n * check if two keys are in the same group\n * if not using groups, keys will always be in the same group\n */\n private isSameGroup(a: string, b: string): boolean {\n if (!this.useGroups) return true\n const [aGroupId] = this.splitIntoGroupIdAndOrderKey(a)\n const [bGroupId] = this.splitIntoGroupIdAndOrderKey(b)\n return aGroupId === bGroupId\n }\n\n /**\n * check if the key is part of the group\n * if not using groups, key will always be part of the group\n */\n private isPartOfGroup(orderKey: string, groupId?: string): boolean {\n if (!this.useGroups) return true\n const [keyGroupId] = this.splitIntoGroupIdAndOrderKey(orderKey)\n return keyGroupId === groupId\n }\n}\n","import { Effect, Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport * as FractionalIndex from \"../FractionalIndex\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, AnyPrimitive, Validator, InferState, InferProxy, InferSnapshot } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators } from \"./shared\";\n\n\n/**\n * Entry in an ordered array with ID and fractional position\n */\nexport interface ArrayEntry<T> {\n readonly id: string; // Unique element identifier (UUID)\n readonly pos: string; // Fractional index for ordering\n readonly value: T; // The element value\n}\n\n/**\n * Sort array entries by their fractional position\n */\nconst sortByPos = <T,>(entries: readonly ArrayEntry<T>[]): ArrayEntry<T>[] =>\n [...entries].sort((a, b) => a.pos < b.pos ? -1 : a.pos > b.pos ? 1 : 0);\n\n/**\n * Generate a fractional position between two positions\n */\nconst generatePosBetween = (left: string | null, right: string | null): string => {\n const charSet = FractionalIndex.base62CharSet();\n return Effect.runSync(FractionalIndex.generateKeyBetween(left, right, charSet));\n};\n\n/**\n * Entry in an array snapshot with ID and value snapshot\n */\nexport interface ArrayEntrySnapshot<TElement extends AnyPrimitive> {\n readonly id: string;\n readonly value: InferSnapshot<TElement>;\n}\n\n/**\n * Snapshot type for arrays - always an array (never undefined)\n */\nexport type ArraySnapshot<TElement extends AnyPrimitive> = readonly ArrayEntrySnapshot<TElement>[];\n\nexport interface ArrayProxy<TElement extends AnyPrimitive> {\n /** Gets the current array entries (sorted by position) */\n get(): ArrayState<TElement>;\n /** Replaces the entire array with new values (generates new IDs and positions) */\n set(values: readonly InferState<TElement>[]): void;\n /** Appends a value to the end of the array */\n push(value: InferState<TElement>): void;\n /** Inserts a value at the specified visual index */\n insertAt(index: number, value: InferState<TElement>): void;\n /** Removes the element with the specified ID */\n remove(id: string): void;\n /** Moves an element to a new visual index */\n move(id: string, toIndex: number): void;\n /** Returns a proxy for the element with the specified ID */\n at(id: string): InferProxy<TElement>;\n /** Finds an element by predicate and returns its proxy */\n find(predicate: (value: InferState<TElement>, id: string) => boolean): InferProxy<TElement> | undefined;\n /** Returns a readonly snapshot of the array for rendering (always returns an array, never undefined) */\n toSnapshot(): ArraySnapshot<TElement>;\n}\n\n/** The state type for arrays - an array of entries */\nexport type ArrayState<TElement extends AnyPrimitive> = readonly ArrayEntry<InferState<TElement>>[];\n\ninterface ArrayPrimitiveSchema<TElement extends AnyPrimitive> {\n readonly required: boolean;\n readonly defaultValue: ArrayState<TElement> | undefined;\n readonly element: TElement;\n readonly validators: readonly Validator<ArrayState<TElement>>[];\n}\n\nexport class ArrayPrimitive<TElement extends AnyPrimitive>\n implements Primitive<ArrayState<TElement>, ArrayProxy<TElement>>\n{\n readonly _tag = \"ArrayPrimitive\" as const;\n readonly _State!: ArrayState<TElement>;\n readonly _Proxy!: ArrayProxy<TElement>;\n\n private readonly _schema: ArrayPrimitiveSchema<TElement>;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"array.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n insert: OperationDefinition.make({\n kind: \"array.insert\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n remove: OperationDefinition.make({\n kind: \"array.remove\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n move: OperationDefinition.make({\n kind: \"array.move\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: ArrayPrimitiveSchema<TElement>) {\n this._schema = schema;\n }\n\n /** Mark this array as required */\n required(): ArrayPrimitive<TElement> {\n return new ArrayPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this array */\n default(defaultValue: ArrayState<TElement>): ArrayPrimitive<TElement> {\n return new ArrayPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the element primitive */\n get element(): TElement {\n return this._schema.element;\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: ArrayState<TElement>) => boolean, message: string): ArrayPrimitive<TElement> {\n return new ArrayPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n /** Minimum array length */\n minLength(length: number): ArrayPrimitive<TElement> {\n return this.refine(\n (v) => v.length >= length,\n `Array must have at least ${length} elements`\n );\n }\n\n /** Maximum array length */\n maxLength(length: number): ArrayPrimitive<TElement> {\n return this.refine(\n (v) => v.length <= length,\n `Array must have at most ${length} elements`\n );\n }\n\n readonly _internal: PrimitiveInternal<ArrayState<TElement>, ArrayProxy<TElement>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): ArrayProxy<TElement> => {\n const elementPrimitive = this._schema.element;\n\n // Helper to get current state (sorted)\n const getCurrentState = (): ArrayEntry<InferState<TElement>>[] => {\n const state = env.getState(operationPath) as ArrayState<TElement> | undefined;\n if (!state || !globalThis.Array.isArray(state)) return [];\n return sortByPos(state);\n };\n\n return {\n get: (): ArrayState<TElement> => {\n return getCurrentState();\n },\n\n set: (values: readonly InferState<TElement>[]) => {\n // Generate entries with new IDs and sequential positions\n const entries: ArrayEntry<InferState<TElement>>[] = [];\n let prevPos: string | null = null;\n \n for (const value of values) {\n const id = env.generateId();\n const pos = generatePosBetween(prevPos, null);\n entries.push({ id, pos, value });\n prevPos = pos;\n }\n \n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, entries)\n );\n },\n\n push: (value: InferState<TElement>) => {\n const sorted = getCurrentState();\n const lastPos = sorted.length > 0 ? sorted[sorted.length - 1]!.pos : null;\n const id = env.generateId();\n const pos = generatePosBetween(lastPos, null);\n \n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, { id, pos, value })\n );\n },\n\n insertAt: (index: number, value: InferState<TElement>) => {\n const sorted = getCurrentState();\n const leftPos = index > 0 && sorted[index - 1] ? sorted[index - 1]!.pos : null;\n const rightPos = index < sorted.length && sorted[index] ? sorted[index]!.pos : null;\n \n const id = env.generateId();\n const pos = generatePosBetween(leftPos, rightPos);\n \n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, { id, pos, value })\n );\n },\n\n remove: (id: string) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.remove, { id })\n );\n },\n\n move: (id: string, toIndex: number) => {\n const sorted = getCurrentState();\n // Filter out the element being moved\n const without = sorted.filter(e => e.id !== id);\n \n const clampedIndex = Math.max(0, Math.min(toIndex, without.length));\n const leftPos = clampedIndex > 0 && without[clampedIndex - 1] ? without[clampedIndex - 1]!.pos : null;\n const rightPos = clampedIndex < without.length && without[clampedIndex] ? without[clampedIndex]!.pos : null;\n \n const pos = generatePosBetween(leftPos, rightPos);\n \n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.move, { id, pos })\n );\n },\n\n at: (id: string): InferProxy<TElement> => {\n // Use ID in path for element access\n const elementPath = operationPath.append(id);\n return elementPrimitive._internal.createProxy(env, elementPath) as InferProxy<TElement>;\n },\n\n find: (predicate: (value: InferState<TElement>, id: string) => boolean): InferProxy<TElement> | undefined => {\n const sorted = getCurrentState();\n const found = sorted.find(entry => predicate(entry.value, entry.id));\n if (!found) return undefined;\n \n const elementPath = operationPath.append(found.id);\n return elementPrimitive._internal.createProxy(env, elementPath) as InferProxy<TElement>;\n },\n\n toSnapshot: (): ArraySnapshot<TElement> => {\n const sorted = getCurrentState();\n return sorted.map(entry => {\n const elementPath = operationPath.append(entry.id);\n const elementProxy = elementPrimitive._internal.createProxy(env, elementPath);\n return {\n id: entry.id,\n value: (elementProxy as { toSnapshot(): InferSnapshot<TElement> }).toSnapshot(),\n };\n });\n },\n };\n },\n\n applyOperation: (\n state: ArrayState<TElement> | undefined,\n operation: Operation.Operation<any, any, any>\n ): ArrayState<TElement> => {\n const path = operation.path;\n const tokens = path.toTokens().filter((t: string) => t !== \"\");\n const currentState = state ?? [];\n\n let newState: ArrayState<TElement>;\n\n // If path is empty, this is an array-level operation\n if (tokens.length === 0) {\n switch (operation.kind) {\n case \"array.set\": {\n const payload = operation.payload;\n if (!globalThis.Array.isArray(payload)) {\n throw new ValidationError(`ArrayPrimitive.set requires an array payload`);\n }\n newState = payload as ArrayState<TElement>;\n break;\n }\n case \"array.insert\": {\n const { id, pos, value } = operation.payload as { id: string; pos: string; value: InferState<TElement> };\n newState = [...currentState, { id, pos, value }];\n break;\n }\n case \"array.remove\": {\n const { id } = operation.payload as { id: string };\n newState = currentState.filter(entry => entry.id !== id);\n break;\n }\n case \"array.move\": {\n const { id, pos } = operation.payload as { id: string; pos: string };\n newState = currentState.map(entry => \n entry.id === id ? { ...entry, pos } : entry\n );\n break;\n }\n default:\n throw new ValidationError(`ArrayPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n } else {\n // Otherwise, delegate to the element with the specified ID\n const elementId = tokens[0]!;\n const entryIndex = currentState.findIndex(entry => entry.id === elementId);\n \n if (entryIndex === -1) {\n throw new ValidationError(`Array element not found with ID: ${elementId}`);\n }\n\n const elementPrimitive = this._schema.element;\n const remainingPath = path.shift();\n const elementOperation = {\n ...operation,\n path: remainingPath,\n };\n\n const currentEntry = currentState[entryIndex]!;\n const newValue = elementPrimitive._internal.applyOperation(currentEntry.value, elementOperation);\n\n const mutableState = [...currentState];\n mutableState[entryIndex] = { ...currentEntry, value: newValue };\n newState = mutableState;\n }\n\n // Run validators on the new state\n runValidators(newState, this._schema.validators);\n\n return newState;\n },\n\n getInitialState: (): ArrayState<TElement> | undefined => {\n return this._schema.defaultValue;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n const clientPath = clientOp.path;\n const serverPath = serverOp.path;\n\n // If paths don't overlap at all, no transformation needed\n if (!OperationPath.pathsOverlap(clientPath, serverPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Handle array.remove from server - check if client is operating on removed element\n if (serverOp.kind === \"array.remove\") {\n const removedId = (serverOp.payload as { id: string }).id;\n const clientTokens = clientPath.toTokens().filter((t: string) => t !== \"\");\n const serverTokens = serverPath.toTokens().filter((t: string) => t !== \"\");\n\n // Check if client is operating on the removed element or its children\n if (clientTokens.length > serverTokens.length) {\n const elementId = clientTokens[serverTokens.length];\n if (elementId === removedId) {\n // Client operation targets a removed element - becomes noop\n return { type: \"noop\" };\n }\n }\n }\n\n // Both inserting into same array - no conflict (fractional indexing handles ordering)\n if (serverOp.kind === \"array.insert\" && clientOp.kind === \"array.insert\") {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Both moving elements in same array\n if (serverOp.kind === \"array.move\" && clientOp.kind === \"array.move\") {\n const serverMoveId = (serverOp.payload as { id: string }).id;\n const clientMoveId = (clientOp.payload as { id: string }).id;\n\n if (serverMoveId === clientMoveId) {\n // Client's move supersedes server's move (last-write-wins for position)\n return { type: \"transformed\", operation: clientOp };\n }\n // Different elements - no conflict\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For operations on same exact path: client wins (last-write-wins)\n if (OperationPath.pathsEqual(clientPath, serverPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // If server set entire array and client is operating on an element\n if (serverOp.kind === \"array.set\" && OperationPath.isPrefix(serverPath, clientPath)) {\n // Client's element operation may be invalid after array replacement\n // However, for optimistic updates, we let the client op proceed\n // and the server will validate/reject if needed\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Delegate to element primitive for nested operations\n const clientTokens = clientPath.toTokens().filter((t: string) => t !== \"\");\n const serverTokens = serverPath.toTokens().filter((t: string) => t !== \"\");\n\n // Both operations target children of this array\n if (clientTokens.length > 0 && serverTokens.length > 0) {\n const clientElementId = clientTokens[0];\n const serverElementId = serverTokens[0];\n\n // If operating on different elements, no conflict\n if (clientElementId !== serverElementId) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Same element - delegate to element primitive\n const elementPrimitive = this._schema.element;\n const clientOpForElement = {\n ...clientOp,\n path: clientOp.path.shift(),\n };\n const serverOpForElement = {\n ...serverOp,\n path: serverOp.path.shift(),\n };\n\n const result = elementPrimitive._internal.transformOperation(clientOpForElement, serverOpForElement);\n\n if (result.type === \"transformed\") {\n // Restore the original path prefix\n return {\n type: \"transformed\",\n operation: {\n ...result.operation,\n path: clientOp.path,\n },\n };\n }\n\n return result;\n }\n\n // Default: no transformation needed\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Creates a new ArrayPrimitive with the given element type */\nexport const Array = <TElement extends AnyPrimitive>(element: TElement): ArrayPrimitive<TElement> =>\n new ArrayPrimitive({ required: false, defaultValue: undefined, element, validators: [] });\n\n","import { Effect, Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, AnyPrimitive, InferState, InferProxy, InferSnapshot } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators } from \"./shared\";\n\n\n/**\n * Type to infer state from a lazy thunk\n */\nexport type InferLazyState<T extends () => AnyPrimitive> = InferState<ReturnType<T>>;\n\n/**\n * Type to infer proxy from a lazy thunk\n */\nexport type InferLazyProxy<T extends () => AnyPrimitive> = InferProxy<ReturnType<T>>;\n\n/**\n * Type to infer snapshot from a lazy thunk\n */\nexport type InferLazySnapshot<T extends () => AnyPrimitive> = InferSnapshot<ReturnType<T>>;\n\nexport class LazyPrimitive<TThunk extends () => AnyPrimitive>\n implements Primitive<InferLazyState<TThunk>, InferLazyProxy<TThunk>>\n{\n readonly _tag = \"LazyPrimitive\" as const;\n readonly _State!: InferLazyState<TThunk>;\n readonly _Proxy!: InferLazyProxy<TThunk>;\n\n private readonly _thunk: TThunk;\n private _resolved: ReturnType<TThunk> | undefined;\n\n constructor(thunk: TThunk) {\n this._thunk = thunk;\n }\n\n /** Resolve and cache the lazy primitive */\n private _resolve(): ReturnType<TThunk> {\n if (this._resolved === undefined) {\n this._resolved = this._thunk() as ReturnType<TThunk>;\n }\n return this._resolved;\n }\n\n /** Mark this lazy primitive as required (delegates to resolved) */\n required(): LazyPrimitive<TThunk> {\n // Note: For lazy, we can't easily propagate required to the resolved primitive\n // without resolving it first. This is a limitation.\n return this;\n }\n\n readonly _internal: PrimitiveInternal<InferLazyState<TThunk>, InferLazyProxy<TThunk>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): InferLazyProxy<TThunk> => {\n const resolved = this._resolve();\n return resolved._internal.createProxy(env, operationPath) as InferLazyProxy<TThunk>;\n },\n\n applyOperation: (\n state: InferLazyState<TThunk> | undefined,\n operation: Operation.Operation<any, any, any>\n ): InferLazyState<TThunk> => {\n const resolved = this._resolve();\n return resolved._internal.applyOperation(state, operation) as InferLazyState<TThunk>;\n },\n\n getInitialState: (): InferLazyState<TThunk> | undefined => {\n const resolved = this._resolve();\n return resolved._internal.getInitialState() as InferLazyState<TThunk> | undefined;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n // Delegate to resolved primitive\n const resolved = this._resolve();\n return resolved._internal.transformOperation(clientOp, serverOp);\n },\n };\n}\n\n/** Creates a new LazyPrimitive with the given thunk */\nexport const Lazy = <TThunk extends () => AnyPrimitive>(thunk: TThunk): LazyPrimitive<TThunk> =>\n new LazyPrimitive(thunk);\n\n","import { Effect, Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, AnyPrimitive, InferState, InferProxy, InferSnapshot } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { LiteralPrimitive } from \"./Literal\";\nimport { StructPrimitive } from \"./Struct\";\nimport { runValidators } from \"./shared\";\n\n\n/**\n * Type constraint for union variants - must be struct primitives\n */\nexport type UnionVariants = Record<string, StructPrimitive<any, any>>;\n\n/**\n * Infer the union state type from variants\n */\nexport type InferUnionState<TVariants extends UnionVariants> = {\n [K in keyof TVariants]: InferState<TVariants[K]>;\n}[keyof TVariants];\n\n/**\n * Infer the union snapshot type from variants\n */\nexport type InferUnionSnapshot<TVariants extends UnionVariants> = {\n [K in keyof TVariants]: InferSnapshot<TVariants[K]>;\n}[keyof TVariants];\n\n/**\n * Proxy for accessing union variants\n */\nexport interface UnionProxy<TVariants extends UnionVariants, TDiscriminator extends string, TDefined extends boolean = false> {\n /** Gets the current union value */\n get(): MaybeUndefined<InferUnionState<TVariants>, TDefined>;\n \n /** Sets the entire union value */\n set(value: InferUnionState<TVariants>): void;\n \n /** Access a specific variant's proxy (assumes the variant is active) */\n as<K extends keyof TVariants>(variant: K): InferProxy<TVariants[K]>;\n \n /** Pattern match on the variant type */\n match<R>(handlers: {\n [K in keyof TVariants]: (proxy: InferProxy<TVariants[K]>) => R;\n }): R | undefined;\n \n /** Returns a readonly snapshot of the union for rendering */\n toSnapshot(): MaybeUndefined<InferUnionSnapshot<TVariants>, TDefined>;\n}\n\ninterface UnionPrimitiveSchema<TVariants extends UnionVariants, TDiscriminator extends string> {\n readonly required: boolean;\n readonly defaultValue: InferUnionState<TVariants> | undefined;\n readonly discriminator: TDiscriminator;\n readonly variants: TVariants;\n}\n\nexport class UnionPrimitive<TVariants extends UnionVariants, TDiscriminator extends string = \"type\", TDefined extends boolean = false>\n implements Primitive<InferUnionState<TVariants>, UnionProxy<TVariants, TDiscriminator, TDefined>>\n{\n readonly _tag = \"UnionPrimitive\" as const;\n readonly _State!: InferUnionState<TVariants>;\n readonly _Proxy!: UnionProxy<TVariants, TDiscriminator, TDefined>;\n\n private readonly _schema: UnionPrimitiveSchema<TVariants, TDiscriminator>;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"union.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: UnionPrimitiveSchema<TVariants, TDiscriminator>) {\n this._schema = schema;\n }\n\n /** Mark this union as required */\n required(): UnionPrimitive<TVariants, TDiscriminator, true> {\n return new UnionPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this union */\n default(defaultValue: InferUnionState<TVariants>): UnionPrimitive<TVariants, TDiscriminator, true> {\n return new UnionPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the discriminator field name */\n get discriminator(): TDiscriminator {\n return this._schema.discriminator;\n }\n\n /** Get the variants */\n get variants(): TVariants {\n return this._schema.variants;\n }\n\n /** Find the variant key from a state value */\n private _findVariantKey(state: InferUnionState<TVariants>): keyof TVariants | undefined {\n if (typeof state !== \"object\" || state === null) {\n return undefined;\n }\n const discriminatorValue = (state as Record<string, unknown>)[this._schema.discriminator];\n \n // Find the variant that matches this discriminator value\n for (const key in this._schema.variants) {\n const variant = this._schema.variants[key]!;\n const discriminatorField = variant.fields[this._schema.discriminator];\n if (discriminatorField && discriminatorField._tag === \"LiteralPrimitive\") {\n const literalPrimitive = discriminatorField as LiteralPrimitive<any, any>;\n if (literalPrimitive.literal === discriminatorValue) {\n return key;\n }\n }\n }\n return undefined;\n }\n\n readonly _internal: PrimitiveInternal<InferUnionState<TVariants>, UnionProxy<TVariants, TDiscriminator, TDefined>> = {\n createProxy: (\n env: ProxyEnvironment.ProxyEnvironment,\n operationPath: OperationPath.OperationPath\n ): UnionProxy<TVariants, TDiscriminator, TDefined> => {\n const variants = this._schema.variants;\n const defaultValue = this._schema.defaultValue;\n\n return {\n get: (): MaybeUndefined<InferUnionState<TVariants>, TDefined> => {\n const state = env.getState(operationPath) as InferUnionState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferUnionState<TVariants>, TDefined>;\n },\n set: (value: InferUnionState<TVariants>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n as: <K extends keyof TVariants>(variant: K): InferProxy<TVariants[K]> => {\n const variantPrimitive = variants[variant];\n if (!variantPrimitive) {\n throw new ValidationError(`Unknown variant: ${globalThis.String(variant)}`);\n }\n return variantPrimitive._internal.createProxy(env, operationPath) as InferProxy<TVariants[K]>;\n },\n match: <R,>(handlers: { [K in keyof TVariants]: (proxy: InferProxy<TVariants[K]>) => R }): R | undefined => {\n const state = env.getState(operationPath) as InferUnionState<TVariants> | undefined;\n if (!state) return undefined;\n \n const variantKey = this._findVariantKey(state);\n if (!variantKey) return undefined;\n \n const handler = handlers[variantKey];\n if (!handler) return undefined;\n \n const variantProxy = variants[variantKey]!._internal.createProxy(env, operationPath) as InferProxy<TVariants[typeof variantKey]>;\n return handler(variantProxy);\n },\n toSnapshot: (): MaybeUndefined<InferUnionSnapshot<TVariants>, TDefined> => {\n const state = env.getState(operationPath) as InferUnionState<TVariants> | undefined;\n const effectiveState = state ?? defaultValue;\n if (!effectiveState) {\n return undefined as MaybeUndefined<InferUnionSnapshot<TVariants>, TDefined>;\n }\n \n const variantKey = this._findVariantKey(effectiveState);\n if (!variantKey) {\n return undefined as MaybeUndefined<InferUnionSnapshot<TVariants>, TDefined>;\n }\n \n const variantPrimitive = variants[variantKey]!;\n const variantProxy = variantPrimitive._internal.createProxy(env, operationPath);\n return (variantProxy as unknown as { toSnapshot(): InferUnionSnapshot<TVariants> }).toSnapshot() as MaybeUndefined<InferUnionSnapshot<TVariants>, TDefined>;\n },\n };\n },\n\n applyOperation: (\n state: InferUnionState<TVariants> | undefined,\n operation: Operation.Operation<any, any, any>\n ): InferUnionState<TVariants> => {\n const path = operation.path;\n const tokens = path.toTokens().filter((t: string) => t !== \"\");\n\n // If path is empty, this is a union-level operation\n if (tokens.length === 0) {\n if (operation.kind !== \"union.set\") {\n throw new ValidationError(`UnionPrimitive root cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n if (typeof payload !== \"object\" || payload === null) {\n throw new ValidationError(`UnionPrimitive.set requires an object payload`);\n }\n\n // Validate that the discriminator field exists and matches a variant\n const discriminatorValue = (payload as Record<string, unknown>)[this._schema.discriminator];\n if (discriminatorValue === undefined) {\n throw new ValidationError(`UnionPrimitive.set requires a \"${this._schema.discriminator}\" discriminator field`);\n }\n\n return payload as InferUnionState<TVariants>;\n }\n\n // Otherwise, delegate to the active variant\n // We need to determine which variant is active based on current state\n if (state === undefined) {\n throw new ValidationError(`Cannot apply nested operation to undefined union state`);\n }\n\n const variantKey = this._findVariantKey(state);\n if (variantKey === undefined) {\n throw new ValidationError(`Cannot determine active variant from state`);\n }\n\n const variantPrimitive = this._schema.variants[variantKey]!;\n const newState = variantPrimitive._internal.applyOperation(\n state as InferState<typeof variantPrimitive>,\n operation\n );\n\n return newState as InferUnionState<TVariants>;\n },\n\n getInitialState: (): InferUnionState<TVariants> | undefined => {\n return this._schema.defaultValue;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n const clientPath = clientOp.path;\n const serverPath = serverOp.path;\n\n // If paths don't overlap at all, no transformation needed\n if (!OperationPath.pathsOverlap(clientPath, serverPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n const clientTokens = clientPath.toTokens().filter((t: string) => t !== \"\");\n const serverTokens = serverPath.toTokens().filter((t: string) => t !== \"\");\n\n // If both are at root level (union.set operations)\n if (clientTokens.length === 0 && serverTokens.length === 0) {\n // Client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n }\n\n // If server set entire union and client is updating a field\n if (serverTokens.length === 0 && serverOp.kind === \"union.set\") {\n // Client's field operation proceeds - optimistic update\n // Server will validate/reject if needed\n return { type: \"transformed\", operation: clientOp };\n }\n\n // If client set entire union and server is updating a field\n if (clientTokens.length === 0 && clientOp.kind === \"union.set\") {\n // Client's union.set supersedes server's field update\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Both operations target fields within the union\n // Since union variants are struct primitives, delegate to the first variant\n // that matches (they all should have the same field structure for the overlapping field)\n if (clientTokens.length > 0 && serverTokens.length > 0) {\n const clientField = clientTokens[0];\n const serverField = serverTokens[0];\n\n // Different fields - no conflict\n if (clientField !== serverField) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Same field - delegate to a variant (use first variant as they share structure)\n const variantKeys = Object.keys(this._schema.variants);\n if (variantKeys.length === 0) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n const firstVariant = this._schema.variants[variantKeys[0]!]!;\n const result = firstVariant._internal.transformOperation(clientOp, serverOp);\n\n return result;\n }\n\n // Default: no transformation needed\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Options for creating a Union primitive */\nexport interface UnionOptions<TVariants extends UnionVariants, TDiscriminator extends string> {\n /** The field name used to discriminate between variants (defaults to \"type\") */\n readonly discriminator?: TDiscriminator;\n /** The variant struct primitives */\n readonly variants: TVariants;\n}\n\n/** Creates a new UnionPrimitive with the given variants */\nexport function Union<TVariants extends UnionVariants>(\n options: UnionOptions<TVariants, \"type\">\n): UnionPrimitive<TVariants, \"type\", false>;\nexport function Union<TVariants extends UnionVariants, TDiscriminator extends string>(\n options: UnionOptions<TVariants, TDiscriminator>\n): UnionPrimitive<TVariants, TDiscriminator, false>;\nexport function Union<TVariants extends UnionVariants, TDiscriminator extends string = \"type\">(\n options: UnionOptions<TVariants, TDiscriminator>\n): UnionPrimitive<TVariants, TDiscriminator, false> {\n const discriminator = (options.discriminator ?? \"type\") as TDiscriminator;\n return new UnionPrimitive({\n required: false,\n defaultValue: undefined,\n discriminator,\n variants: options.variants,\n });\n}\n\n","import { Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { Primitive, PrimitiveInternal, MaybeUndefined, InferState } from \"./shared\";\nimport { ValidationError } from \"./shared\";\nimport { StringPrimitive } from \"./String\";\nimport { NumberPrimitive } from \"./Number\";\nimport { BooleanPrimitive } from \"./Boolean\";\nimport { LiteralPrimitive, LiteralValue } from \"./Literal\";\n\n// =============================================================================\n// Either Primitive - Simple Type Union\n// =============================================================================\n\n/**\n * Scalar primitives that can be used as variants in Either\n */\nexport type ScalarPrimitive =\n | StringPrimitive<any>\n | NumberPrimitive<any>\n | BooleanPrimitive<any>\n | LiteralPrimitive<any, any>;\n\n/**\n * Infer the union state type from a tuple of scalar primitives\n */\nexport type InferEitherState<TVariants extends readonly ScalarPrimitive[]> =\n InferState<TVariants[number]>;\n\n/**\n * Infer the union snapshot type from a tuple of scalar primitives\n */\nexport type InferEitherSnapshot<TVariants extends readonly ScalarPrimitive[]> =\n InferState<TVariants[number]>;\n\n/**\n * Match handlers for Either - optional handlers for each scalar type\n */\nexport interface EitherMatchHandlers<R> {\n string?: (value: string) => R;\n number?: (value: number) => R;\n boolean?: (value: boolean) => R;\n literal?: (value: LiteralValue) => R;\n}\n\n/**\n * Proxy for accessing Either values\n */\nexport interface EitherProxy<TVariants extends readonly ScalarPrimitive[], TDefined extends boolean = false> {\n /** Gets the current value */\n get(): MaybeUndefined<InferEitherState<TVariants>, TDefined>;\n\n /** Sets the value to any of the allowed variant types */\n set(value: InferEitherState<TVariants>): void;\n\n /** Pattern match on the value type */\n match<R>(handlers: EitherMatchHandlers<R>): R | undefined;\n\n /** Returns a readonly snapshot of the value for rendering */\n toSnapshot(): MaybeUndefined<InferEitherSnapshot<TVariants>, TDefined>;\n}\n\ninterface EitherPrimitiveSchema<TVariants extends readonly ScalarPrimitive[]> {\n readonly required: boolean;\n readonly defaultValue: InferEitherState<TVariants> | undefined;\n readonly variants: TVariants;\n}\n\nexport class EitherPrimitive<TVariants extends readonly ScalarPrimitive[], TDefined extends boolean = false>\n implements Primitive<InferEitherState<TVariants>, EitherProxy<TVariants, TDefined>>\n{\n readonly _tag = \"EitherPrimitive\" as const;\n readonly _State!: InferEitherState<TVariants>;\n readonly _Proxy!: EitherProxy<TVariants, TDefined>;\n\n private readonly _schema: EitherPrimitiveSchema<TVariants>;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"either.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: EitherPrimitiveSchema<TVariants>) {\n this._schema = schema;\n }\n\n /** Mark this either as required */\n required(): EitherPrimitive<TVariants, true> {\n return new EitherPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this either */\n default(defaultValue: InferEitherState<TVariants>): EitherPrimitive<TVariants, true> {\n return new EitherPrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the variants */\n get variants(): TVariants {\n return this._schema.variants;\n }\n\n /**\n * Determine the type category of a value based on the variants\n */\n private _getValueType(value: unknown): \"string\" | \"number\" | \"boolean\" | \"literal\" | undefined {\n const valueType = typeof value;\n\n // Check for literal matches first (they take priority)\n for (const variant of this._schema.variants) {\n if (variant._tag === \"LiteralPrimitive\") {\n const literalVariant = variant as LiteralPrimitive<any, any>;\n if (value === literalVariant.literal) {\n return \"literal\";\n }\n }\n }\n\n // Check for type matches\n if (valueType === \"string\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"StringPrimitive\") {\n return \"string\";\n }\n }\n }\n\n if (valueType === \"number\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"NumberPrimitive\") {\n return \"number\";\n }\n }\n }\n\n if (valueType === \"boolean\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"BooleanPrimitive\") {\n return \"boolean\";\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Find the matching variant for a value.\n * For literals, matches exact value. For other types, matches by typeof.\n */\n private _findMatchingVariant(value: unknown): ScalarPrimitive | undefined {\n const valueType = typeof value;\n\n // Check for literal matches first (they take priority)\n for (const variant of this._schema.variants) {\n if (variant._tag === \"LiteralPrimitive\") {\n const literalVariant = variant as LiteralPrimitive<any, any>;\n if (value === literalVariant.literal) {\n return variant;\n }\n }\n }\n\n // Check for type matches\n if (valueType === \"string\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"StringPrimitive\") {\n return variant;\n }\n }\n }\n\n if (valueType === \"number\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"NumberPrimitive\") {\n return variant;\n }\n }\n }\n\n if (valueType === \"boolean\") {\n for (const variant of this._schema.variants) {\n if (variant._tag === \"BooleanPrimitive\") {\n return variant;\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Get the operation kind for a variant\n */\n private _getVariantOperationKind(variant: ScalarPrimitive): string {\n switch (variant._tag) {\n case \"StringPrimitive\":\n return \"string.set\";\n case \"NumberPrimitive\":\n return \"number.set\";\n case \"BooleanPrimitive\":\n return \"boolean.set\";\n case \"LiteralPrimitive\":\n return \"literal.set\";\n default:\n return \"unknown.set\";\n }\n }\n\n /**\n * Validate a value against the matching variant, including running its validators.\n * Throws ValidationError if the value doesn't match any variant or fails validation.\n */\n private _validateAndApplyToVariant(value: unknown, path: OperationPath.OperationPath): void {\n const matchingVariant = this._findMatchingVariant(value);\n \n if (!matchingVariant) {\n const allowedTypes = this._schema.variants.map((v) => v._tag).join(\", \");\n throw new ValidationError(\n `EitherPrimitive.set requires a value matching one of: ${allowedTypes}, got: ${typeof value}`\n );\n }\n\n // Create a synthetic operation for the variant's applyOperation\n const variantOpKind = this._getVariantOperationKind(matchingVariant);\n const syntheticOp: Operation.Operation<any, any, any> = {\n kind: variantOpKind,\n path: path,\n payload: value,\n };\n\n // Delegate to the variant's applyOperation which runs its validators\n // This will throw ValidationError if validation fails\n matchingVariant._internal.applyOperation(undefined, syntheticOp);\n }\n\n readonly _internal: PrimitiveInternal<InferEitherState<TVariants>, EitherProxy<TVariants, TDefined>> = {\n createProxy: (\n env: ProxyEnvironment.ProxyEnvironment,\n operationPath: OperationPath.OperationPath\n ): EitherProxy<TVariants, TDefined> => {\n const defaultValue = this._schema.defaultValue;\n\n return {\n get: (): MaybeUndefined<InferEitherState<TVariants>, TDefined> => {\n const state = env.getState(operationPath) as InferEitherState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferEitherState<TVariants>, TDefined>;\n },\n set: (value: InferEitherState<TVariants>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n match: <R,>(handlers: EitherMatchHandlers<R>): R | undefined => {\n const currentState = env.getState(operationPath) as InferEitherState<TVariants> | undefined;\n const effectiveState = currentState ?? defaultValue;\n if (effectiveState === undefined) return undefined;\n\n const valueType = this._getValueType(effectiveState);\n if (!valueType) return undefined;\n\n switch (valueType) {\n case \"string\":\n return handlers.string?.(effectiveState as string);\n case \"number\":\n return handlers.number?.(effectiveState as number);\n case \"boolean\":\n return handlers.boolean?.(effectiveState as boolean);\n case \"literal\":\n return handlers.literal?.(effectiveState as LiteralValue);\n default:\n return undefined;\n }\n },\n toSnapshot: (): MaybeUndefined<InferEitherSnapshot<TVariants>, TDefined> => {\n const state = env.getState(operationPath) as InferEitherState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferEitherSnapshot<TVariants>, TDefined>;\n },\n };\n },\n\n applyOperation: (\n _state: InferEitherState<TVariants> | undefined,\n operation: Operation.Operation<any, any, any>\n ): InferEitherState<TVariants> => {\n if (operation.kind !== \"either.set\") {\n throw new ValidationError(`EitherPrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n\n const payload = operation.payload;\n\n // Validate that the payload matches one of the variant types and passes its validators\n this._validateAndApplyToVariant(payload, operation.path);\n\n return payload as InferEitherState<TVariants>;\n },\n\n getInitialState: (): InferEitherState<TVariants> | undefined => {\n return this._schema.defaultValue;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n // If paths don't overlap, no transformation needed\n if (!OperationPath.pathsOverlap(clientOp.path, serverOp.path)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same path, client wins (last-write-wins)\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/**\n * Creates a new EitherPrimitive with the given scalar variant types.\n * Validators defined on the variants are applied when validating values.\n *\n * @example\n * ```typescript\n * // String or number\n * const value = Either(String(), Number());\n *\n * // String, number, or boolean\n * const status = Either(String(), Number(), Boolean()).default(\"pending\");\n *\n * // With literal types\n * const mode = Either(Literal(\"auto\"), Literal(\"manual\"), Number());\n *\n * // With validators - validates string length and number range\n * const constrained = Either(\n * String().min(2).max(50),\n * Number().max(255)\n * );\n * ```\n */\nexport function Either<TVariants extends readonly ScalarPrimitive[]>(\n ...variants: TVariants\n): EitherPrimitive<TVariants, false> {\n if (variants.length === 0) {\n throw new ValidationError(\"Either requires at least one variant\");\n }\n\n return new EitherPrimitive({\n required: false,\n defaultValue: undefined,\n variants,\n });\n}\n\n","import { Effect, Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport type { AnyPrimitive, InferState } from \"../Primitive\";\nimport { StructPrimitive } from \"./Struct\";\n\n\n/**\n * Any TreeNodePrimitive type - used for generic constraints.\n */\nexport type AnyTreeNodePrimitive = TreeNodePrimitive<string, StructPrimitive<any>, readonly AnyTreeNodePrimitive[] | (() => readonly AnyTreeNodePrimitive[])>;\n\n/**\n * Resolves children type - handles both array and lazy thunk\n */\nexport type ResolveChildren<TChildren extends readonly AnyTreeNodePrimitive[] | (() => readonly AnyTreeNodePrimitive[])> =\n TChildren extends () => readonly AnyTreeNodePrimitive[] ? ReturnType<TChildren> : TChildren;\n\n/**\n * Infer the data state type from a TreeNodePrimitive\n */\nexport type InferTreeNodeDataState<T extends AnyTreeNodePrimitive> = \n T extends TreeNodePrimitive<any, infer TData, any> ? InferState<TData> : never;\n\n/**\n * Infer the type literal from a TreeNodePrimitive\n */\nexport type InferTreeNodeType<T extends AnyTreeNodePrimitive> =\n T extends TreeNodePrimitive<infer TType, any, any> ? TType : never;\n\n/**\n * Infer the allowed children from a TreeNodePrimitive\n */\nexport type InferTreeNodeChildren<T extends AnyTreeNodePrimitive> =\n T extends TreeNodePrimitive<any, any, infer TChildren> ? ResolveChildren<TChildren>[number] : never;\n\n/**\n * Configuration for a TreeNode primitive\n */\nexport interface TreeNodeConfig<\n TData extends StructPrimitive<any>,\n TChildren extends readonly AnyTreeNodePrimitive[] | (() => readonly AnyTreeNodePrimitive[])\n> {\n readonly data: TData;\n readonly children: TChildren;\n}\n\n/**\n * TreeNodePrimitive - defines a node type with its data schema and allowed children\n */\nexport class TreeNodePrimitive<\n TType extends string,\n TData extends StructPrimitive<any>,\n TChildren extends readonly AnyTreeNodePrimitive[] | (() => readonly AnyTreeNodePrimitive[])\n> {\n readonly _tag = \"TreeNodePrimitive\" as const;\n readonly _Type!: TType;\n readonly _Data!: TData;\n readonly _Children!: TChildren;\n\n private readonly _type: TType;\n private readonly _data: TData;\n private readonly _children: TChildren;\n private _resolvedChildren: readonly AnyTreeNodePrimitive[] | undefined;\n\n constructor(type: TType, config: TreeNodeConfig<TData, TChildren>) {\n this._type = type;\n this._data = config.data;\n this._children = config.children;\n }\n\n /** Get the node type identifier */\n get type(): TType {\n return this._type;\n }\n\n /** Get the data primitive */\n get data(): TData {\n return this._data;\n }\n\n /** Get resolved children (resolves lazy thunk if needed) */\n get children(): readonly AnyTreeNodePrimitive[] {\n if (this._resolvedChildren === undefined) {\n if (typeof this._children === \"function\") {\n this._resolvedChildren = (this._children as () => readonly AnyTreeNodePrimitive[])();\n } else {\n this._resolvedChildren = this._children as readonly AnyTreeNodePrimitive[];\n }\n }\n return this._resolvedChildren;\n }\n\n /** Check if a child type is allowed */\n isChildAllowed(childType: string): boolean {\n return this.children.some(child => child.type === childType);\n }\n}\n\n/** Creates a new TreeNodePrimitive with the given type and config */\nexport const TreeNode = <\n TType extends string,\n TData extends StructPrimitive<any>,\n TChildren extends readonly AnyTreeNodePrimitive[] | (() => readonly AnyTreeNodePrimitive[])\n>(\n type: TType,\n config: TreeNodeConfig<TData, TChildren>\n): TreeNodePrimitive<TType, TData, TChildren> =>\n new TreeNodePrimitive(type, config);\n\n","import { Effect, Schema } from \"effect\";\nimport * as OperationDefinition from \"../OperationDefinition\";\nimport * as Operation from \"../Operation\";\nimport * as OperationPath from \"../OperationPath\";\nimport * as ProxyEnvironment from \"../ProxyEnvironment\";\nimport * as Transform from \"../Transform\";\nimport * as FractionalIndex from \"../FractionalIndex\";\nimport type { Primitive, PrimitiveInternal, Validator, InferProxy } from \"./shared\";\nimport { ValidationError } from \"./shared\";\nimport { runValidators } from \"./shared\";\nimport type { AnyTreeNodePrimitive, InferTreeNodeType, InferTreeNodeDataState, InferTreeNodeChildren } from \"./TreeNode\";\nimport { InferStructState } from \"./Struct\";\n\n\n/**\n * A node in the tree state (flat storage format)\n */\nexport interface TreeNodeState {\n readonly id: string; // Unique node identifier (UUID)\n readonly type: string; // Node type discriminator\n readonly parentId: string | null; // Parent node ID (null for root)\n readonly pos: string; // Fractional index for sibling ordering\n readonly data: unknown; // Node-specific data\n}\n\n/**\n * Typed node state for a specific node type\n */\nexport interface TypedTreeNodeState<TNode extends AnyTreeNodePrimitive> {\n readonly id: string;\n readonly type: InferTreeNodeType<TNode>;\n readonly parentId: string | null;\n readonly pos: string;\n readonly data: InferTreeNodeDataState<TNode>;\n}\n\n/**\n * The state type for trees - a flat array of nodes\n */\nexport type TreeState<TRoot extends AnyTreeNodePrimitive> = readonly TreeNodeState[];\n\n/**\n * Helper to get children sorted by position\n */\nconst getOrderedChildren = (\n nodes: readonly TreeNodeState[],\n parentId: string | null\n): TreeNodeState[] => {\n return [...nodes]\n .filter(n => n.parentId === parentId)\n .sort((a, b) => a.pos < b.pos ? -1 : a.pos > b.pos ? 1 : 0);\n};\n\n/**\n * Get all descendant IDs of a node (recursive)\n */\nconst getDescendantIds = (\n nodes: readonly TreeNodeState[],\n nodeId: string\n): string[] => {\n const children = nodes.filter(n => n.parentId === nodeId);\n const descendantIds: string[] = [];\n for (const child of children) {\n descendantIds.push(child.id);\n descendantIds.push(...getDescendantIds(nodes, child.id));\n }\n return descendantIds;\n};\n\n/**\n * Check if moving a node to a new parent would create a cycle\n */\nconst wouldCreateCycle = (\n nodes: readonly TreeNodeState[],\n nodeId: string,\n newParentId: string | null\n): boolean => {\n if (newParentId === null) return false;\n if (newParentId === nodeId) return true;\n \n const descendants = getDescendantIds(nodes, nodeId);\n return descendants.includes(newParentId);\n};\n\n/**\n * Generate a fractional position between two positions\n */\nconst generateTreePosBetween = (left: string | null, right: string | null): string => {\n const charSet = FractionalIndex.base62CharSet();\n return Effect.runSync(FractionalIndex.generateKeyBetween(left, right, charSet));\n};\n\n/**\n * Snapshot of a single node for UI rendering (data properties spread at node level)\n */\nexport type TreeNodeSnapshot<TNode extends AnyTreeNodePrimitive> = {\n readonly id: string;\n readonly type: InferTreeNodeType<TNode>;\n readonly children: TreeNodeSnapshot<InferTreeNodeChildren<TNode>>[];\n} & InferTreeNodeDataState<TNode>;\n\n/**\n * Infer the snapshot type for a tree (recursive tree structure for UI)\n */\nexport type InferTreeSnapshot<T extends TreePrimitive<any>> =\n T extends TreePrimitive<infer TRoot> ? TreeNodeSnapshot<TRoot> : never;\n\n/**\n * Typed proxy for a specific node type - provides type-safe data access\n */\nexport interface TypedNodeProxy<TNode extends AnyTreeNodePrimitive> {\n /** The node ID */\n readonly id: string;\n /** The node type */\n readonly type: InferTreeNodeType<TNode>;\n /** Access the node's data proxy */\n readonly data: InferProxy<TNode[\"data\"]>;\n /** Get the raw node state */\n get(): TypedTreeNodeState<TNode>;\n}\n\n/**\n * Node proxy with type narrowing capabilities\n */\nexport interface TreeNodeProxyBase<TRoot extends AnyTreeNodePrimitive> {\n /** The node ID */\n readonly id: string;\n /** The node type (string) */\n readonly type: string;\n /** Type guard - narrows the proxy to a specific node type */\n is<TNode extends AnyTreeNodePrimitive>(\n nodeType: TNode\n ): this is TypedNodeProxy<TNode>;\n /** Type assertion - returns typed proxy (throws if wrong type) */\n as<TNode extends AnyTreeNodePrimitive>(\n nodeType: TNode\n ): TypedNodeProxy<TNode>;\n /** Get the raw node state */\n get(): TreeNodeState;\n}\n\n/**\n * Proxy for accessing and modifying tree nodes\n */\nexport interface TreeProxy<TRoot extends AnyTreeNodePrimitive> {\n /** Gets the entire tree state (flat array of nodes) */\n get(): TreeState<TRoot>;\n \n /** Replaces the entire tree */\n set(nodes: TreeState<TRoot>): void;\n \n /** Gets the root node state */\n root(): TypedTreeNodeState<TRoot> | undefined;\n \n /** Gets ordered children states of a parent (null for root's children) */\n children(parentId: string | null): TreeNodeState[];\n \n /** Gets a node proxy by ID with type narrowing capabilities */\n node(id: string): TreeNodeProxyBase<TRoot> | undefined;\n \n /** Insert a new node as the first child */\n insertFirst<TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string;\n \n /** Insert a new node as the last child */\n insertLast<TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string;\n \n /** Insert a new node at a specific index among siblings */\n insertAt<TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n index: number,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string;\n \n /** Insert a new node after a sibling */\n insertAfter<TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string;\n \n /** Insert a new node before a sibling */\n insertBefore<TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string;\n \n /** Remove a node and all its descendants */\n remove(id: string): void;\n \n /** Move a node to a new parent at a specific index */\n move(nodeId: string, newParentId: string | null, toIndex: number): void;\n \n /** Move a node after a sibling */\n moveAfter(nodeId: string, siblingId: string): void;\n \n /** Move a node before a sibling */\n moveBefore(nodeId: string, siblingId: string): void;\n \n /** Move a node to be the first child of a parent */\n moveToFirst(nodeId: string, newParentId: string | null): void;\n \n /** Move a node to be the last child of a parent */\n moveToLast(nodeId: string, newParentId: string | null): void;\n \n /** Returns a typed proxy for a specific node's data */\n at<TNode extends AnyTreeNodePrimitive>(\n id: string,\n nodeType: TNode\n ): InferProxy<TNode[\"data\"]>;\n \n /** Convert tree to a nested snapshot for UI rendering */\n toSnapshot(): TreeNodeSnapshot<TRoot> | undefined;\n}\n\ninterface TreePrimitiveSchema<TRoot extends AnyTreeNodePrimitive> {\n readonly required: boolean;\n readonly defaultValue: TreeState<TRoot> | undefined;\n readonly root: TRoot;\n readonly validators: readonly Validator<TreeState<TRoot>>[];\n}\n\nexport class TreePrimitive<TRoot extends AnyTreeNodePrimitive>\n implements Primitive<TreeState<TRoot>, TreeProxy<TRoot>>\n{\n readonly _tag = \"TreePrimitive\" as const;\n readonly _State!: TreeState<TRoot>;\n readonly _Proxy!: TreeProxy<TRoot>;\n\n private readonly _schema: TreePrimitiveSchema<TRoot>;\n private _nodeTypeRegistry: Map<string, AnyTreeNodePrimitive> | undefined;\n\n private readonly _opDefinitions = {\n set: OperationDefinition.make({\n kind: \"tree.set\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n insert: OperationDefinition.make({\n kind: \"tree.insert\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n remove: OperationDefinition.make({\n kind: \"tree.remove\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n move: OperationDefinition.make({\n kind: \"tree.move\" as const,\n payload: Schema.Unknown,\n target: Schema.Unknown,\n apply: (payload) => payload,\n }),\n };\n\n constructor(schema: TreePrimitiveSchema<TRoot>) {\n this._schema = schema;\n }\n\n /** Mark this tree as required */\n required(): TreePrimitive<TRoot> {\n return new TreePrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this tree */\n default(defaultValue: TreeState<TRoot>): TreePrimitive<TRoot> {\n return new TreePrimitive({\n ...this._schema,\n defaultValue,\n });\n }\n\n /** Get the root node type */\n get root(): TRoot {\n return this._schema.root;\n }\n\n /** Add a custom validation rule */\n refine(fn: (value: TreeState<TRoot>) => boolean, message: string): TreePrimitive<TRoot> {\n return new TreePrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n /**\n * Build a registry of all node types reachable from root\n */\n private _buildNodeTypeRegistry(): Map<string, AnyTreeNodePrimitive> {\n if (this._nodeTypeRegistry !== undefined) {\n return this._nodeTypeRegistry;\n }\n\n const registry = new Map<string, AnyTreeNodePrimitive>();\n const visited = new Set<string>();\n\n const visit = (node: AnyTreeNodePrimitive) => {\n if (visited.has(node.type)) return;\n visited.add(node.type);\n registry.set(node.type, node);\n\n for (const child of node.children) {\n visit(child);\n }\n };\n\n visit(this._schema.root);\n this._nodeTypeRegistry = registry;\n return registry;\n }\n\n /**\n * Get a node type primitive by its type string\n */\n private _getNodeTypePrimitive(type: string): AnyTreeNodePrimitive {\n const registry = this._buildNodeTypeRegistry();\n const nodeType = registry.get(type);\n if (!nodeType) {\n throw new ValidationError(`Unknown node type: ${type}`);\n }\n return nodeType;\n }\n\n /**\n * Validate that a node type can be a child of a parent node type\n */\n private _validateChildType(\n parentType: string | null,\n childType: string\n ): void {\n if (parentType === null) {\n // Root level - child must be the root type\n if (childType !== this._schema.root.type) {\n throw new ValidationError(\n `Root node must be of type \"${this._schema.root.type}\", got \"${childType}\"`\n );\n }\n return;\n }\n\n const parentNodePrimitive = this._getNodeTypePrimitive(parentType);\n if (!parentNodePrimitive.isChildAllowed(childType)) {\n const allowedTypes = parentNodePrimitive.children.map(c => c.type).join(\", \");\n throw new ValidationError(\n `Node type \"${childType}\" is not allowed as a child of \"${parentType}\". ` +\n `Allowed types: ${allowedTypes || \"none\"}`\n );\n }\n }\n\n readonly _internal: PrimitiveInternal<TreeState<TRoot>, TreeProxy<TRoot>> = {\n createProxy: (\n env: ProxyEnvironment.ProxyEnvironment,\n operationPath: OperationPath.OperationPath\n ): TreeProxy<TRoot> => {\n // Helper to get current state\n const getCurrentState = (): TreeState<TRoot> => {\n const state = env.getState(operationPath) as TreeState<TRoot> | undefined;\n return state ?? [];\n };\n\n // Helper to get parent type from state\n const getParentType = (parentId: string | null): string | null => {\n if (parentId === null) return null;\n const state = getCurrentState();\n const parent = state.find(n => n.id === parentId);\n return parent?.type ?? null;\n };\n\n // Helper to create a node proxy with type narrowing\n const createNodeProxy = (nodeState: TreeNodeState): TreeNodeProxyBase<TRoot> => {\n return {\n id: nodeState.id,\n type: nodeState.type,\n \n is: <TNode extends AnyTreeNodePrimitive>(\n nodeType: TNode\n ): boolean => {\n return nodeState.type === nodeType.type;\n },\n \n as: <TNode extends AnyTreeNodePrimitive>(\n nodeType: TNode\n ): TypedNodeProxy<TNode> => {\n if (nodeState.type !== nodeType.type) {\n throw new ValidationError(\n `Node is of type \"${nodeState.type}\", not \"${nodeType.type}\"`\n );\n }\n const nodePath = operationPath.append(nodeState.id);\n return {\n id: nodeState.id,\n type: nodeType.type as InferTreeNodeType<TNode>,\n data: nodeType.data._internal.createProxy(env, nodePath) as InferProxy<TNode[\"data\"]>,\n get: () => nodeState as TypedTreeNodeState<TNode>,\n };\n },\n \n get: () => nodeState,\n } as TreeNodeProxyBase<TRoot>;\n };\n\n // Helper to build recursive snapshot\n const buildSnapshot = (\n nodeId: string,\n nodes: readonly TreeNodeState[]\n ): TreeNodeSnapshot<TRoot> | undefined => {\n const node = nodes.find(n => n.id === nodeId);\n if (!node) return undefined;\n\n const childNodes = getOrderedChildren(nodes, nodeId);\n const children: TreeNodeSnapshot<any>[] = [];\n for (const child of childNodes) {\n const childSnapshot = buildSnapshot(child.id, nodes);\n if (childSnapshot) {\n children.push(childSnapshot);\n }\n }\n\n // Spread data properties at node level\n return {\n id: node.id,\n type: node.type,\n ...(node.data as object),\n children,\n } as unknown as TreeNodeSnapshot<TRoot>;\n };\n\n return {\n get: (): TreeState<TRoot> => {\n return getCurrentState();\n },\n\n set: (nodes: TreeState<TRoot>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, nodes)\n );\n },\n\n root: (): TypedTreeNodeState<TRoot> | undefined => {\n const state = getCurrentState();\n const rootNode = state.find(n => n.parentId === null);\n return rootNode as TypedTreeNodeState<TRoot> | undefined;\n },\n\n children: (parentId: string | null): TreeNodeState[] => {\n const state = getCurrentState();\n return getOrderedChildren(state, parentId);\n },\n\n node: (id: string): TreeNodeProxyBase<TRoot> | undefined => {\n const state = getCurrentState();\n const nodeState = state.find(n => n.id === id);\n if (!nodeState) return undefined;\n return createNodeProxy(nodeState);\n },\n\n insertFirst: <TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string => {\n const state = getCurrentState();\n const siblings = getOrderedChildren(state, parentId);\n const firstPos = siblings.length > 0 ? siblings[0]!.pos : null;\n const pos = generateTreePosBetween(null, firstPos);\n const id = env.generateId();\n\n // Validate parent exists (if not root)\n if (parentId !== null && !state.find(n => n.id === parentId)) {\n throw new ValidationError(`Parent node not found: ${parentId}`);\n }\n\n // Validate child type is allowed\n const parentType = getParentType(parentId);\n this._validateChildType(parentType, nodeType.type);\n\n // Validate single root\n if (parentId === null && state.some(n => n.parentId === null)) {\n throw new ValidationError(\"Tree already has a root node\");\n }\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data,\n })\n );\n\n return id;\n },\n\n insertLast: <TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string => {\n const state = getCurrentState();\n const siblings = getOrderedChildren(state, parentId);\n const lastPos = siblings.length > 0 ? siblings[siblings.length - 1]!.pos : null;\n const pos = generateTreePosBetween(lastPos, null);\n const id = env.generateId();\n\n // Validate parent exists (if not root)\n if (parentId !== null && !state.find(n => n.id === parentId)) {\n throw new ValidationError(`Parent node not found: ${parentId}`);\n }\n\n // Validate child type is allowed\n const parentType = getParentType(parentId);\n this._validateChildType(parentType, nodeType.type);\n\n // Validate single root\n if (parentId === null && state.some(n => n.parentId === null)) {\n throw new ValidationError(\"Tree already has a root node\");\n }\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data,\n })\n );\n\n return id;\n },\n\n insertAt: <TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n index: number,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string => {\n const state = getCurrentState();\n const siblings = getOrderedChildren(state, parentId);\n const clampedIndex = Math.max(0, Math.min(index, siblings.length));\n const leftPos = clampedIndex > 0 && siblings[clampedIndex - 1] ? siblings[clampedIndex - 1]!.pos : null;\n const rightPos = clampedIndex < siblings.length && siblings[clampedIndex] ? siblings[clampedIndex]!.pos : null;\n const pos = generateTreePosBetween(leftPos, rightPos);\n const id = env.generateId();\n\n // Validate parent exists (if not root)\n if (parentId !== null && !state.find(n => n.id === parentId)) {\n throw new ValidationError(`Parent node not found: ${parentId}`);\n }\n\n // Validate child type is allowed\n const parentType = getParentType(parentId);\n this._validateChildType(parentType, nodeType.type);\n\n // Validate single root\n if (parentId === null && state.some(n => n.parentId === null)) {\n throw new ValidationError(\"Tree already has a root node\");\n }\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data,\n })\n );\n\n return id;\n },\n\n insertAfter: <TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string => {\n const state = getCurrentState();\n const sibling = state.find(n => n.id === siblingId);\n if (!sibling) {\n throw new ValidationError(`Sibling node not found: ${siblingId}`);\n }\n\n const parentId = sibling.parentId;\n const siblings = getOrderedChildren(state, parentId);\n const siblingIndex = siblings.findIndex(n => n.id === siblingId);\n const nextSibling = siblings[siblingIndex + 1];\n const pos = generateTreePosBetween(sibling.pos, nextSibling?.pos ?? null);\n const id = env.generateId();\n\n // Validate child type is allowed\n const parentType = getParentType(parentId);\n this._validateChildType(parentType, nodeType.type);\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data,\n })\n );\n\n return id;\n },\n\n insertBefore: <TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: InferTreeNodeDataState<TNode>\n ): string => {\n const state = getCurrentState();\n const sibling = state.find(n => n.id === siblingId);\n if (!sibling) {\n throw new ValidationError(`Sibling node not found: ${siblingId}`);\n }\n\n const parentId = sibling.parentId;\n const siblings = getOrderedChildren(state, parentId);\n const siblingIndex = siblings.findIndex(n => n.id === siblingId);\n const prevSibling = siblings[siblingIndex - 1];\n const pos = generateTreePosBetween(prevSibling?.pos ?? null, sibling.pos);\n const id = env.generateId();\n\n // Validate child type is allowed\n const parentType = getParentType(parentId);\n this._validateChildType(parentType, nodeType.type);\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data,\n })\n );\n\n return id;\n },\n\n remove: (id: string) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.remove, { id })\n );\n },\n\n move: (nodeId: string, newParentId: string | null, toIndex: number) => {\n const state = getCurrentState();\n const node = state.find(n => n.id === nodeId);\n if (!node) {\n throw new ValidationError(`Node not found: ${nodeId}`);\n }\n\n // Validate parent exists (if not moving to root)\n if (newParentId !== null && !state.find(n => n.id === newParentId)) {\n throw new ValidationError(`Parent node not found: ${newParentId}`);\n }\n\n // Validate no cycle\n if (wouldCreateCycle(state, nodeId, newParentId)) {\n throw new ValidationError(\"Move would create a cycle in the tree\");\n }\n\n // Validate child type is allowed in new parent\n const newParentType = newParentId === null ? null : state.find(n => n.id === newParentId)?.type ?? null;\n this._validateChildType(newParentType, node.type);\n\n // Validate not moving root to a parent\n if (node.parentId === null && newParentId !== null) {\n throw new ValidationError(\"Cannot move root node to have a parent\");\n }\n\n // Calculate new position among new siblings (excluding self)\n const siblings = getOrderedChildren(state, newParentId).filter(n => n.id !== nodeId);\n const clampedIndex = Math.max(0, Math.min(toIndex, siblings.length));\n const leftPos = clampedIndex > 0 && siblings[clampedIndex - 1] ? siblings[clampedIndex - 1]!.pos : null;\n const rightPos = clampedIndex < siblings.length && siblings[clampedIndex] ? siblings[clampedIndex]!.pos : null;\n const pos = generateTreePosBetween(leftPos, rightPos);\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.move, {\n id: nodeId,\n parentId: newParentId,\n pos,\n })\n );\n },\n\n moveAfter: (nodeId: string, siblingId: string) => {\n const state = getCurrentState();\n const node = state.find(n => n.id === nodeId);\n const sibling = state.find(n => n.id === siblingId);\n \n if (!node) {\n throw new ValidationError(`Node not found: ${nodeId}`);\n }\n if (!sibling) {\n throw new ValidationError(`Sibling node not found: ${siblingId}`);\n }\n\n const newParentId = sibling.parentId;\n\n // Validate no cycle\n if (wouldCreateCycle(state, nodeId, newParentId)) {\n throw new ValidationError(\"Move would create a cycle in the tree\");\n }\n\n // Validate child type is allowed in new parent\n const newParentType = newParentId === null ? null : state.find(n => n.id === newParentId)?.type ?? null;\n this._validateChildType(newParentType, node.type);\n\n // Validate not moving root to a parent\n if (node.parentId === null && newParentId !== null) {\n throw new ValidationError(\"Cannot move root node to have a parent\");\n }\n\n const siblings = getOrderedChildren(state, newParentId).filter(n => n.id !== nodeId);\n const siblingIndex = siblings.findIndex(n => n.id === siblingId);\n const nextSibling = siblings[siblingIndex + 1];\n const pos = generateTreePosBetween(sibling.pos, nextSibling?.pos ?? null);\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.move, {\n id: nodeId,\n parentId: newParentId,\n pos,\n })\n );\n },\n\n moveBefore: (nodeId: string, siblingId: string) => {\n const state = getCurrentState();\n const node = state.find(n => n.id === nodeId);\n const sibling = state.find(n => n.id === siblingId);\n \n if (!node) {\n throw new ValidationError(`Node not found: ${nodeId}`);\n }\n if (!sibling) {\n throw new ValidationError(`Sibling node not found: ${siblingId}`);\n }\n\n const newParentId = sibling.parentId;\n\n // Validate no cycle\n if (wouldCreateCycle(state, nodeId, newParentId)) {\n throw new ValidationError(\"Move would create a cycle in the tree\");\n }\n\n // Validate child type is allowed in new parent\n const newParentType = newParentId === null ? null : state.find(n => n.id === newParentId)?.type ?? null;\n this._validateChildType(newParentType, node.type);\n\n // Validate not moving root to a parent\n if (node.parentId === null && newParentId !== null) {\n throw new ValidationError(\"Cannot move root node to have a parent\");\n }\n\n const siblings = getOrderedChildren(state, newParentId).filter(n => n.id !== nodeId);\n const siblingIndex = siblings.findIndex(n => n.id === siblingId);\n const prevSibling = siblings[siblingIndex - 1];\n const pos = generateTreePosBetween(prevSibling?.pos ?? null, sibling.pos);\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.move, {\n id: nodeId,\n parentId: newParentId,\n pos,\n })\n );\n },\n\n moveToFirst: (nodeId: string, newParentId: string | null) => {\n const state = getCurrentState();\n const node = state.find(n => n.id === nodeId);\n \n if (!node) {\n throw new ValidationError(`Node not found: ${nodeId}`);\n }\n\n // Validate parent exists (if not moving to root)\n if (newParentId !== null && !state.find(n => n.id === newParentId)) {\n throw new ValidationError(`Parent node not found: ${newParentId}`);\n }\n\n // Validate no cycle\n if (wouldCreateCycle(state, nodeId, newParentId)) {\n throw new ValidationError(\"Move would create a cycle in the tree\");\n }\n\n // Validate child type is allowed in new parent\n const newParentType = newParentId === null ? null : state.find(n => n.id === newParentId)?.type ?? null;\n this._validateChildType(newParentType, node.type);\n\n // Validate not moving root to a parent\n if (node.parentId === null && newParentId !== null) {\n throw new ValidationError(\"Cannot move root node to have a parent\");\n }\n\n const siblings = getOrderedChildren(state, newParentId).filter(n => n.id !== nodeId);\n const firstPos = siblings.length > 0 ? siblings[0]!.pos : null;\n const pos = generateTreePosBetween(null, firstPos);\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.move, {\n id: nodeId,\n parentId: newParentId,\n pos,\n })\n );\n },\n\n moveToLast: (nodeId: string, newParentId: string | null) => {\n const state = getCurrentState();\n const node = state.find(n => n.id === nodeId);\n \n if (!node) {\n throw new ValidationError(`Node not found: ${nodeId}`);\n }\n\n // Validate parent exists (if not moving to root)\n if (newParentId !== null && !state.find(n => n.id === newParentId)) {\n throw new ValidationError(`Parent node not found: ${newParentId}`);\n }\n\n // Validate no cycle\n if (wouldCreateCycle(state, nodeId, newParentId)) {\n throw new ValidationError(\"Move would create a cycle in the tree\");\n }\n\n // Validate child type is allowed in new parent\n const newParentType = newParentId === null ? null : state.find(n => n.id === newParentId)?.type ?? null;\n this._validateChildType(newParentType, node.type);\n\n // Validate not moving root to a parent\n if (node.parentId === null && newParentId !== null) {\n throw new ValidationError(\"Cannot move root node to have a parent\");\n }\n\n const siblings = getOrderedChildren(state, newParentId).filter(n => n.id !== nodeId);\n const lastPos = siblings.length > 0 ? siblings[siblings.length - 1]!.pos : null;\n const pos = generateTreePosBetween(lastPos, null);\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.move, {\n id: nodeId,\n parentId: newParentId,\n pos,\n })\n );\n },\n\n at: <TNode extends AnyTreeNodePrimitive>(\n id: string,\n nodeType: TNode\n ): InferProxy<TNode[\"data\"]> => {\n // Get the node to verify its type\n const state = getCurrentState();\n const node = state.find(n => n.id === id);\n if (!node) {\n throw new ValidationError(`Node not found: ${id}`);\n }\n if (node.type !== nodeType.type) {\n throw new ValidationError(\n `Node is of type \"${node.type}\", not \"${nodeType.type}\"`\n );\n }\n\n const nodePath = operationPath.append(id);\n return nodeType.data._internal.createProxy(env, nodePath) as InferProxy<TNode[\"data\"]>;\n },\n\n toSnapshot: (): TreeNodeSnapshot<TRoot> | undefined => {\n const state = getCurrentState();\n const rootNode = state.find(n => n.parentId === null);\n if (!rootNode) return undefined;\n return buildSnapshot(rootNode.id, state);\n },\n };\n },\n\n applyOperation: (\n state: TreeState<TRoot> | undefined,\n operation: Operation.Operation<any, any, any>\n ): TreeState<TRoot> => {\n const path = operation.path;\n const tokens = path.toTokens().filter((t: string) => t !== \"\");\n const currentState = state ?? [];\n\n let newState: TreeState<TRoot>;\n\n // If path is empty, this is a tree-level operation\n if (tokens.length === 0) {\n switch (operation.kind) {\n case \"tree.set\": {\n const payload = operation.payload;\n if (!globalThis.Array.isArray(payload)) {\n throw new ValidationError(`TreePrimitive.set requires an array payload`);\n }\n newState = payload as TreeState<TRoot>;\n break;\n }\n case \"tree.insert\": {\n const { id, type, parentId, pos, data } = operation.payload as {\n id: string;\n type: string;\n parentId: string | null;\n pos: string;\n data: unknown;\n };\n newState = [...currentState, { id, type, parentId, pos, data }] as TreeState<TRoot>;\n break;\n }\n case \"tree.remove\": {\n const { id } = operation.payload as { id: string };\n // Get all descendants to remove\n const descendantIds = getDescendantIds(currentState, id);\n const idsToRemove = new Set([id, ...descendantIds]);\n newState = currentState.filter(node => !idsToRemove.has(node.id));\n break;\n }\n case \"tree.move\": {\n const { id, parentId, pos } = operation.payload as {\n id: string;\n parentId: string | null;\n pos: string;\n };\n newState = currentState.map(node =>\n node.id === id ? { ...node, parentId, pos } : node\n ) as TreeState<TRoot>;\n break;\n }\n default:\n throw new ValidationError(`TreePrimitive cannot apply operation of kind: ${operation.kind}`);\n }\n } else {\n // Otherwise, delegate to the node's data primitive\n const nodeId = tokens[0]!;\n const nodeIndex = currentState.findIndex(node => node.id === nodeId);\n \n if (nodeIndex === -1) {\n throw new ValidationError(`Tree node not found with ID: ${nodeId}`);\n }\n\n const node = currentState[nodeIndex]!;\n const nodeTypePrimitive = this._getNodeTypePrimitive(node.type);\n const remainingPath = path.shift();\n const nodeOperation = {\n ...operation,\n path: remainingPath,\n };\n\n const newData = nodeTypePrimitive.data._internal.applyOperation(\n node.data as InferStructState<any> | undefined,\n nodeOperation\n );\n\n const mutableState = [...currentState];\n mutableState[nodeIndex] = { ...node, data: newData };\n newState = mutableState as TreeState<TRoot>;\n }\n\n // Run validators on the new state\n runValidators(newState, this._schema.validators);\n\n return newState;\n },\n\n getInitialState: (): TreeState<TRoot> | undefined => {\n if (this._schema.defaultValue !== undefined) {\n return this._schema.defaultValue;\n }\n\n // Automatically create a root node with default data\n const rootNodeType = this._schema.root;\n const rootData = rootNodeType.data._internal.getInitialState() ?? {};\n const rootId = crypto.randomUUID();\n const rootPos = generateTreePosBetween(null, null);\n\n return [{\n id: rootId,\n type: rootNodeType.type,\n parentId: null,\n pos: rootPos,\n data: rootData,\n }] as TreeState<TRoot>;\n },\n\n transformOperation: (\n clientOp: Operation.Operation<any, any, any>,\n serverOp: Operation.Operation<any, any, any>\n ): Transform.TransformResult => {\n const clientPath = clientOp.path;\n const serverPath = serverOp.path;\n\n // If paths don't overlap at all, no transformation needed\n if (!OperationPath.pathsOverlap(clientPath, serverPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Handle tree.remove from server - check if client is operating on removed node or descendants\n if (serverOp.kind === \"tree.remove\") {\n const removedId = (serverOp.payload as { id: string }).id;\n const clientTokens = clientPath.toTokens().filter((t: string) => t !== \"\");\n const serverTokens = serverPath.toTokens().filter((t: string) => t !== \"\");\n\n // Check if client operation targets the removed node or uses it\n if (clientOp.kind === \"tree.move\") {\n const movePayload = clientOp.payload as { id: string; parentId: string | null };\n // If moving the removed node or moving to a removed parent\n if (movePayload.id === removedId || movePayload.parentId === removedId) {\n return { type: \"noop\" };\n }\n }\n\n if (clientOp.kind === \"tree.insert\") {\n const insertPayload = clientOp.payload as { parentId: string | null };\n // If inserting into a removed parent\n if (insertPayload.parentId === removedId) {\n return { type: \"noop\" };\n }\n }\n\n // Check if client is operating on a node that was removed\n if (clientTokens.length > serverTokens.length) {\n const nodeId = clientTokens[serverTokens.length];\n if (nodeId === removedId) {\n return { type: \"noop\" };\n }\n }\n }\n\n // Both inserting - no conflict (fractional indexing handles order)\n if (serverOp.kind === \"tree.insert\" && clientOp.kind === \"tree.insert\") {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Both moving same node - client wins\n if (serverOp.kind === \"tree.move\" && clientOp.kind === \"tree.move\") {\n const serverMoveId = (serverOp.payload as { id: string }).id;\n const clientMoveId = (clientOp.payload as { id: string }).id;\n\n if (serverMoveId === clientMoveId) {\n return { type: \"transformed\", operation: clientOp };\n }\n // Different nodes - no conflict\n return { type: \"transformed\", operation: clientOp };\n }\n\n // For same exact path: client wins (last-write-wins)\n if (OperationPath.pathsEqual(clientPath, serverPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // If server set entire tree and client is operating on a node\n if (serverOp.kind === \"tree.set\" && OperationPath.isPrefix(serverPath, clientPath)) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Delegate to node data primitive for nested operations\n const clientTokens = clientPath.toTokens().filter((t: string) => t !== \"\");\n const serverTokens = serverPath.toTokens().filter((t: string) => t !== \"\");\n\n // Both operations target children of this tree\n if (clientTokens.length > 0 && serverTokens.length > 0) {\n const clientNodeId = clientTokens[0];\n const serverNodeId = serverTokens[0];\n\n // If operating on different nodes, no conflict\n if (clientNodeId !== serverNodeId) {\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Same node - would need to delegate to node's data primitive\n // For simplicity, let client win\n return { type: \"transformed\", operation: clientOp };\n }\n\n // Default: no transformation needed\n return { type: \"transformed\", operation: clientOp };\n },\n };\n}\n\n/** Options for creating a Tree primitive */\nexport interface TreeOptions<TRoot extends AnyTreeNodePrimitive> {\n /** The root node type */\n readonly root: TRoot;\n}\n\n/** Creates a new TreePrimitive with the given root node type */\nexport const Tree = <TRoot extends AnyTreeNodePrimitive>(\n options: TreeOptions<TRoot>\n): TreePrimitive<TRoot> =>\n new TreePrimitive({\n required: false,\n defaultValue: undefined,\n root: options.root,\n validators: [],\n });\n","\n// =============================================================================\n// Re-export all primitives from separate files\n// =============================================================================\n\nexport * from \"./primitives/shared\";\n\n// String Primitive\nexport * from \"./primitives/String\";\n// Struct Primitive\nexport * from \"./primitives/Struct\";\n\n// Boolean Primitive\nexport * from \"./primitives/Boolean\";\n\n// Number Primitive\nexport * from \"./primitives/Number\";\n// Literal Primitive\nexport * from \"./primitives/Literal\";\n\n// Array Primitive\nexport * from \"./primitives/Array\";\n// Lazy Primitive\nexport * from \"./primitives/Lazy\";\n\n// Union Primitive\nexport * from \"./primitives/Union\";\n\n// Either Primitive\nexport * from \"./primitives/Either\";\n\n// TreeNode Primitive\nexport * from \"./primitives/TreeNode\";\n// Tree Primitive\nexport * from \"./primitives/Tree\";","import * as Operation from \"./Operation\";\nimport * as OperationPath from \"./OperationPath\";\n\nexport type ProxyEnvironment = {\n /** Adds an operation to be collected/applied */\n readonly addOperation: (operation: Operation.Operation<any, any, any>) => void;\n /** Gets the current state at the given path */\n readonly getState: (path: OperationPath.OperationPath) => unknown;\n /** Generates a unique ID (UUID) for array elements */\n readonly generateId: () => string;\n};\n\nexport interface ProxyEnvironmentOptions {\n /** Callback when an operation is added */\n readonly onOperation: (operation: Operation.Operation<any, any, any>) => void;\n /** Function to retrieve current state at a path (defaults to returning undefined) */\n readonly getState?: (path: OperationPath.OperationPath) => unknown;\n /** Optional: Custom ID generator (defaults to crypto.randomUUID) */\n readonly generateId?: () => string;\n}\n\n/** Default UUID generator using crypto.randomUUID */\nconst defaultGenerateId = (): string => {\n return crypto.randomUUID();\n};\n\n/** Default state getter that always returns undefined */\nconst defaultGetState = (_path: OperationPath.OperationPath): unknown => {\n return undefined;\n};\n\n/**\n * Creates a ProxyEnvironment.\n * @param optionsOrCallback - Either an options object or a simple callback for operations\n */\nexport const make = (\n optionsOrCallback: ProxyEnvironmentOptions | ((operation: Operation.Operation<any, any, any>) => void)\n): ProxyEnvironment => {\n // Support both old callback style and new options object\n const options: ProxyEnvironmentOptions =\n typeof optionsOrCallback === \"function\"\n ? { onOperation: optionsOrCallback }\n : optionsOrCallback;\n\n return {\n addOperation: (operation: Operation.Operation<any, any, any>) => {\n options.onOperation(operation);\n },\n getState: options.getState ?? defaultGetState,\n generateId: options.generateId ?? defaultGenerateId,\n };\n};\n","import * as Operation from \"./Operation\";\n\n/**\n * A Transaction represents a group of operations that were applied atomically.\n */\nexport interface Transaction {\n /** Unique identifier for this transaction */\n readonly id: string;\n /** Operations contained in this transaction */\n readonly ops: ReadonlyArray<Operation.Operation<any, any, any>>;\n /** Timestamp when the transaction was created */\n readonly timestamp: number;\n}\n\n/**\n * Creates a new Transaction with the given operations.\n */\nexport const make = (ops: ReadonlyArray<Operation.Operation<any, any, any>>): Transaction => ({\n id: crypto.randomUUID(),\n ops,\n timestamp: Date.now(),\n});\n\n/**\n * Creates an empty Transaction.\n */\nexport const empty = (): Transaction => make([]);\n\n/**\n * Checks if a transaction is empty (has no operations).\n */\nexport const isEmpty = (tx: Transaction): boolean => tx.ops.length === 0;\n\n/**\n * Merges multiple transactions into one.\n */\nexport const merge = (txs: ReadonlyArray<Transaction>): Transaction => {\n const allOps = txs.flatMap(tx => tx.ops);\n return make(allOps);\n};\n\n\n/**\n * Encoded representation of a Transaction for network transport.\n */\nexport interface EncodedTransaction {\n readonly id: string;\n readonly ops: ReadonlyArray<Operation.EncodedOperation>;\n readonly timestamp: number;\n}\n\n/**\n * Encodes a Transaction to a JSON-serializable format for network transport.\n * @param transaction - The transaction to encode.\n * @returns The encoded representation.\n */\nexport const encode = (transaction: Transaction): EncodedTransaction => ({\n id: transaction.id,\n ops: transaction.ops.map(Operation.encode),\n timestamp: transaction.timestamp,\n});\n\n/**\n * Decodes an encoded transaction back to a Transaction.\n * @param encoded - The encoded representation.\n * @returns The decoded Transaction.\n */\nexport const decode = (encoded: EncodedTransaction): Transaction => ({\n id: encoded.id,\n ops: encoded.ops.map(Operation.decode),\n timestamp: encoded.timestamp,\n});\n","import * as Operation from \"./Operation\";\nimport * as OperationPath from \"./OperationPath\";\nimport * as ProxyEnvironment from \"./ProxyEnvironment\";\nimport * as Transaction from \"./Transaction\";\nimport type * as Primitive from \"./Primitive\";\n\n// =============================================================================\n// Document Errors\n// =============================================================================\n\n/**\n * Error thrown when attempting to start a nested transaction.\n */\nexport class NestedTransactionError extends Error {\n readonly _tag = \"NestedTransactionError\";\n constructor() {\n super(\"Nested transactions are not supported\");\n this.name = \"NestedTransactionError\";\n }\n}\n\n/**\n * Error thrown when an operation fails to apply.\n */\nexport class OperationError extends Error {\n readonly _tag = \"OperationError\";\n constructor(message: string) {\n super(message);\n this.name = \"OperationError\";\n }\n}\n\n// =============================================================================\n// Document Interface\n// =============================================================================\n\n/**\n * A Document manages state for a primitive-based schema with transaction support.\n */\nexport interface Document<TSchema extends Primitive.AnyPrimitive> {\n /** The schema defining this document's structure */\n readonly schema: TSchema;\n \n /** Root proxy for accessing and modifying document data */\n readonly root: Primitive.InferProxy<TSchema>;\n \n /** Returns the current document state */\n get(): Primitive.InferState<TSchema> | undefined;\n \n /**\n * Returns a readonly snapshot of the entire document state for rendering.\n * The snapshot is a type-safe, readonly structure where:\n * - Required fields and fields with defaults are guaranteed to be defined\n * - Optional fields may be undefined\n */\n toSnapshot(): Primitive.InferSnapshot<TSchema>;\n \n /**\n * Runs a function within a transaction.\n * All operations are collected and applied atomically.\n * If the function throws, all changes are rolled back.\n * @returns The return value of the function\n */\n transaction<R>(fn: (root: Primitive.InferProxy<TSchema>) => R): R;\n \n /**\n * Applies external operations (e.g., from server/peers) to the document.\n * These operations are NOT added to pending operations.\n */\n apply(ops: ReadonlyArray<Operation.Operation<any, any, any>>): void;\n \n /**\n * Returns pending local operations as a Transaction and clears the buffer.\n */\n flush(): Transaction.Transaction;\n}\n\n// =============================================================================\n// Document Options\n// =============================================================================\n\nexport interface DocumentOptions<TSchema extends Primitive.AnyPrimitive> {\n /** Initial state for the document */\n readonly initial?: Primitive.InferState<TSchema>;\n}\n\n// =============================================================================\n// Document Implementation\n// =============================================================================\n\n/**\n * Creates a new Document for the given schema.\n */\nexport const make = <TSchema extends Primitive.AnyPrimitive>(\n schema: TSchema,\n options?: DocumentOptions<TSchema>\n): Document<TSchema> => {\n // Internal state\n let _state: Primitive.InferState<TSchema> | undefined = \n options?.initial ?? schema._internal.getInitialState();\n \n // Pending operations buffer (local changes not yet flushed)\n let _pending: Operation.Operation<any, any, any>[] = [];\n \n // Transaction state\n let _inTransaction = false;\n let _txOps: Operation.Operation<any, any, any>[] = [];\n let _txBaseState: Primitive.InferState<TSchema> | undefined = undefined;\n\n /**\n * Gets state at the given path.\n */\n const getStateAtPath = (path: OperationPath.OperationPath): unknown => {\n const tokens = path.toTokens().filter(t => t !== \"\");\n \n if (tokens.length === 0) {\n return _state;\n }\n \n let current: unknown = _state;\n for (const token of tokens) {\n if (current === null || current === undefined) {\n return undefined;\n }\n \n if (typeof current === \"object\") {\n // Handle array entries (which have { id, pos, value } structure)\n if (Array.isArray(current)) {\n // Try to find by ID in array entries\n const entry = current.find((e: any) => e.id === token);\n if (entry) {\n current = entry.value;\n continue;\n }\n }\n \n // Handle regular object property access\n current = (current as Record<string, unknown>)[token];\n } else {\n return undefined;\n }\n }\n \n return current;\n };\n\n /**\n * Applies a single operation to the current state.\n */\n const applyOperation = (op: Operation.Operation<any, any, any>): void => {\n try {\n _state = schema._internal.applyOperation(_state, op);\n } catch (error) {\n if (error instanceof Error) {\n throw new OperationError(error.message);\n }\n throw new OperationError(String(error));\n }\n };\n\n /**\n * Handles an operation from a proxy.\n * In transaction mode: collects operations, applies to state immediately for subsequent reads.\n * Outside transaction mode: auto-wraps in a single-operation transaction.\n */\n const handleOperation = (op: Operation.Operation<any, any, any>): void => {\n if (_inTransaction) {\n // In transaction: collect op and apply immediately for subsequent reads\n _txOps.push(op);\n applyOperation(op);\n } else {\n // Not in transaction: auto-wrap in single-operation transaction\n const baseState = _state;\n try {\n applyOperation(op);\n _pending.push(op);\n } catch (error) {\n // Rollback on error\n _state = baseState;\n throw error;\n }\n }\n };\n\n /**\n * Creates a ProxyEnvironment for the document.\n */\n const createEnv = (): ProxyEnvironment.ProxyEnvironment => {\n return ProxyEnvironment.make({\n onOperation: handleOperation,\n getState: getStateAtPath,\n });\n };\n\n // Create the root proxy\n const env = createEnv();\n const rootProxy = schema._internal.createProxy(env, OperationPath.make(\"\")) as Primitive.InferProxy<TSchema>;\n\n // Document implementation\n const document: Document<TSchema> = {\n schema,\n root: rootProxy,\n \n get: (): Primitive.InferState<TSchema> | undefined => {\n return _state;\n },\n \n toSnapshot: (): Primitive.InferSnapshot<TSchema> => {\n return (rootProxy as { toSnapshot(): Primitive.InferSnapshot<TSchema> }).toSnapshot();\n },\n \n transaction: <R,>(fn: (root: Primitive.InferProxy<TSchema>) => R): R => {\n if (_inTransaction) {\n throw new NestedTransactionError();\n }\n \n // Start transaction\n _inTransaction = true;\n _txOps = [];\n _txBaseState = _state;\n \n try {\n // Execute the transaction function\n const result = fn(rootProxy);\n \n // Commit: add transaction ops to pending\n _pending.push(..._txOps);\n \n return result;\n } catch (error) {\n // Rollback: restore base state\n _state = _txBaseState;\n throw error;\n } finally {\n // Clean up transaction state\n _inTransaction = false;\n _txOps = [];\n _txBaseState = undefined;\n }\n },\n \n apply: (ops: ReadonlyArray<Operation.Operation<any, any, any>>): void => {\n for (const op of ops) {\n applyOperation(op);\n }\n },\n \n flush: (): Transaction.Transaction => {\n const tx = Transaction.make(_pending);\n _pending = [];\n return tx;\n },\n };\n\n return document;\n};\n","import type * as Operation from \"./Operation\";\n\n// =============================================================================\n// Transform Result Types\n// =============================================================================\n\n/**\n * Result of transforming an operation against another operation.\n */\nexport type TransformResult =\n | { type: \"transformed\"; operation: Operation.Operation<any, any, any> }\n | { type: \"noop\" } // Operation becomes a no-op (already superseded)\n | { type: \"conflict\"; reason: string };\n","/**\n * @since 0.0.1\n * Presence module for ephemeral per-connection state.\n * Used by both client and server for schema validation.\n */\nimport * as Schema from \"effect/Schema\";\n\n// =============================================================================\n// Presence Types\n// =============================================================================\n\n/**\n * A Presence schema wrapper that holds an Effect Schema for validation.\n * This is used by both client and server to validate presence data.\n */\nexport interface Presence<TData> {\n readonly _tag: \"Presence\";\n /** The Effect Schema used for validation */\n readonly schema: Schema.Schema<TData>;\n /** Branded type marker for inference */\n readonly _Data: TData;\n}\n\n/**\n * Options for creating a Presence instance.\n */\nexport interface PresenceOptions<TData> {\n /** The Effect Schema defining the presence data structure */\n readonly schema: Schema.Schema<TData>;\n}\n\n/**\n * Infer the data type from a Presence instance.\n */\nexport type Infer<P extends Presence<any>> = P[\"_Data\"];\n\n/**\n * Any Presence type (for generic constraints).\n */\nexport type AnyPresence = Presence<any>;\n\n// =============================================================================\n// Presence Entry (for storage/transport)\n// =============================================================================\n\n/**\n * A presence entry as stored/transmitted.\n */\nexport interface PresenceEntry<TData = unknown> {\n /** The presence data */\n readonly data: TData;\n /** Optional user ID from authentication */\n readonly userId?: string;\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\n/**\n * Creates a new Presence schema wrapper.\n *\n * @example\n * ```typescript\n * import { Presence } from \"@voidhash/mimic\";\n * import { Schema } from \"effect\";\n *\n * const CursorPresence = Presence.make({\n * schema: Schema.Struct({\n * name: Schema.String,\n * cursor: Schema.Struct({\n * x: Schema.Number,\n * y: Schema.Number,\n * }),\n * }),\n * });\n * ```\n */\nexport const make = <TData,>(options: PresenceOptions<TData>): Presence<TData> => ({\n _tag: \"Presence\",\n schema: options.schema,\n _Data: undefined as unknown as TData,\n});\n\n// =============================================================================\n// Validation Functions\n// =============================================================================\n\n/**\n * Validates unknown data against a Presence schema.\n * Throws a ParseError if validation fails.\n *\n * @param presence - The Presence instance with the schema\n * @param data - Unknown data to validate\n * @returns The validated and typed data\n * @throws ParseError if validation fails\n */\nexport const validate = <TData,>(\n presence: Presence<TData>,\n data: unknown\n): TData => {\n return Schema.decodeUnknownSync(presence.schema)(data);\n};\n\n/**\n * Safely validates unknown data against a Presence schema.\n * Returns undefined if validation fails instead of throwing.\n *\n * @param presence - The Presence instance with the schema\n * @param data - Unknown data to validate\n * @returns The validated data or undefined if invalid\n */\nexport const validateSafe = <TData,>(\n presence: Presence<TData>,\n data: unknown\n): TData | undefined => {\n try {\n return Schema.decodeUnknownSync(presence.schema)(data);\n } catch {\n return undefined;\n }\n};\n\n/**\n * Checks if unknown data is valid according to a Presence schema.\n *\n * @param presence - The Presence instance with the schema\n * @param data - Unknown data to check\n * @returns true if valid, false otherwise\n */\nexport const isValid = <TData,>(\n presence: Presence<TData>,\n data: unknown\n): data is TData => {\n try {\n Schema.decodeUnknownSync(presence.schema)(data);\n return true;\n } catch {\n return false;\n }\n};\n\n"],"mappings":"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"}
|