@voidhash/mimic 0.0.1-alpha.8 → 0.0.1-alpha.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["result: Record<string, unknown>","OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","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","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>","TreeNodeSelf: TreeNodeSelfType","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"],"sources":["../src/primitives/shared.ts","../src/OperationDefinition.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/Transform.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 * \n * @typeParam TState - The state type this primitive holds\n * @typeParam TProxy - The proxy type for interacting with this primitive\n * @typeParam TDefined - Whether the value is guaranteed to be defined (via required() or default())\n * @typeParam THasDefault - Whether this primitive has a default value\n */\nexport interface Primitive<TState, TProxy, TRequired extends boolean = false, THasDefault extends boolean = false, TSetInput = unknown, TUpdateInput = unknown> {\n readonly _tag: string;\n readonly _State: TState;\n readonly _Proxy: TProxy;\n readonly _TRequired: TRequired;\n readonly _THasDefault: THasDefault;\n readonly _internal: PrimitiveInternal<TState, TProxy>;\n readonly TSetInput: TSetInput;\n readonly TUpdateInput: TUpdateInput;\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, any, any>;\n \n /**\n * Infer the state type from a primitive.\n */\n export type InferState<T> = T extends Primitive<infer S, any, any, 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, any, any> ? P : never;\n\n /**\n * Infer the SetInput type from a primitive.\n */\n export type InferSetInput<T> = T extends Primitive<any, any, any, any, infer S, any> ? S : never;\n\n /**\n * Infer the UpdateInput type from a primitive.\n */\n export type InferUpdateInput<T> = T extends Primitive<any, any, any, any, any, infer U> ? U : never;\n \n /**\n * Helper type to conditionally add undefined based on TRequired and THasDefault.\n * When TRequired is false and THasDefault is false, the value may be undefined.\n * Otherwise, the value is guaranteed to be defined.\n */\n export type MaybeUndefined<T, TRequired extends boolean, THasDefault extends boolean> = TRequired extends false ? THasDefault extends false ? Optional<T> : T : T;\n\n export type Optional<T> = T | undefined;\n\n /**\n * Helper type to conditionally add undefined based on TRequired and THasDefault.\n * When TRequired is true and THasDefault is false, the value must be provided.\n * Otherwise, the value may be undefined.\n */\n export type NeedsValue<T, TRequired extends boolean, THasDefault extends boolean> = TRequired extends true ? THasDefault extends false ? T : Optional<T> : Optional<T>;\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, any, any>\n ? P extends { toSnapshot(): infer S } ? S : never\n : never;\n\n /**\n * Extract THasDefault from a primitive.\n */\n export type HasDefault<T> = T extends Primitive<any, any, any, infer H> ? H : false;\n\n /**\n * Extract TDefined from a primitive.\n */\n export type IsDefined<T> = T extends Primitive<any, any, infer D, any> ? D : false;\n\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// =============================================================================\n// Default Value Utilities\n// =============================================================================\n\n/**\n * Applies default values to a partial input, recursively handling nested structs.\n * \n * Uses a two-layer approach:\n * 1. First, get the struct's initial state (which includes struct-level defaults)\n * 2. Then, layer the provided values on top\n * 3. Finally, ensure nested structs are recursively processed\n * \n * @param primitive - The primitive definition containing field information\n * @param value - The partial value provided by the user\n * @returns The value with defaults applied for missing fields\n */\nexport function applyDefaults<T extends AnyPrimitive>(\n primitive: T,\n value: Partial<InferState<T>>\n): InferState<T> {\n // Only structs need default merging\n if (primitive._tag === \"StructPrimitive\") {\n const structPrimitive = primitive as unknown as { \n fields: Record<string, AnyPrimitive>;\n _internal: { getInitialState: () => Record<string, unknown> | undefined };\n };\n \n // Start with the struct's initial state (struct-level default or field defaults)\n const structInitialState = structPrimitive._internal.getInitialState() ?? {};\n \n // Layer the provided values on top of initial state\n const result: Record<string, unknown> = { ...structInitialState, ...value };\n \n for (const key in structPrimitive.fields) {\n const fieldPrimitive = structPrimitive.fields[key]!;\n \n if (result[key] === undefined) {\n // Field still not provided after merging - try individual field default\n const fieldDefault = fieldPrimitive._internal.getInitialState();\n if (fieldDefault !== undefined) {\n result[key] = fieldDefault;\n }\n } else if (fieldPrimitive._tag === \"StructPrimitive\" && typeof result[key] === \"object\" && result[key] !== null) {\n // Recursively apply defaults to nested structs\n result[key] = applyDefaults(fieldPrimitive, result[key] as Partial<InferState<typeof fieldPrimitive>>);\n }\n }\n \n return result as InferState<T>;\n }\n \n // For non-struct primitives, return the value as-is\n return value as InferState<T>;\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}","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, NeedsValue } from \"./shared\";\nimport { runValidators, isCompatibleOperation, ValidationError } from \"./shared\";\n\n\ntype InferSetInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<string, TRequired, THasDefault>\ntype InferUpdateInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<string, TRequired, THasDefault>\n\n// =============================================================================\n// String Primitive\n// =============================================================================\n\nexport interface StringProxy<TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current string value */\n get(): MaybeUndefined<string, TRequired, THasDefault>;\n /** Sets the string value, generating a string.set operation */\n set(value: InferSetInput<TRequired, THasDefault>): void;\n /** This is the same as set. Updates the string value, generating a string.set operation */\n update(value: InferUpdateInput<TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the string value for rendering */\n toSnapshot(): MaybeUndefined<string, TRequired, THasDefault>;\n}\n\ninterface StringPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: string | undefined;\n readonly validators: readonly Validator<string>[];\n}\n\nexport class StringPrimitive<TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<string, StringProxy<TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TRequired, THasDefault>, InferUpdateInput<TRequired, THasDefault>> {\n readonly _tag = \"StringPrimitive\" as const;\n readonly _State!: string;\n readonly _Proxy!: StringProxy<TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TRequired, THasDefault>;\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, THasDefault> {\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<TRequired, 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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): StringProxy<TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<string, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as string | undefined;\n return (state ?? defaultValue) as MaybeUndefined<string, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n update: (value: InferUpdateInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<string, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as string | undefined;\n return (state ?? defaultValue) as MaybeUndefined<string, TRequired, THasDefault>;\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, 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, NeedsValue, InferUpdateInput, InferSetInput } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators, applyDefaults } from \"./shared\";\n\n// =============================================================================\n// Struct Set Input Types\n// =============================================================================\n\n/**\n * Determines if a field is required for set() operations.\n * A field is required if: TRequired is true AND THasDefault is false\n */\ntype IsRequiredForSet<T> = T extends Primitive<any, any, true, false> ? true : false;\n\n/**\n * Extract keys of fields that are required for set() (required without default).\n */\ntype RequiredSetKeys<TFields extends Record<string, AnyPrimitive>> = {\n [K in keyof TFields]: IsRequiredForSet<TFields[K]> extends true ? K : never;\n}[keyof TFields];\n\n/**\n * Extract keys of fields that are optional for set() (has default OR not required).\n */\ntype OptionalSetKeys<TFields extends Record<string, AnyPrimitive>> = {\n [K in keyof TFields]: IsRequiredForSet<TFields[K]> extends true ? never : K;\n}[keyof TFields];\n\n/**\n * Compute the input type for set() operations on a struct.\n * Required fields (required without default) must be provided.\n * Optional fields (has default or not required) can be omitted.\n * Uses each field's TSetInput type to handle nested structs correctly.\n */\nexport type StructSetInput<TFields extends Record<string, AnyPrimitive>> = \n { readonly [K in RequiredSetKeys<TFields>]: InferSetInput<TFields[K]> } &\n { readonly [K in OptionalSetKeys<TFields>]?: InferSetInput<TFields[K]> };\n\n/**\n * Input type for set() - respects required/default status of the struct.\n * If the struct is required without a default, the value must be provided.\n * The value itself uses StructSetInput which handles field-level required/default logic.\n */\ntype InferStructSetInput<TFields extends Record<string, AnyPrimitive>, TRequired extends boolean, THasDefault extends boolean> = \n NeedsValue<StructSetInput<TFields>, TRequired, THasDefault>;\n\n/**\n * Input type for update() - always partial since update only modifies specified fields.\n * For nested structs, allows recursive partial updates.\n */\ntype InferStructUpdateInput<TFields extends Record<string, AnyPrimitive>> = StructUpdateValue<TFields>;\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 a partial update type.\n * Uses each field's TUpdateInput type, which handles nested updates recursively.\n */\nexport type StructUpdateValue<TFields extends Record<string, AnyPrimitive>> = {\n readonly [K in keyof TFields]?: InferUpdateInput<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>, TRequired extends boolean = false, THasDefault extends boolean = false> = {\n readonly [K in keyof TFields]: InferProxy<TFields[K]>;\n} & {\n /** Gets the entire struct value */\n get(): MaybeUndefined<InferStructState<TFields>, TRequired, THasDefault>;\n /** Sets the entire struct value (only fields that are required without defaults must be provided) */\n set(value: InferStructSetInput<TFields, TRequired, THasDefault>): void;\n /** Updates only the specified fields (partial update, handles nested structs recursively) */\n update(value: InferStructUpdateInput<TFields>): void;\n /** Returns a readonly snapshot of the struct for rendering */\n toSnapshot(): MaybeUndefined<InferStructSnapshot<TFields>, TRequired, THasDefault>;\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>, TRequired extends boolean = false, THasDefault extends boolean = false>\n implements Primitive<InferStructState<TFields>, StructProxy<TFields, TRequired, THasDefault>, TRequired, THasDefault, InferStructSetInput<TFields, TRequired, THasDefault>, InferStructUpdateInput<TFields>>\n{\n readonly _tag = \"StructPrimitive\" as const;\n readonly _State!: InferStructState<TFields>;\n readonly _Proxy!: StructProxy<TFields, TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TSetInput!: InferStructSetInput<TFields, TRequired, THasDefault>;\n readonly TUpdateInput!: InferStructUpdateInput<TFields>;\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, THasDefault> {\n return new StructPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this struct */\n default(defaultValue: StructSetInput<TFields>): StructPrimitive<TFields, TRequired, true> {\n // Apply defaults to the provided value\n const merged = applyDefaults(this as AnyPrimitive, defaultValue as Partial<InferStructState<TFields>>) as InferStructState<TFields>;\n return new StructPrimitive({\n ...this._schema,\n defaultValue: merged,\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, TRequired, THasDefault> {\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, TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): StructProxy<TFields, TRequired, THasDefault> => {\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/update/toSnapshot methods\n const base = {\n get: (): MaybeUndefined<InferStructState<TFields>, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as InferStructState<TFields> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferStructState<TFields>, TRequired, THasDefault>;\n },\n set: (value: InferStructSetInput<TFields, TRequired, THasDefault>) => {\n // Apply defaults for missing fields\n const merged = applyDefaults(this as AnyPrimitive, value as Partial<InferStructState<TFields>>) as InferStructState<TFields>;\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, merged)\n );\n },\n update: (value: InferStructUpdateInput<TFields>) => {\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n const fieldValue = value[key as keyof TFields];\n if (fieldValue === undefined) continue; // Skip undefined values\n\n const fieldPrimitive = fields[key as keyof TFields];\n if (!fieldPrimitive) continue; // Skip unknown fields\n\n const fieldPath = operationPath.append(key);\n const fieldProxy = fieldPrimitive._internal.createProxy(env, fieldPath);\n\n // Check if this is a nested struct and value is a plain object (partial update)\n if (\n fieldPrimitive._tag === \"StructPrimitive\" &&\n typeof fieldValue === \"object\" &&\n fieldValue !== null &&\n !Array.isArray(fieldValue)\n ) {\n // Recursively update nested struct\n (fieldProxy as { update: (v: unknown) => void }).update(fieldValue);\n } else {\n // Set the field value directly\n (fieldProxy as { set: (v: unknown) => void }).set(fieldValue);\n }\n }\n }\n },\n toSnapshot: (): MaybeUndefined<InferStructSnapshot<TFields>, TRequired, THasDefault> => {\n const snapshot = buildSnapshot();\n return snapshot as MaybeUndefined<InferStructSnapshot<TFields>, TRequired, THasDefault>;\n },\n };\n\n // Use a JavaScript Proxy to intercept field access\n return new globalThis.Proxy(base as StructProxy<TFields, TRequired, THasDefault>, {\n get: (target, prop, _receiver) => {\n // Return base methods (get, set, update, toSnapshot)\n if (prop === \"get\") {\n return target.get;\n }\n if (prop === \"set\") {\n return target.set;\n }\n if (prop === \"update\") {\n return target.update;\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 === \"update\" || 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, 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, NeedsValue } from \"./shared\";\nimport { runValidators, isCompatibleOperation, ValidationError } from \"./shared\";\n\n\ntype InferSetInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<boolean, TRequired, THasDefault>\ntype InferUpdateInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<boolean, TRequired, THasDefault>\n\nexport interface BooleanProxy<TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current boolean value */\n get(): MaybeUndefined<boolean, TRequired, THasDefault>;\n /** Sets the boolean value, generating a boolean.set operation */\n set(value: InferSetInput<TRequired, THasDefault>): void;\n /** This is the same as set. Updates the boolean value, generating a boolean.set operation */\n update(value: InferUpdateInput<TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the boolean value for rendering */\n toSnapshot(): MaybeUndefined<boolean, TRequired, THasDefault>;\n}\n\ninterface BooleanPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: boolean | undefined;\n readonly validators: readonly Validator<boolean>[];\n}\n\nexport class BooleanPrimitive<TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<boolean, BooleanProxy<TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TRequired, THasDefault>, InferUpdateInput<TRequired, THasDefault>> {\n readonly _tag = \"BooleanPrimitive\" as const;\n readonly _State!: boolean;\n readonly _Proxy!: BooleanProxy<TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TRequired, THasDefault>;\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, THasDefault> {\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<TRequired, 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<TRequired, THasDefault> {\n return new BooleanPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n readonly _internal: PrimitiveInternal<boolean, BooleanProxy<TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): BooleanProxy<TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<boolean, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as boolean | undefined;\n return (state ?? defaultValue) as MaybeUndefined<boolean, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n update: (value: InferUpdateInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<boolean, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as boolean | undefined;\n return (state ?? defaultValue) as MaybeUndefined<boolean, TRequired, THasDefault>;\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, 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, NeedsValue } from \"./shared\";\nimport { ValidationError, runValidators, isCompatibleOperation } from \"./shared\";\n\n\ntype InferSetInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<number, TRequired, THasDefault>\ntype InferUpdateInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<number, TRequired, THasDefault>\n\nexport interface NumberProxy<TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current number value */\n get(): MaybeUndefined<number, TRequired, THasDefault>;\n /** Sets the number value, generating a number.set operation */\n set(value: InferSetInput<TRequired, THasDefault>): void;\n /** This is the same as set. Updates the number value, generating a number.set operation */\n update(value: InferUpdateInput<TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the number value for rendering */\n toSnapshot(): MaybeUndefined<number, TRequired, THasDefault>;\n}\n\ninterface NumberPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: number | undefined;\n readonly validators: readonly Validator<number>[];\n}\n\nexport class NumberPrimitive<TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<number, NumberProxy<TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TRequired, THasDefault>, InferUpdateInput<TRequired, THasDefault>> {\n readonly _tag = \"NumberPrimitive\" as const;\n readonly _State!: number;\n readonly _Proxy!: NumberProxy<TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TRequired, THasDefault>;\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, THasDefault> {\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<TRequired, 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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\n return this.refine(\n (v) => v > 0,\n \"Number must be positive\"\n );\n }\n\n /** Must be negative (< 0) */\n negative(): NumberPrimitive<TRequired, THasDefault> {\n return this.refine(\n (v) => v < 0,\n \"Number must be negative\"\n );\n }\n\n /** Must be an integer */\n int(): NumberPrimitive<TRequired, THasDefault> {\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<TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): NumberProxy<TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<number, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as number | undefined;\n return (state ?? defaultValue) as MaybeUndefined<number, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n update: (value: InferUpdateInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<number, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as number | undefined;\n return (state ?? defaultValue) as MaybeUndefined<number, TRequired, THasDefault>;\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, 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, NeedsValue } from \"./shared\";\nimport { ValidationError, runValidators, isCompatibleOperation } from \"./shared\";\n\n\n/** Valid literal types */\nexport type LiteralValue = string | number | boolean | null;\n\ntype InferSetInput<T extends LiteralValue, TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<T, TRequired, THasDefault>\ntype InferUpdateInput<T extends LiteralValue, TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<T, TRequired, THasDefault>\n\nexport interface LiteralProxy<T extends LiteralValue, TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current literal value */\n get(): MaybeUndefined<T, TRequired, THasDefault>;\n /** Sets the literal value (must match the exact literal type) */\n set(value: InferSetInput<T, TRequired, THasDefault>): void;\n /** This is the same as set. Updates the literal value, generating a literal.set operation */\n update(value: InferUpdateInput<T, TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the literal value for rendering */\n toSnapshot(): MaybeUndefined<T, TRequired, THasDefault>;\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, TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<T, LiteralProxy<T, TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<T, TRequired, THasDefault>, InferUpdateInput<T, TRequired, THasDefault>> {\n readonly _tag = \"LiteralPrimitive\" as const;\n readonly _State!: T;\n readonly _Proxy!: LiteralProxy<T, TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<T, TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<T, TRequired, THasDefault>;\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, THasDefault> {\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, TRequired, 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, TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): LiteralProxy<T, TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<T, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as T | undefined;\n return (state ?? defaultValue) as MaybeUndefined<T, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<T, TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n update: (value: InferUpdateInput<T, TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<T, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as T | undefined;\n return (state ?? defaultValue) as MaybeUndefined<T, TRequired, THasDefault>;\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, 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, InferSetInput } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators, applyDefaults } from \"./shared\";\nimport { StructPrimitive, StructSetInput } from \"./Struct\";\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\n/**\n * Compute the input type for array element values.\n * Uses StructSetInput directly for struct elements so that:\n * - Fields that are required AND have no default must be provided\n * - Fields that are optional OR have defaults can be omitted\n * \n * For non-struct elements, falls back to InferSetInput.\n */\nexport type ArrayElementSetInput<TElement extends AnyPrimitive> = \n TElement extends StructPrimitive<infer TFields, any, any>\n ? StructSetInput<TFields>\n : InferSetInput<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, applies defaults) */\n set(values: readonly ArrayElementSetInput<TElement>[]): void;\n /** Appends a value to the end of the array (applies defaults for struct elements) */\n push(value: ArrayElementSetInput<TElement>): void;\n /** Inserts a value at the specified visual index (applies defaults for struct elements) */\n insertAt(index: number, value: ArrayElementSetInput<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\n/** Input type for array set() - an array of element set inputs */\nexport type ArraySetInput<TElement extends AnyPrimitive> = readonly ArrayElementSetInput<TElement>[];\n\n/** Input type for array update() - same as set() for arrays */\nexport type ArrayUpdateInput<TElement extends AnyPrimitive> = readonly ArrayElementSetInput<TElement>[];\n\nexport class ArrayPrimitive<TElement extends AnyPrimitive, TRequired extends boolean = false, THasDefault extends boolean = false>\n implements Primitive<ArrayState<TElement>, ArrayProxy<TElement>, TRequired, THasDefault, ArraySetInput<TElement>, ArrayUpdateInput<TElement>>\n{\n readonly _tag = \"ArrayPrimitive\" as const;\n readonly _State!: ArrayState<TElement>;\n readonly _Proxy!: ArrayProxy<TElement>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TSetInput!: ArraySetInput<TElement>;\n readonly TUpdateInput!: ArrayUpdateInput<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, true, THasDefault> {\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, TRequired, true> {\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, TRequired, THasDefault> {\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, TRequired, THasDefault> {\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, TRequired, THasDefault> {\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 // Helper to apply defaults for element values\n const applyElementDefaults = (value: ArrayElementSetInput<TElement>): InferState<TElement> => {\n return applyDefaults(elementPrimitive, value as Partial<InferState<TElement>>) as InferState<TElement>;\n };\n\n return {\n get: (): ArrayState<TElement> => {\n return getCurrentState();\n },\n\n set: (values: readonly ArrayElementSetInput<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 // Apply defaults to element value\n const mergedValue = applyElementDefaults(value);\n entries.push({ id, pos, value: mergedValue });\n prevPos = pos;\n }\n \n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, entries)\n );\n },\n\n push: (value: ArrayElementSetInput<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 // Apply defaults to element value\n const mergedValue = applyElementDefaults(value);\n \n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, { id, pos, value: mergedValue })\n );\n },\n\n insertAt: (index: number, value: ArrayElementSetInput<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 // Apply defaults to element value\n const mergedValue = applyElementDefaults(value);\n \n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, { id, pos, value: mergedValue })\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, false, false> =>\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, InferSetInput, InferUpdateInput } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators } from \"./shared\";\n\n/**\n * Type to infer SetInput from a lazy thunk\n */\nexport type InferLazySetInput<T extends () => AnyPrimitive> = InferSetInput<ReturnType<T>>;\n\n/**\n * Type to infer UpdateInput from a lazy thunk\n */\nexport type InferLazyUpdateInput<T extends () => AnyPrimitive> = InferUpdateInput<ReturnType<T>>;\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>, false, false, InferLazySetInput<TThunk>, InferLazyUpdateInput<TThunk>>\n{\n readonly _tag = \"LazyPrimitive\" as const;\n readonly _State!: InferLazyState<TThunk>;\n readonly _Proxy!: InferLazyProxy<TThunk>;\n readonly _TRequired!: false;\n readonly _THasDefault!: false;\n readonly TSetInput!: InferLazySetInput<TThunk>;\n readonly TUpdateInput!: InferLazyUpdateInput<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, InferSetInput } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { LiteralPrimitive } from \"./Literal\";\nimport { StructPrimitive, InferStructState } from \"./Struct\";\nimport { runValidators, applyDefaults } from \"./shared\";\n\n\n/**\n * Type constraint for union variants - must be struct primitives\n */\nexport type UnionVariants = Record<string, StructPrimitive<any, 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 * Compute the input type for union.set() operations.\n * Uses each variant's TSetInput type.\n */\nexport type UnionSetInput<TVariants extends UnionVariants> = {\n [K in keyof TVariants]: InferSetInput<TVariants[K]>;\n}[keyof TVariants];\n\n/**\n * Proxy for accessing union variants\n */\nexport interface UnionProxy<TVariants extends UnionVariants, _TDiscriminator extends string, TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current union value */\n get(): MaybeUndefined<InferUnionState<TVariants>, TRequired, THasDefault>;\n \n /** Sets the entire union value (applies defaults for variant fields) */\n set(value: UnionSetInput<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>, TRequired, THasDefault>;\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\", TRequired extends boolean = false, THasDefault extends boolean = false>\n implements Primitive<InferUnionState<TVariants>, UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>, TRequired, THasDefault, UnionSetInput<TVariants>, UnionSetInput<TVariants>>\n{\n readonly _tag = \"UnionPrimitive\" as const;\n readonly _State!: InferUnionState<TVariants>;\n readonly _Proxy!: UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TSetInput!: UnionSetInput<TVariants>;\n readonly TUpdateInput!: UnionSetInput<TVariants>;\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, THasDefault> {\n return new UnionPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this union */\n default(defaultValue: UnionSetInput<TVariants>): UnionPrimitive<TVariants, TDiscriminator, true, true> {\n // Apply defaults to the variant\n const merged = this._applyVariantDefaults(defaultValue as Partial<InferUnionState<TVariants>>);\n return new UnionPrimitive({\n ...this._schema,\n defaultValue: merged,\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, any>;\n if (literalPrimitive.literal === discriminatorValue) {\n return key;\n }\n }\n }\n return undefined;\n }\n\n /** Apply defaults to a variant value based on the discriminator */\n private _applyVariantDefaults(value: Partial<InferUnionState<TVariants>>): InferUnionState<TVariants> {\n const variantKey = this._findVariantKey(value as InferUnionState<TVariants>);\n if (!variantKey) {\n return value as InferUnionState<TVariants>;\n }\n \n const variantPrimitive = this._schema.variants[variantKey]!;\n return applyDefaults(variantPrimitive as AnyPrimitive, value) as InferUnionState<TVariants>;\n }\n\n readonly _internal: PrimitiveInternal<InferUnionState<TVariants>, UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>> = {\n createProxy: (\n env: ProxyEnvironment.ProxyEnvironment,\n operationPath: OperationPath.OperationPath\n ): UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault> => {\n const variants = this._schema.variants;\n const defaultValue = this._schema.defaultValue;\n\n return {\n get: (): MaybeUndefined<InferUnionState<TVariants>, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as InferUnionState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferUnionState<TVariants>, TRequired, THasDefault>;\n },\n set: (value: UnionSetInput<TVariants>) => {\n // Apply defaults for the variant\n const merged = this._applyVariantDefaults(value as Partial<InferUnionState<TVariants>>);\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, merged)\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>, TRequired, THasDefault> => {\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>, TRequired, THasDefault>;\n }\n \n const variantKey = this._findVariantKey(effectiveState);\n if (!variantKey) {\n return undefined as MaybeUndefined<InferUnionSnapshot<TVariants>, TRequired, THasDefault>;\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>, TRequired, THasDefault>;\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, false>;\nexport function Union<TVariants extends UnionVariants, TDiscriminator extends string>(\n options: UnionOptions<TVariants, TDiscriminator>\n): UnionPrimitive<TVariants, TDiscriminator, false, false>;\nexport function Union<TVariants extends UnionVariants, TDiscriminator extends string = \"type\">(\n options: UnionOptions<TVariants, TDiscriminator>\n): UnionPrimitive<TVariants, TDiscriminator, false, 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, NeedsValue } 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\ntype InferSetInput<TVariants extends readonly ScalarPrimitive[], TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<InferEitherState<TVariants>, TRequired, THasDefault>\ntype InferUpdateInput<TVariants extends readonly ScalarPrimitive[], TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<InferEitherState<TVariants>, TRequired, THasDefault>\n\n/**\n * Scalar primitives that can be used as variants in Either\n */\nexport type ScalarPrimitive =\n | StringPrimitive<any, any>\n | NumberPrimitive<any, any>\n | BooleanPrimitive<any, any>\n | LiteralPrimitive<any, 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[], TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current value */\n get(): MaybeUndefined<InferEitherState<TVariants>, TRequired, THasDefault>;\n\n /** Sets the value to any of the allowed variant types */\n set(value: InferSetInput<TVariants, TRequired, THasDefault>): void;\n\n /** This is the same as set. Updates the value, generating an either.set operation */\n update(value: InferUpdateInput<TVariants, TRequired, THasDefault>): 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>, TRequired, THasDefault>;\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[], TRequired extends boolean = false, THasDefault extends boolean = false>\n implements Primitive<InferEitherState<TVariants>, EitherProxy<TVariants, TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TVariants, TRequired, THasDefault>, InferUpdateInput<TVariants, TRequired, THasDefault>>\n{\n readonly _tag = \"EitherPrimitive\" as const;\n readonly _State!: InferEitherState<TVariants>;\n readonly _Proxy!: EitherProxy<TVariants, TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TVariants, TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TVariants, TRequired, THasDefault>;\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, THasDefault> {\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, TRequired, 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, 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, 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, TRequired, THasDefault>> = {\n createProxy: (\n env: ProxyEnvironment.ProxyEnvironment,\n operationPath: OperationPath.OperationPath\n ): EitherProxy<TVariants, TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n\n return {\n get: (): MaybeUndefined<InferEitherState<TVariants>, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as InferEitherState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferEitherState<TVariants>, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TVariants, TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n update: (value: InferUpdateInput<TVariants, TRequired, THasDefault>) => {\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>, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as InferEitherState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferEitherSnapshot<TVariants>, TRequired, THasDefault>;\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, 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 type { InferState } from \"../Primitive\";\nimport { StructPrimitive } from \"./Struct\";\n\n/**\n * Symbol used to identify the Self placeholder\n */\nconst TreeNodeSelfSymbol = Symbol.for(\"TreeNode.Self\");\n\n/**\n * Branded type for TreeNodeSelf - distinguishable at compile time\n */\ndeclare const SelfBrand: unique symbol;\nexport interface TreeNodeSelfType {\n readonly _tag: \"TreeNodeSelf\";\n readonly _brand: typeof SelfBrand;\n}\n\n/**\n * Special placeholder for self-referential tree nodes.\n * Use this in the children array when a node type can contain itself.\n * \n * @example\n * ```typescript\n * const FolderNode = TreeNode(\"folder\", {\n * data: Struct({ name: String() }),\n * children: [TreeNodeSelf], // Folder can contain other folders\n * });\n * ```\n */\nexport const TreeNodeSelf: TreeNodeSelfType = { _tag: \"TreeNodeSelf\", _symbol: TreeNodeSelfSymbol } as unknown as TreeNodeSelfType;\n\n/**\n * Check if a value is the Self placeholder\n */\nconst isSelf = (value: unknown): boolean => {\n return typeof value === \"object\" && value !== null && \"_symbol\" in value && (value as any)._symbol === TreeNodeSelfSymbol;\n};\n\n/**\n * Type utility to resolve Self placeholders to the actual node type\n */\ntype ResolveSelf<T, TSelf extends AnyTreeNodePrimitive> = \n T extends TreeNodeSelfType ? TSelf : T;\n\n/**\n * Type utility to resolve all children in a tuple, replacing Self with the node type\n */\ntype ResolveChildrenUnion<TChildren, TSelf extends AnyTreeNodePrimitive> = \n TChildren extends readonly (infer U)[] \n ? ResolveSelf<U, TSelf> \n : never;\n\n/**\n * The type for children - either a direct array or a lazy function (for self-referential nodes).\n */\nexport type TreeNodeChildrenInput = readonly (AnyTreeNodePrimitive | TreeNodeSelfType)[] | (() => readonly (AnyTreeNodePrimitive | TreeNodeSelfType)[]);\n\n/**\n * Any TreeNodePrimitive type - used for generic constraints.\n */\nexport type AnyTreeNodePrimitive = TreeNodePrimitive<string, StructPrimitive<any>, any>;\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> = \n T extends TreeNodePrimitive<any, any, infer TChildren> ? TChildren : never;\n\n/**\n * Configuration for a TreeNode primitive\n */\nexport interface TreeNodeConfig<\n TData extends StructPrimitive<any>,\n TChildren extends readonly (AnyTreeNodePrimitive | TreeNodeSelfType)[]\n> {\n readonly data: TData;\n readonly children: TChildren | (() => 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 AnyTreeNodePrimitive = 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: TreeNodeChildrenInput;\n private _resolvedChildren: readonly AnyTreeNodePrimitive[] | undefined;\n\n constructor(type: TType, config: TreeNodeConfig<TData, readonly (AnyTreeNodePrimitive | TreeNodeSelfType)[]>) {\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, replaces Self with this node) */\n get children(): readonly AnyTreeNodePrimitive[] {\n if (this._resolvedChildren === undefined) {\n const resolved = typeof this._children === \"function\"\n ? (this._children as () => readonly AnyTreeNodePrimitive[])()\n : this._children;\n // Replace Self placeholders with this node\n this._resolvedChildren = resolved.map(child => isSelf(child) ? this : child) as readonly AnyTreeNodePrimitive[];\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 const TChildren extends readonly (AnyTreeNodePrimitive | TreeNodeSelfType)[]\n>(\n type: TType,\n config: TreeNodeConfig<TData, TChildren>\n): TreeNodePrimitive<TType, TData, ResolveChildrenUnion<TChildren, TreeNodePrimitive<TType, TData, any>>> =>\n new TreeNodePrimitive(type, config) as TreeNodePrimitive<TType, TData, ResolveChildrenUnion<TChildren, TreeNodePrimitive<TType, TData, any>>>;\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, AnyPrimitive, InferSetInput, InferUpdateInput } from \"./shared\";\nimport { ValidationError, applyDefaults } from \"./shared\";\nimport { runValidators } from \"./shared\";\nimport type { AnyTreeNodePrimitive, InferTreeNodeType, InferTreeNodeDataState, InferTreeNodeChildren } from \"./TreeNode\";\nimport { InferStructState, StructSetInput, StructUpdateValue } from \"./Struct\";\nimport { StructPrimitive } 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 * Helper type to infer the update value type from a TreeNode's data.\n * Uses StructUpdateValue directly to get field-level partial update semantics.\n * All fields are optional in update operations.\n */\nexport type TreeNodeUpdateValue<TNode extends AnyTreeNodePrimitive> = \n TNode[\"data\"] extends StructPrimitive<infer TFields, any, any>\n ? StructUpdateValue<TFields>\n : InferUpdateInput<TNode[\"data\"]>;\n\n/**\n * Helper type to infer the input type for node data (respects field defaults).\n * Uses StructSetInput directly so that:\n * - Fields that are required AND have no default must be provided\n * - Fields that are optional OR have defaults can be omitted\n * \n * This bypasses the struct-level NeedsValue wrapper since tree inserts\n * always require a data object (even if empty for all-optional fields).\n */\nexport type TreeNodeDataSetInput<TNode extends AnyTreeNodePrimitive> = \n TNode[\"data\"] extends StructPrimitive<infer TFields, any, any>\n ? StructSetInput<TFields>\n : InferSetInput<TNode[\"data\"]>;\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 /** Updates only the specified data fields (partial update, handles nested structs recursively) */\n update(value: TreeNodeUpdateValue<TNode>): void;\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 (applies defaults for node data) */\n insertFirst<TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n nodeType: TNode,\n data: TreeNodeDataSetInput<TNode>\n ): string;\n \n /** Insert a new node as the last child (applies defaults for node data) */\n insertLast<TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n nodeType: TNode,\n data: TreeNodeDataSetInput<TNode>\n ): string;\n \n /** Insert a new node at a specific index among siblings (applies defaults for node data) */\n insertAt<TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n index: number,\n nodeType: TNode,\n data: TreeNodeDataSetInput<TNode>\n ): string;\n \n /** Insert a new node after a sibling (applies defaults for node data) */\n insertAfter<TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: TreeNodeDataSetInput<TNode>\n ): string;\n \n /** Insert a new node before a sibling (applies defaults for node data) */\n insertBefore<TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: TreeNodeDataSetInput<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 /** Updates only the specified data fields of a node (partial update) */\n updateAt<TNode extends AnyTreeNodePrimitive>(\n id: string,\n nodeType: TNode,\n value: TreeNodeUpdateValue<TNode>\n ): void;\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\n/** Input type for tree set() - tree state */\nexport type TreeSetInput<TRoot extends AnyTreeNodePrimitive> = TreeState<TRoot>;\n\n/** Input type for tree update() - same as set() for trees */\nexport type TreeUpdateInput<TRoot extends AnyTreeNodePrimitive> = TreeState<TRoot>;\n\nexport class TreePrimitive<TRoot extends AnyTreeNodePrimitive, TRequired extends boolean = false, THasDefault extends boolean = false>\n implements Primitive<TreeState<TRoot>, TreeProxy<TRoot>, TRequired, THasDefault, TreeSetInput<TRoot>, TreeUpdateInput<TRoot>>\n{\n readonly _tag = \"TreePrimitive\" as const;\n readonly _State!: TreeState<TRoot>;\n readonly _Proxy!: TreeProxy<TRoot>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TSetInput!: TreeSetInput<TRoot>;\n readonly TUpdateInput!: TreeUpdateInput<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, true, THasDefault> {\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, TRequired, true> {\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, TRequired, THasDefault> {\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 const dataProxy = nodeType.data._internal.createProxy(env, nodePath) as InferProxy<TNode[\"data\"]>;\n return {\n id: nodeState.id,\n type: nodeType.type as InferTreeNodeType<TNode>,\n data: dataProxy,\n get: () => nodeState as TypedTreeNodeState<TNode>,\n update: (value: TreeNodeUpdateValue<TNode>) => {\n // Delegate to the data proxy's update method\n (dataProxy as { update: (v: unknown) => void }).update(value);\n },\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: TreeNodeDataSetInput<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 // Apply defaults to node data\n const mergedData = applyDefaults(nodeType.data as AnyPrimitive, data as Partial<InferTreeNodeDataState<TNode>>) as InferTreeNodeDataState<TNode>;\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data: mergedData,\n })\n );\n\n return id;\n },\n\n insertLast: <TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n nodeType: TNode,\n data: TreeNodeDataSetInput<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 // Apply defaults to node data\n const mergedData = applyDefaults(nodeType.data as AnyPrimitive, data as Partial<InferTreeNodeDataState<TNode>>) as InferTreeNodeDataState<TNode>;\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data: mergedData,\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: TreeNodeDataSetInput<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 // Apply defaults to node data\n const mergedData = applyDefaults(nodeType.data as AnyPrimitive, data as Partial<InferTreeNodeDataState<TNode>>) as InferTreeNodeDataState<TNode>;\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data: mergedData,\n })\n );\n\n return id;\n },\n\n insertAfter: <TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: TreeNodeDataSetInput<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 // Apply defaults to node data\n const mergedData = applyDefaults(nodeType.data as AnyPrimitive, data as Partial<InferTreeNodeDataState<TNode>>) as InferTreeNodeDataState<TNode>;\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data: mergedData,\n })\n );\n\n return id;\n },\n\n insertBefore: <TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: TreeNodeDataSetInput<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 // Apply defaults to node data\n const mergedData = applyDefaults(nodeType.data as AnyPrimitive, data as Partial<InferTreeNodeDataState<TNode>>) as InferTreeNodeDataState<TNode>;\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data: mergedData,\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 updateAt: <TNode extends AnyTreeNodePrimitive>(\n id: string,\n nodeType: TNode,\n value: TreeNodeUpdateValue<TNode>\n ): void => {\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 const dataProxy = nodeType.data._internal.createProxy(env, nodePath);\n // Delegate to the data proxy's update method\n (dataProxy as { update: (v: unknown) => void }).update(value);\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, false, false> =>\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 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"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["result: Record<string, unknown>","OperationDefinition.make","Operation.fromDefinition","OperationPath.pathsOverlap","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","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>","TreeNodeSelf: TreeNodeSelfType","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"],"sources":["../src/primitives/shared.ts","../src/OperationDefinition.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/Transform.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 * \n * @typeParam TState - The state type this primitive holds\n * @typeParam TProxy - The proxy type for interacting with this primitive\n * @typeParam TDefined - Whether the value is guaranteed to be defined (via required() or default())\n * @typeParam THasDefault - Whether this primitive has a default value\n */\nexport interface Primitive<TState, TProxy, TRequired extends boolean = false, THasDefault extends boolean = false, TSetInput = unknown, TUpdateInput = unknown> {\n readonly _tag: string;\n readonly _State: TState;\n readonly _Proxy: TProxy;\n readonly _TRequired: TRequired;\n readonly _THasDefault: THasDefault;\n readonly _internal: PrimitiveInternal<TState, TProxy>;\n readonly TSetInput: TSetInput;\n readonly TUpdateInput: TUpdateInput;\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, any, any>;\n \n /**\n * Infer the state type from a primitive.\n */\n export type InferState<T> = T extends Primitive<infer S, any, any, 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, any, any> ? P : never;\n\n /**\n * Infer the SetInput type from a primitive.\n * Works with both Primitive interface types and types with a TSetInput property (like TreeNodePrimitive).\n */\n export type InferSetInput<T> = \n T extends Primitive<any, any, any, any, infer S, any> ? S : \n T extends { TSetInput: infer S } ? S : \n never;\n\n /**\n * Infer the UpdateInput type from a primitive.\n * Works with both Primitive interface types and types with a TUpdateInput property (like TreeNodePrimitive).\n */\n export type InferUpdateInput<T> = \n T extends Primitive<any, any, any, any, any, infer U> ? U : \n T extends { TUpdateInput: infer U } ? U : \n never;\n \n /**\n * Helper type to conditionally add undefined based on TRequired and THasDefault.\n * When TRequired is false and THasDefault is false, the value may be undefined.\n * Otherwise, the value is guaranteed to be defined.\n */\n export type MaybeUndefined<T, TRequired extends boolean, THasDefault extends boolean> = TRequired extends false ? THasDefault extends false ? Optional<T> : T : T;\n\n export type Optional<T> = T | undefined;\n\n /**\n * Helper type to conditionally add undefined based on TRequired and THasDefault.\n * When TRequired is true and THasDefault is false, the value must be provided.\n * Otherwise, the value may be undefined.\n */\n export type NeedsValue<T, TRequired extends boolean, THasDefault extends boolean> = TRequired extends true ? THasDefault extends false ? T : Optional<T> : Optional<T>;\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, any, any>\n ? P extends { toSnapshot(): infer S } ? S : never\n : never;\n\n /**\n * Extract THasDefault from a primitive.\n */\n export type HasDefault<T> = T extends Primitive<any, any, any, infer H> ? H : false;\n\n /**\n * Extract TDefined from a primitive.\n */\n export type IsDefined<T> = T extends Primitive<any, any, infer D, any> ? D : false;\n\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// =============================================================================\n// Default Value Utilities\n// =============================================================================\n\n/**\n * Applies default values to a partial input, recursively handling nested structs.\n * \n * Uses a two-layer approach:\n * 1. First, get the struct's initial state (which includes struct-level defaults)\n * 2. Then, layer the provided values on top\n * 3. Finally, ensure nested structs are recursively processed\n * \n * @param primitive - The primitive definition containing field information\n * @param value - The partial value provided by the user\n * @returns The value with defaults applied for missing fields\n */\nexport function applyDefaults<T extends AnyPrimitive>(\n primitive: T,\n value: Partial<InferState<T>>\n): InferState<T> {\n // Only structs need default merging\n if (primitive._tag === \"StructPrimitive\") {\n const structPrimitive = primitive as unknown as { \n fields: Record<string, AnyPrimitive>;\n _internal: { getInitialState: () => Record<string, unknown> | undefined };\n };\n \n // Start with the struct's initial state (struct-level default or field defaults)\n const structInitialState = structPrimitive._internal.getInitialState() ?? {};\n \n // Layer the provided values on top of initial state\n const result: Record<string, unknown> = { ...structInitialState, ...value };\n \n for (const key in structPrimitive.fields) {\n const fieldPrimitive = structPrimitive.fields[key]!;\n \n if (result[key] === undefined) {\n // Field still not provided after merging - try individual field default\n const fieldDefault = fieldPrimitive._internal.getInitialState();\n if (fieldDefault !== undefined) {\n result[key] = fieldDefault;\n }\n } else if (fieldPrimitive._tag === \"StructPrimitive\" && typeof result[key] === \"object\" && result[key] !== null) {\n // Recursively apply defaults to nested structs\n result[key] = applyDefaults(fieldPrimitive, result[key] as Partial<InferState<typeof fieldPrimitive>>);\n }\n }\n \n return result as InferState<T>;\n }\n \n // For non-struct primitives, return the value as-is\n return value as InferState<T>;\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}","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, NeedsValue } from \"./shared\";\nimport { runValidators, isCompatibleOperation, ValidationError } from \"./shared\";\n\n\ntype InferSetInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<string, TRequired, THasDefault>\ntype InferUpdateInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<string, TRequired, THasDefault>\n\n// =============================================================================\n// String Primitive\n// =============================================================================\n\nexport interface StringProxy<TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current string value */\n get(): MaybeUndefined<string, TRequired, THasDefault>;\n /** Sets the string value, generating a string.set operation */\n set(value: InferSetInput<TRequired, THasDefault>): void;\n /** This is the same as set. Updates the string value, generating a string.set operation */\n update(value: InferUpdateInput<TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the string value for rendering */\n toSnapshot(): MaybeUndefined<string, TRequired, THasDefault>;\n}\n\ninterface StringPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: string | undefined;\n readonly validators: readonly Validator<string>[];\n}\n\nexport class StringPrimitive<TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<string, StringProxy<TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TRequired, THasDefault>, InferUpdateInput<TRequired, THasDefault>> {\n readonly _tag = \"StringPrimitive\" as const;\n readonly _State!: string;\n readonly _Proxy!: StringProxy<TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TRequired, THasDefault>;\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, THasDefault> {\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<TRequired, 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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): StringProxy<TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<string, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as string | undefined;\n return (state ?? defaultValue) as MaybeUndefined<string, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n update: (value: InferUpdateInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<string, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as string | undefined;\n return (state ?? defaultValue) as MaybeUndefined<string, TRequired, THasDefault>;\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, 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, NeedsValue, InferUpdateInput, InferSetInput } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators, applyDefaults } from \"./shared\";\n\n// =============================================================================\n// Struct Set Input Types\n// =============================================================================\n\n/**\n * Determines if a field is required for set() operations.\n * A field is required if: TRequired is true AND THasDefault is false\n */\ntype IsRequiredForSet<T> = T extends Primitive<any, any, true, false> ? true : false;\n\n/**\n * Extract keys of fields that are required for set() (required without default).\n */\ntype RequiredSetKeys<TFields extends Record<string, AnyPrimitive>> = {\n [K in keyof TFields]: IsRequiredForSet<TFields[K]> extends true ? K : never;\n}[keyof TFields];\n\n/**\n * Extract keys of fields that are optional for set() (has default OR not required).\n */\ntype OptionalSetKeys<TFields extends Record<string, AnyPrimitive>> = {\n [K in keyof TFields]: IsRequiredForSet<TFields[K]> extends true ? never : K;\n}[keyof TFields];\n\n/**\n * Compute the input type for set() operations on a struct.\n * Required fields (required without default) must be provided.\n * Optional fields (has default or not required) can be omitted.\n * Uses each field's TSetInput type to handle nested structs correctly.\n */\nexport type StructSetInput<TFields extends Record<string, AnyPrimitive>> = \n { readonly [K in RequiredSetKeys<TFields>]: InferSetInput<TFields[K]> } &\n { readonly [K in OptionalSetKeys<TFields>]?: InferSetInput<TFields[K]> };\n\n/**\n * Input type for set() - respects required/default status of the struct.\n * If the struct is required without a default, the value must be provided.\n * The value itself uses StructSetInput which handles field-level required/default logic.\n */\ntype InferStructSetInput<TFields extends Record<string, AnyPrimitive>, TRequired extends boolean, THasDefault extends boolean> = \n NeedsValue<StructSetInput<TFields>, TRequired, THasDefault>;\n\n/**\n * Input type for update() - always partial since update only modifies specified fields.\n * For nested structs, allows recursive partial updates.\n */\ntype InferStructUpdateInput<TFields extends Record<string, AnyPrimitive>> = StructUpdateValue<TFields>;\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 a partial update type.\n * Uses each field's TUpdateInput type, which handles nested updates recursively.\n */\nexport type StructUpdateValue<TFields extends Record<string, AnyPrimitive>> = {\n readonly [K in keyof TFields]?: InferUpdateInput<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>, TRequired extends boolean = false, THasDefault extends boolean = false> = {\n readonly [K in keyof TFields]: InferProxy<TFields[K]>;\n} & {\n /** Gets the entire struct value */\n get(): MaybeUndefined<InferStructState<TFields>, TRequired, THasDefault>;\n /** Sets the entire struct value (only fields that are required without defaults must be provided) */\n set(value: InferStructSetInput<TFields, TRequired, THasDefault>): void;\n /** Updates only the specified fields (partial update, handles nested structs recursively) */\n update(value: InferStructUpdateInput<TFields>): void;\n /** Returns a readonly snapshot of the struct for rendering */\n toSnapshot(): MaybeUndefined<InferStructSnapshot<TFields>, TRequired, THasDefault>;\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>, TRequired extends boolean = false, THasDefault extends boolean = false>\n implements Primitive<InferStructState<TFields>, StructProxy<TFields, TRequired, THasDefault>, TRequired, THasDefault, InferStructSetInput<TFields, TRequired, THasDefault>, InferStructUpdateInput<TFields>>\n{\n readonly _tag = \"StructPrimitive\" as const;\n readonly _State!: InferStructState<TFields>;\n readonly _Proxy!: StructProxy<TFields, TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TSetInput!: InferStructSetInput<TFields, TRequired, THasDefault>;\n readonly TUpdateInput!: InferStructUpdateInput<TFields>;\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, THasDefault> {\n return new StructPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this struct */\n default(defaultValue: StructSetInput<TFields>): StructPrimitive<TFields, TRequired, true> {\n // Apply defaults to the provided value\n const merged = applyDefaults(this as AnyPrimitive, defaultValue as Partial<InferStructState<TFields>>) as InferStructState<TFields>;\n return new StructPrimitive({\n ...this._schema,\n defaultValue: merged,\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, TRequired, THasDefault> {\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, TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): StructProxy<TFields, TRequired, THasDefault> => {\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/update/toSnapshot methods\n const base = {\n get: (): MaybeUndefined<InferStructState<TFields>, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as InferStructState<TFields> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferStructState<TFields>, TRequired, THasDefault>;\n },\n set: (value: InferStructSetInput<TFields, TRequired, THasDefault>) => {\n // Apply defaults for missing fields\n const merged = applyDefaults(this as AnyPrimitive, value as Partial<InferStructState<TFields>>) as InferStructState<TFields>;\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, merged)\n );\n },\n update: (value: InferStructUpdateInput<TFields>) => {\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n const fieldValue = value[key as keyof TFields];\n if (fieldValue === undefined) continue; // Skip undefined values\n\n const fieldPrimitive = fields[key as keyof TFields];\n if (!fieldPrimitive) continue; // Skip unknown fields\n\n const fieldPath = operationPath.append(key);\n const fieldProxy = fieldPrimitive._internal.createProxy(env, fieldPath);\n\n // Check if this is a nested struct and value is a plain object (partial update)\n if (\n fieldPrimitive._tag === \"StructPrimitive\" &&\n typeof fieldValue === \"object\" &&\n fieldValue !== null &&\n !Array.isArray(fieldValue)\n ) {\n // Recursively update nested struct\n (fieldProxy as { update: (v: unknown) => void }).update(fieldValue);\n } else {\n // Set the field value directly\n (fieldProxy as { set: (v: unknown) => void }).set(fieldValue);\n }\n }\n }\n },\n toSnapshot: (): MaybeUndefined<InferStructSnapshot<TFields>, TRequired, THasDefault> => {\n const snapshot = buildSnapshot();\n return snapshot as MaybeUndefined<InferStructSnapshot<TFields>, TRequired, THasDefault>;\n },\n };\n\n // Use a JavaScript Proxy to intercept field access\n return new globalThis.Proxy(base as StructProxy<TFields, TRequired, THasDefault>, {\n get: (target, prop, _receiver) => {\n // Return base methods (get, set, update, toSnapshot)\n if (prop === \"get\") {\n return target.get;\n }\n if (prop === \"set\") {\n return target.set;\n }\n if (prop === \"update\") {\n return target.update;\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 === \"update\" || 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, 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, NeedsValue } from \"./shared\";\nimport { runValidators, isCompatibleOperation, ValidationError } from \"./shared\";\n\n\ntype InferSetInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<boolean, TRequired, THasDefault>\ntype InferUpdateInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<boolean, TRequired, THasDefault>\n\nexport interface BooleanProxy<TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current boolean value */\n get(): MaybeUndefined<boolean, TRequired, THasDefault>;\n /** Sets the boolean value, generating a boolean.set operation */\n set(value: InferSetInput<TRequired, THasDefault>): void;\n /** This is the same as set. Updates the boolean value, generating a boolean.set operation */\n update(value: InferUpdateInput<TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the boolean value for rendering */\n toSnapshot(): MaybeUndefined<boolean, TRequired, THasDefault>;\n}\n\ninterface BooleanPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: boolean | undefined;\n readonly validators: readonly Validator<boolean>[];\n}\n\nexport class BooleanPrimitive<TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<boolean, BooleanProxy<TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TRequired, THasDefault>, InferUpdateInput<TRequired, THasDefault>> {\n readonly _tag = \"BooleanPrimitive\" as const;\n readonly _State!: boolean;\n readonly _Proxy!: BooleanProxy<TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TRequired, THasDefault>;\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, THasDefault> {\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<TRequired, 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<TRequired, THasDefault> {\n return new BooleanPrimitive({\n ...this._schema,\n validators: [...this._schema.validators, { validate: fn, message }],\n });\n }\n\n readonly _internal: PrimitiveInternal<boolean, BooleanProxy<TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): BooleanProxy<TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<boolean, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as boolean | undefined;\n return (state ?? defaultValue) as MaybeUndefined<boolean, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n update: (value: InferUpdateInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<boolean, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as boolean | undefined;\n return (state ?? defaultValue) as MaybeUndefined<boolean, TRequired, THasDefault>;\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, 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, NeedsValue } from \"./shared\";\nimport { ValidationError, runValidators, isCompatibleOperation } from \"./shared\";\n\n\ntype InferSetInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<number, TRequired, THasDefault>\ntype InferUpdateInput<TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<number, TRequired, THasDefault>\n\nexport interface NumberProxy<TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current number value */\n get(): MaybeUndefined<number, TRequired, THasDefault>;\n /** Sets the number value, generating a number.set operation */\n set(value: InferSetInput<TRequired, THasDefault>): void;\n /** This is the same as set. Updates the number value, generating a number.set operation */\n update(value: InferUpdateInput<TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the number value for rendering */\n toSnapshot(): MaybeUndefined<number, TRequired, THasDefault>;\n}\n\ninterface NumberPrimitiveSchema {\n readonly required: boolean;\n readonly defaultValue: number | undefined;\n readonly validators: readonly Validator<number>[];\n}\n\nexport class NumberPrimitive<TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<number, NumberProxy<TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TRequired, THasDefault>, InferUpdateInput<TRequired, THasDefault>> {\n readonly _tag = \"NumberPrimitive\" as const;\n readonly _State!: number;\n readonly _Proxy!: NumberProxy<TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TRequired, THasDefault>;\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, THasDefault> {\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<TRequired, 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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\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<TRequired, THasDefault> {\n return this.refine(\n (v) => v > 0,\n \"Number must be positive\"\n );\n }\n\n /** Must be negative (< 0) */\n negative(): NumberPrimitive<TRequired, THasDefault> {\n return this.refine(\n (v) => v < 0,\n \"Number must be negative\"\n );\n }\n\n /** Must be an integer */\n int(): NumberPrimitive<TRequired, THasDefault> {\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<TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): NumberProxy<TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<number, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as number | undefined;\n return (state ?? defaultValue) as MaybeUndefined<number, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n update: (value: InferUpdateInput<TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<number, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as number | undefined;\n return (state ?? defaultValue) as MaybeUndefined<number, TRequired, THasDefault>;\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, 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, NeedsValue } from \"./shared\";\nimport { ValidationError, runValidators, isCompatibleOperation } from \"./shared\";\n\n\n/** Valid literal types */\nexport type LiteralValue = string | number | boolean | null;\n\ntype InferSetInput<T extends LiteralValue, TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<T, TRequired, THasDefault>\ntype InferUpdateInput<T extends LiteralValue, TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<T, TRequired, THasDefault>\n\nexport interface LiteralProxy<T extends LiteralValue, TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current literal value */\n get(): MaybeUndefined<T, TRequired, THasDefault>;\n /** Sets the literal value (must match the exact literal type) */\n set(value: InferSetInput<T, TRequired, THasDefault>): void;\n /** This is the same as set. Updates the literal value, generating a literal.set operation */\n update(value: InferUpdateInput<T, TRequired, THasDefault>): void;\n /** Returns a readonly snapshot of the literal value for rendering */\n toSnapshot(): MaybeUndefined<T, TRequired, THasDefault>;\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, TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<T, LiteralProxy<T, TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<T, TRequired, THasDefault>, InferUpdateInput<T, TRequired, THasDefault>> {\n readonly _tag = \"LiteralPrimitive\" as const;\n readonly _State!: T;\n readonly _Proxy!: LiteralProxy<T, TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<T, TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<T, TRequired, THasDefault>;\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, THasDefault> {\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, TRequired, 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, TRequired, THasDefault>> = {\n createProxy: (env: ProxyEnvironment.ProxyEnvironment, operationPath: OperationPath.OperationPath): LiteralProxy<T, TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n return {\n get: (): MaybeUndefined<T, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as T | undefined;\n return (state ?? defaultValue) as MaybeUndefined<T, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<T, TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n update: (value: InferUpdateInput<T, TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n toSnapshot: (): MaybeUndefined<T, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as T | undefined;\n return (state ?? defaultValue) as MaybeUndefined<T, TRequired, THasDefault>;\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, 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, InferSetInput } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators, applyDefaults } from \"./shared\";\nimport { StructPrimitive, StructSetInput } from \"./Struct\";\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\n/**\n * Compute the input type for array element values.\n * Uses StructSetInput directly for struct elements so that:\n * - Fields that are required AND have no default must be provided\n * - Fields that are optional OR have defaults can be omitted\n * \n * For non-struct elements, falls back to InferSetInput.\n */\nexport type ArrayElementSetInput<TElement extends AnyPrimitive> = \n TElement extends StructPrimitive<infer TFields, any, any>\n ? StructSetInput<TFields>\n : InferSetInput<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, applies defaults) */\n set(values: readonly ArrayElementSetInput<TElement>[]): void;\n /** Appends a value to the end of the array (applies defaults for struct elements) */\n push(value: ArrayElementSetInput<TElement>): void;\n /** Inserts a value at the specified visual index (applies defaults for struct elements) */\n insertAt(index: number, value: ArrayElementSetInput<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\n/** Input type for array set() - an array of element set inputs */\nexport type ArraySetInput<TElement extends AnyPrimitive> = readonly ArrayElementSetInput<TElement>[];\n\n/** Input type for array update() - same as set() for arrays */\nexport type ArrayUpdateInput<TElement extends AnyPrimitive> = readonly ArrayElementSetInput<TElement>[];\n\nexport class ArrayPrimitive<TElement extends AnyPrimitive, TRequired extends boolean = false, THasDefault extends boolean = false>\n implements Primitive<ArrayState<TElement>, ArrayProxy<TElement>, TRequired, THasDefault, ArraySetInput<TElement>, ArrayUpdateInput<TElement>>\n{\n readonly _tag = \"ArrayPrimitive\" as const;\n readonly _State!: ArrayState<TElement>;\n readonly _Proxy!: ArrayProxy<TElement>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TSetInput!: ArraySetInput<TElement>;\n readonly TUpdateInput!: ArrayUpdateInput<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, true, THasDefault> {\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, TRequired, true> {\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, TRequired, THasDefault> {\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, TRequired, THasDefault> {\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, TRequired, THasDefault> {\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 // Helper to apply defaults for element values\n const applyElementDefaults = (value: ArrayElementSetInput<TElement>): InferState<TElement> => {\n return applyDefaults(elementPrimitive, value as Partial<InferState<TElement>>) as InferState<TElement>;\n };\n\n return {\n get: (): ArrayState<TElement> => {\n return getCurrentState();\n },\n\n set: (values: readonly ArrayElementSetInput<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 // Apply defaults to element value\n const mergedValue = applyElementDefaults(value);\n entries.push({ id, pos, value: mergedValue });\n prevPos = pos;\n }\n \n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, entries)\n );\n },\n\n push: (value: ArrayElementSetInput<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 // Apply defaults to element value\n const mergedValue = applyElementDefaults(value);\n \n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, { id, pos, value: mergedValue })\n );\n },\n\n insertAt: (index: number, value: ArrayElementSetInput<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 // Apply defaults to element value\n const mergedValue = applyElementDefaults(value);\n \n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, { id, pos, value: mergedValue })\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, false, false> =>\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, InferSetInput, InferUpdateInput } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { runValidators } from \"./shared\";\n\n/**\n * Type to infer SetInput from a lazy thunk\n */\nexport type InferLazySetInput<T extends () => AnyPrimitive> = InferSetInput<ReturnType<T>>;\n\n/**\n * Type to infer UpdateInput from a lazy thunk\n */\nexport type InferLazyUpdateInput<T extends () => AnyPrimitive> = InferUpdateInput<ReturnType<T>>;\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>, false, false, InferLazySetInput<TThunk>, InferLazyUpdateInput<TThunk>>\n{\n readonly _tag = \"LazyPrimitive\" as const;\n readonly _State!: InferLazyState<TThunk>;\n readonly _Proxy!: InferLazyProxy<TThunk>;\n readonly _TRequired!: false;\n readonly _THasDefault!: false;\n readonly TSetInput!: InferLazySetInput<TThunk>;\n readonly TUpdateInput!: InferLazyUpdateInput<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, InferSetInput } from \"../Primitive\";\nimport { ValidationError } from \"../Primitive\";\nimport { LiteralPrimitive } from \"./Literal\";\nimport { StructPrimitive, InferStructState } from \"./Struct\";\nimport { runValidators, applyDefaults } from \"./shared\";\n\n\n/**\n * Type constraint for union variants - must be struct primitives\n */\nexport type UnionVariants = Record<string, StructPrimitive<any, 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 * Compute the input type for union.set() operations.\n * Uses each variant's TSetInput type.\n */\nexport type UnionSetInput<TVariants extends UnionVariants> = {\n [K in keyof TVariants]: InferSetInput<TVariants[K]>;\n}[keyof TVariants];\n\n/**\n * Proxy for accessing union variants\n */\nexport interface UnionProxy<TVariants extends UnionVariants, _TDiscriminator extends string, TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current union value */\n get(): MaybeUndefined<InferUnionState<TVariants>, TRequired, THasDefault>;\n \n /** Sets the entire union value (applies defaults for variant fields) */\n set(value: UnionSetInput<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>, TRequired, THasDefault>;\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\", TRequired extends boolean = false, THasDefault extends boolean = false>\n implements Primitive<InferUnionState<TVariants>, UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>, TRequired, THasDefault, UnionSetInput<TVariants>, UnionSetInput<TVariants>>\n{\n readonly _tag = \"UnionPrimitive\" as const;\n readonly _State!: InferUnionState<TVariants>;\n readonly _Proxy!: UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TSetInput!: UnionSetInput<TVariants>;\n readonly TUpdateInput!: UnionSetInput<TVariants>;\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, THasDefault> {\n return new UnionPrimitive({\n ...this._schema,\n required: true,\n });\n }\n\n /** Set a default value for this union */\n default(defaultValue: UnionSetInput<TVariants>): UnionPrimitive<TVariants, TDiscriminator, true, true> {\n // Apply defaults to the variant\n const merged = this._applyVariantDefaults(defaultValue as Partial<InferUnionState<TVariants>>);\n return new UnionPrimitive({\n ...this._schema,\n defaultValue: merged,\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, any>;\n if (literalPrimitive.literal === discriminatorValue) {\n return key;\n }\n }\n }\n return undefined;\n }\n\n /** Apply defaults to a variant value based on the discriminator */\n private _applyVariantDefaults(value: Partial<InferUnionState<TVariants>>): InferUnionState<TVariants> {\n const variantKey = this._findVariantKey(value as InferUnionState<TVariants>);\n if (!variantKey) {\n return value as InferUnionState<TVariants>;\n }\n \n const variantPrimitive = this._schema.variants[variantKey]!;\n return applyDefaults(variantPrimitive as AnyPrimitive, value) as InferUnionState<TVariants>;\n }\n\n readonly _internal: PrimitiveInternal<InferUnionState<TVariants>, UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault>> = {\n createProxy: (\n env: ProxyEnvironment.ProxyEnvironment,\n operationPath: OperationPath.OperationPath\n ): UnionProxy<TVariants, TDiscriminator, TRequired, THasDefault> => {\n const variants = this._schema.variants;\n const defaultValue = this._schema.defaultValue;\n\n return {\n get: (): MaybeUndefined<InferUnionState<TVariants>, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as InferUnionState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferUnionState<TVariants>, TRequired, THasDefault>;\n },\n set: (value: UnionSetInput<TVariants>) => {\n // Apply defaults for the variant\n const merged = this._applyVariantDefaults(value as Partial<InferUnionState<TVariants>>);\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, merged)\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>, TRequired, THasDefault> => {\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>, TRequired, THasDefault>;\n }\n \n const variantKey = this._findVariantKey(effectiveState);\n if (!variantKey) {\n return undefined as MaybeUndefined<InferUnionSnapshot<TVariants>, TRequired, THasDefault>;\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>, TRequired, THasDefault>;\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, false>;\nexport function Union<TVariants extends UnionVariants, TDiscriminator extends string>(\n options: UnionOptions<TVariants, TDiscriminator>\n): UnionPrimitive<TVariants, TDiscriminator, false, false>;\nexport function Union<TVariants extends UnionVariants, TDiscriminator extends string = \"type\">(\n options: UnionOptions<TVariants, TDiscriminator>\n): UnionPrimitive<TVariants, TDiscriminator, false, 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, NeedsValue } 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\ntype InferSetInput<TVariants extends readonly ScalarPrimitive[], TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<InferEitherState<TVariants>, TRequired, THasDefault>\ntype InferUpdateInput<TVariants extends readonly ScalarPrimitive[], TRequired extends boolean = false, THasDefault extends boolean = false> = NeedsValue<InferEitherState<TVariants>, TRequired, THasDefault>\n\n/**\n * Scalar primitives that can be used as variants in Either\n */\nexport type ScalarPrimitive =\n | StringPrimitive<any, any>\n | NumberPrimitive<any, any>\n | BooleanPrimitive<any, any>\n | LiteralPrimitive<any, 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[], TRequired extends boolean = false, THasDefault extends boolean = false> {\n /** Gets the current value */\n get(): MaybeUndefined<InferEitherState<TVariants>, TRequired, THasDefault>;\n\n /** Sets the value to any of the allowed variant types */\n set(value: InferSetInput<TVariants, TRequired, THasDefault>): void;\n\n /** This is the same as set. Updates the value, generating an either.set operation */\n update(value: InferUpdateInput<TVariants, TRequired, THasDefault>): 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>, TRequired, THasDefault>;\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[], TRequired extends boolean = false, THasDefault extends boolean = false>\n implements Primitive<InferEitherState<TVariants>, EitherProxy<TVariants, TRequired, THasDefault>, TRequired, THasDefault, InferSetInput<TVariants, TRequired, THasDefault>, InferUpdateInput<TVariants, TRequired, THasDefault>>\n{\n readonly _tag = \"EitherPrimitive\" as const;\n readonly _State!: InferEitherState<TVariants>;\n readonly _Proxy!: EitherProxy<TVariants, TRequired, THasDefault>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TUpdateInput!: InferUpdateInput<TVariants, TRequired, THasDefault>;\n readonly TSetInput!: InferSetInput<TVariants, TRequired, THasDefault>;\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, THasDefault> {\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, TRequired, 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, 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, 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, TRequired, THasDefault>> = {\n createProxy: (\n env: ProxyEnvironment.ProxyEnvironment,\n operationPath: OperationPath.OperationPath\n ): EitherProxy<TVariants, TRequired, THasDefault> => {\n const defaultValue = this._schema.defaultValue;\n\n return {\n get: (): MaybeUndefined<InferEitherState<TVariants>, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as InferEitherState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferEitherState<TVariants>, TRequired, THasDefault>;\n },\n set: (value: InferSetInput<TVariants, TRequired, THasDefault>) => {\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.set, value)\n );\n },\n update: (value: InferUpdateInput<TVariants, TRequired, THasDefault>) => {\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>, TRequired, THasDefault> => {\n const state = env.getState(operationPath) as InferEitherState<TVariants> | undefined;\n return (state ?? defaultValue) as MaybeUndefined<InferEitherSnapshot<TVariants>, TRequired, THasDefault>;\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, 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 type { InferState } from \"../Primitive\";\nimport type { InferSetInput, InferUpdateInput } from \"./shared\";\nimport { StructPrimitive } from \"./Struct\";\n\n/**\n * Symbol used to identify the Self placeholder\n */\nconst TreeNodeSelfSymbol = Symbol.for(\"TreeNode.Self\");\n\n/**\n * Branded type for TreeNodeSelf - distinguishable at compile time\n */\ndeclare const SelfBrand: unique symbol;\nexport interface TreeNodeSelfType {\n readonly _tag: \"TreeNodeSelf\";\n readonly _brand: typeof SelfBrand;\n}\n\n/**\n * Special placeholder for self-referential tree nodes.\n * Use this in the children array when a node type can contain itself.\n * \n * @example\n * ```typescript\n * const FolderNode = TreeNode(\"folder\", {\n * data: Struct({ name: String() }),\n * children: [TreeNodeSelf], // Folder can contain other folders\n * });\n * ```\n */\nexport const TreeNodeSelf: TreeNodeSelfType = { _tag: \"TreeNodeSelf\", _symbol: TreeNodeSelfSymbol } as unknown as TreeNodeSelfType;\n\n/**\n * Check if a value is the Self placeholder\n */\nconst isSelf = (value: unknown): boolean => {\n return typeof value === \"object\" && value !== null && \"_symbol\" in value && (value as any)._symbol === TreeNodeSelfSymbol;\n};\n\n/**\n * Type utility to resolve Self placeholders to the actual node type\n */\ntype ResolveSelf<T, TSelf extends AnyTreeNodePrimitive> = \n T extends TreeNodeSelfType ? TSelf : T;\n\n/**\n * Type utility to resolve all children in a tuple, replacing Self with the node type\n */\ntype ResolveChildrenUnion<TChildren, TSelf extends AnyTreeNodePrimitive> = \n TChildren extends readonly (infer U)[] \n ? ResolveSelf<U, TSelf> \n : never;\n\n/**\n * The type for children - either a direct array or a lazy function (for self-referential nodes).\n */\nexport type TreeNodeChildrenInput = readonly (AnyTreeNodePrimitive | TreeNodeSelfType)[] | (() => readonly (AnyTreeNodePrimitive | TreeNodeSelfType)[]);\n\n/**\n * Any TreeNodePrimitive type - used for generic constraints.\n */\nexport type AnyTreeNodePrimitive = TreeNodePrimitive<string, StructPrimitive<any>, any>;\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> = \n T extends TreeNodePrimitive<any, any, infer TChildren> ? TChildren : never;\n\n/**\n * Configuration for a TreeNode primitive\n */\nexport interface TreeNodeConfig<\n TData extends StructPrimitive<any>,\n TChildren extends readonly (AnyTreeNodePrimitive | TreeNodeSelfType)[]\n> {\n readonly data: TData;\n readonly children: TChildren | (() => 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 AnyTreeNodePrimitive = AnyTreeNodePrimitive\n> {\n readonly _tag = \"TreeNodePrimitive\" as const;\n readonly _Type!: TType;\n readonly _Data!: TData;\n readonly _Children!: TChildren;\n \n /** For InferSetInput compatibility - delegates to the data struct's set input type */\n readonly TSetInput!: InferSetInput<TData>;\n /** For InferUpdateInput compatibility - delegates to the data struct's update input type */\n readonly TUpdateInput!: InferUpdateInput<TData>;\n\n private readonly _type: TType;\n private readonly _data: TData;\n private readonly _children: TreeNodeChildrenInput;\n private _resolvedChildren: readonly AnyTreeNodePrimitive[] | undefined;\n\n constructor(type: TType, config: TreeNodeConfig<TData, readonly (AnyTreeNodePrimitive | TreeNodeSelfType)[]>) {\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, replaces Self with this node) */\n get children(): readonly AnyTreeNodePrimitive[] {\n if (this._resolvedChildren === undefined) {\n const resolved = typeof this._children === \"function\"\n ? (this._children as () => readonly AnyTreeNodePrimitive[])()\n : this._children;\n // Replace Self placeholders with this node\n this._resolvedChildren = resolved.map(child => isSelf(child) ? this : child) as readonly AnyTreeNodePrimitive[];\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 const TChildren extends readonly (AnyTreeNodePrimitive | TreeNodeSelfType)[]\n>(\n type: TType,\n config: TreeNodeConfig<TData, TChildren>\n): TreeNodePrimitive<TType, TData, ResolveChildrenUnion<TChildren, TreeNodePrimitive<TType, TData, any>>> =>\n new TreeNodePrimitive(type, config) as TreeNodePrimitive<TType, TData, ResolveChildrenUnion<TChildren, TreeNodePrimitive<TType, TData, any>>>;\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, AnyPrimitive, InferSetInput, InferUpdateInput } from \"./shared\";\nimport { ValidationError, applyDefaults } from \"./shared\";\nimport { runValidators } from \"./shared\";\nimport type { AnyTreeNodePrimitive, InferTreeNodeType, InferTreeNodeDataState, InferTreeNodeChildren } from \"./TreeNode\";\nimport { InferStructState, StructSetInput, StructUpdateValue } from \"./Struct\";\nimport { StructPrimitive } 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 * Helper type to infer the update value type from a TreeNode's data.\n * Uses StructUpdateValue directly to get field-level partial update semantics.\n * All fields are optional in update operations.\n */\nexport type TreeNodeUpdateValue<TNode extends AnyTreeNodePrimitive> = \n TNode[\"data\"] extends StructPrimitive<infer TFields, any, any>\n ? StructUpdateValue<TFields>\n : InferUpdateInput<TNode[\"data\"]>;\n\n/**\n * Helper type to infer the input type for node data (respects field defaults).\n * Uses StructSetInput directly so that:\n * - Fields that are required AND have no default must be provided\n * - Fields that are optional OR have defaults can be omitted\n * \n * This bypasses the struct-level NeedsValue wrapper since tree inserts\n * always require a data object (even if empty for all-optional fields).\n */\nexport type TreeNodeDataSetInput<TNode extends AnyTreeNodePrimitive> = \n TNode[\"data\"] extends StructPrimitive<infer TFields, any, any>\n ? StructSetInput<TFields>\n : InferSetInput<TNode[\"data\"]>;\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 /** Updates only the specified data fields (partial update, handles nested structs recursively) */\n update(value: TreeNodeUpdateValue<TNode>): void;\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 (applies defaults for node data) */\n insertFirst<TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n nodeType: TNode,\n data: TreeNodeDataSetInput<TNode>\n ): string;\n \n /** Insert a new node as the last child (applies defaults for node data) */\n insertLast<TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n nodeType: TNode,\n data: TreeNodeDataSetInput<TNode>\n ): string;\n \n /** Insert a new node at a specific index among siblings (applies defaults for node data) */\n insertAt<TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n index: number,\n nodeType: TNode,\n data: TreeNodeDataSetInput<TNode>\n ): string;\n \n /** Insert a new node after a sibling (applies defaults for node data) */\n insertAfter<TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: TreeNodeDataSetInput<TNode>\n ): string;\n \n /** Insert a new node before a sibling (applies defaults for node data) */\n insertBefore<TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: TreeNodeDataSetInput<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 /** Updates only the specified data fields of a node (partial update) */\n updateAt<TNode extends AnyTreeNodePrimitive>(\n id: string,\n nodeType: TNode,\n value: TreeNodeUpdateValue<TNode>\n ): void;\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\n/** Input type for tree set() - tree state */\nexport type TreeSetInput<TRoot extends AnyTreeNodePrimitive> = TreeState<TRoot>;\n\n/** Input type for tree update() - same as set() for trees */\nexport type TreeUpdateInput<TRoot extends AnyTreeNodePrimitive> = TreeState<TRoot>;\n\nexport class TreePrimitive<TRoot extends AnyTreeNodePrimitive, TRequired extends boolean = false, THasDefault extends boolean = false>\n implements Primitive<TreeState<TRoot>, TreeProxy<TRoot>, TRequired, THasDefault, TreeSetInput<TRoot>, TreeUpdateInput<TRoot>>\n{\n readonly _tag = \"TreePrimitive\" as const;\n readonly _State!: TreeState<TRoot>;\n readonly _Proxy!: TreeProxy<TRoot>;\n readonly _TRequired!: TRequired;\n readonly _THasDefault!: THasDefault;\n readonly TSetInput!: TreeSetInput<TRoot>;\n readonly TUpdateInput!: TreeUpdateInput<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, true, THasDefault> {\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, TRequired, true> {\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, TRequired, THasDefault> {\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 const dataProxy = nodeType.data._internal.createProxy(env, nodePath) as InferProxy<TNode[\"data\"]>;\n return {\n id: nodeState.id,\n type: nodeType.type as InferTreeNodeType<TNode>,\n data: dataProxy,\n get: () => nodeState as TypedTreeNodeState<TNode>,\n update: (value: TreeNodeUpdateValue<TNode>) => {\n // Delegate to the data proxy's update method\n (dataProxy as { update: (v: unknown) => void }).update(value);\n },\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: TreeNodeDataSetInput<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 // Apply defaults to node data\n const mergedData = applyDefaults(nodeType.data as AnyPrimitive, data as Partial<InferTreeNodeDataState<TNode>>) as InferTreeNodeDataState<TNode>;\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data: mergedData,\n })\n );\n\n return id;\n },\n\n insertLast: <TNode extends AnyTreeNodePrimitive>(\n parentId: string | null,\n nodeType: TNode,\n data: TreeNodeDataSetInput<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 // Apply defaults to node data\n const mergedData = applyDefaults(nodeType.data as AnyPrimitive, data as Partial<InferTreeNodeDataState<TNode>>) as InferTreeNodeDataState<TNode>;\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data: mergedData,\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: TreeNodeDataSetInput<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 // Apply defaults to node data\n const mergedData = applyDefaults(nodeType.data as AnyPrimitive, data as Partial<InferTreeNodeDataState<TNode>>) as InferTreeNodeDataState<TNode>;\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data: mergedData,\n })\n );\n\n return id;\n },\n\n insertAfter: <TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: TreeNodeDataSetInput<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 // Apply defaults to node data\n const mergedData = applyDefaults(nodeType.data as AnyPrimitive, data as Partial<InferTreeNodeDataState<TNode>>) as InferTreeNodeDataState<TNode>;\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data: mergedData,\n })\n );\n\n return id;\n },\n\n insertBefore: <TNode extends AnyTreeNodePrimitive>(\n siblingId: string,\n nodeType: TNode,\n data: TreeNodeDataSetInput<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 // Apply defaults to node data\n const mergedData = applyDefaults(nodeType.data as AnyPrimitive, data as Partial<InferTreeNodeDataState<TNode>>) as InferTreeNodeDataState<TNode>;\n\n env.addOperation(\n Operation.fromDefinition(operationPath, this._opDefinitions.insert, {\n id,\n type: nodeType.type,\n parentId,\n pos,\n data: mergedData,\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 updateAt: <TNode extends AnyTreeNodePrimitive>(\n id: string,\n nodeType: TNode,\n value: TreeNodeUpdateValue<TNode>\n ): void => {\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 const dataProxy = nodeType.data._internal.createProxy(env, nodePath);\n // Delegate to the data proxy's update method\n (dataProxy as { update: (v: unknown) => void }).update(value);\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, false, false> =>\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 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"],"mappings":"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"}