@voidhash/mimic 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +19 -19
- package/dist/{Primitive-lEhQyGVL.d.mts → Primitive-DqQFc3Gu.d.mts} +8 -3
- package/dist/Primitive-DqQFc3Gu.d.mts.map +1 -0
- package/dist/{Primitive-CvFVxR8_.d.cts → Primitive-awpEjnKL.d.cts} +8 -3
- package/dist/Primitive-awpEjnKL.d.cts.map +1 -0
- package/dist/client/index.d.cts +1 -1
- package/dist/client/index.d.cts.map +1 -1
- package/dist/client/index.d.mts +1 -1
- package/dist/client/index.d.mts.map +1 -1
- package/dist/index.cjs +454 -0
- package/dist/index.d.cts +278 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +278 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +443 -1
- package/dist/index.mjs.map +1 -1
- package/dist/server/index.d.cts +1 -1
- package/dist/server/index.d.mts +1 -1
- package/package.json +2 -2
- package/src/index.ts +2 -0
- package/src/primitives/shared.ts +7 -1
- package/src/types/index.ts +137 -0
- package/src/utils/index.ts +7 -0
- package/src/utils/tree-helpers.ts +648 -0
- package/dist/Primitive-CvFVxR8_.d.cts.map +0 -1
- package/dist/Primitive-lEhQyGVL.d.mts.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -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","schemaFields: Record<string, any>","fieldSchema: Schema.Schema<any>","variantSchemas: Schema.Schema<any>[]"],"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","../src/EffectSchema.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","/**\n * Effect.Schema utilities for converting Mimic primitives to Effect.Schema schemas.\n * \n * @since 0.0.1\n */\nimport { Schema } from \"effect\";\nimport type { AnyPrimitive, InferSetInput, InferUpdateInput } from \"./primitives/shared\";\nimport type { LiteralPrimitive, LiteralValue } from \"./primitives/Literal\";\nimport type { StructPrimitive } from \"./primitives/Struct\";\nimport type { ArrayPrimitive } from \"./primitives/Array\";\nimport type { UnionPrimitive, UnionVariants } from \"./primitives/Union\";\nimport type { EitherPrimitive, ScalarPrimitive } from \"./primitives/Either\";\nimport type { LazyPrimitive } from \"./primitives/Lazy\";\nimport type { TreeNodePrimitive, AnyTreeNodePrimitive } from \"./primitives/TreeNode\";\n\n// =============================================================================\n// Type-level Schema Inference\n// =============================================================================\n\n/**\n * Infer the Effect.Schema type for a primitive's set input.\n */\nexport type ToSetSchema<T extends AnyPrimitive> = Schema.Schema<InferSetInput<T>>;\n\n/**\n * Infer the Effect.Schema type for a primitive's update input.\n */\nexport type ToUpdateSchema<T extends AnyPrimitive> = Schema.Schema<InferUpdateInput<T>>;\n\n/**\n * Type for TreeNode set schema - uses the node's data set input type\n */\nexport type ToTreeNodeSetSchema<T extends AnyTreeNodePrimitive> = Schema.Schema<InferSetInput<T[\"data\"]>>;\n\n/**\n * Type for TreeNode update schema - uses the node's data update input type\n */\nexport type ToTreeNodeUpdateSchema<T extends AnyTreeNodePrimitive> = Schema.Schema<InferUpdateInput<T[\"data\"]>>;\n\n// =============================================================================\n// Schema for TreeNodeState\n// =============================================================================\n\n/**\n * Schema for a tree node state (flat storage format).\n */\nexport const TreeNodeStateSchema = Schema.Struct({\n id: Schema.String,\n type: Schema.String,\n parentId: Schema.NullOr(Schema.String),\n pos: Schema.String,\n data: Schema.Unknown,\n});\n\n// =============================================================================\n// Internal type for primitives (including those that don't implement full Primitive interface)\n// =============================================================================\n\n/**\n * Internal type for anything that can be converted to a schema.\n * This includes both AnyPrimitive and AnyTreeNodePrimitive.\n */\ntype ConvertiblePrimitive = { _tag: string };\n\n// =============================================================================\n// Runtime Conversion Functions\n// =============================================================================\n\n/**\n * Check if a field is required for set operations.\n * A field is required if: TRequired is true AND THasDefault is false.\n * \n * We determine this by checking the primitive's schema properties.\n */\nfunction isRequiredForSet(primitive: ConvertiblePrimitive): boolean {\n // Access the private schema to check required and default status\n const schema = (primitive as any)._schema;\n if (!schema) return false;\n \n return schema.required === true && schema.defaultValue === undefined;\n}\n\n/**\n * Get the base Effect.Schema for a primitive type (without optional wrapper).\n */\nfunction getBaseSchema(primitive: ConvertiblePrimitive): Schema.Schema<any> {\n switch (primitive._tag) {\n case \"StringPrimitive\":\n return Schema.String;\n \n case \"NumberPrimitive\":\n return Schema.Number;\n \n case \"BooleanPrimitive\":\n return Schema.Boolean;\n \n case \"LiteralPrimitive\": {\n const literalPrimitive = primitive as unknown as LiteralPrimitive<LiteralValue, any, any>;\n const literalValue = (literalPrimitive as any)._schema?.literal ?? (literalPrimitive as any).literal;\n return Schema.Literal(literalValue);\n }\n \n case \"StructPrimitive\": {\n const structPrimitive = primitive as unknown as StructPrimitive<Record<string, AnyPrimitive>, any, any>;\n return buildStructSetSchema(structPrimitive);\n }\n \n case \"ArrayPrimitive\": {\n const arrayPrimitive = primitive as unknown as ArrayPrimitive<AnyPrimitive, any, any>;\n const elementSchema = buildElementSetSchema(arrayPrimitive.element);\n return Schema.Array(elementSchema);\n }\n \n case \"UnionPrimitive\": {\n const unionPrimitive = primitive as unknown as UnionPrimitive<UnionVariants, any, any, any>;\n return buildUnionSetSchema(unionPrimitive);\n }\n \n case \"EitherPrimitive\": {\n const eitherPrimitive = primitive as unknown as EitherPrimitive<readonly ScalarPrimitive[], any, any>;\n return buildEitherSchema(eitherPrimitive);\n }\n \n case \"LazyPrimitive\": {\n const lazyPrimitive = primitive as unknown as LazyPrimitive<() => AnyPrimitive>;\n // Resolve the lazy primitive and get its schema\n const resolved = (lazyPrimitive as any)._resolve?.() ?? (lazyPrimitive as any)._thunk();\n return getBaseSchema(resolved);\n }\n \n case \"TreeNodePrimitive\": {\n const treeNodePrimitive = primitive as unknown as TreeNodePrimitive<string, StructPrimitive<any>, any>;\n // TreeNode delegates to its data struct\n return buildStructSetSchema(treeNodePrimitive.data);\n }\n \n case \"TreePrimitive\": {\n // Tree returns an array of TreeNodeState\n return Schema.Array(TreeNodeStateSchema);\n }\n \n default:\n return Schema.Unknown;\n }\n}\n\n/**\n * Build the set schema for a struct primitive.\n * Required fields (required=true, no default) are non-optional.\n * Other fields are wrapped with Schema.optional.\n */\nfunction buildStructSetSchema(structPrimitive: StructPrimitive<Record<string, AnyPrimitive>, any, any>): Schema.Schema<any> {\n const fields = structPrimitive.fields;\n // Use any to avoid complex Schema type constraints\n const schemaFields: Record<string, any> = {};\n \n for (const key in fields) {\n const fieldPrimitive = fields[key]!;\n const baseSchema = getBaseSchema(fieldPrimitive);\n \n if (isRequiredForSet(fieldPrimitive)) {\n // Required field - use base schema directly\n schemaFields[key] = baseSchema;\n } else {\n // Optional field - wrap with Schema.optional\n schemaFields[key] = Schema.optional(baseSchema);\n }\n }\n \n return Schema.Struct(schemaFields) as any;\n}\n\n/**\n * Build the update schema for a struct primitive.\n * All fields are optional for partial updates.\n */\nfunction buildStructUpdateSchema(structPrimitive: StructPrimitive<Record<string, AnyPrimitive>, any, any>): Schema.Schema<any> {\n const fields = structPrimitive.fields;\n // Use any to avoid complex Schema type constraints\n const schemaFields: Record<string, any> = {};\n \n for (const key in fields) {\n const fieldPrimitive = fields[key]!;\n // For update, use the update schema for nested structs, otherwise base schema\n let fieldSchema: Schema.Schema<any>;\n \n if (fieldPrimitive._tag === \"StructPrimitive\") {\n fieldSchema = buildStructUpdateSchema(fieldPrimitive as StructPrimitive<Record<string, AnyPrimitive>, any, any>);\n } else {\n fieldSchema = getBaseSchema(fieldPrimitive);\n }\n \n // All fields are optional in update\n schemaFields[key] = Schema.optional(fieldSchema);\n }\n \n return Schema.Struct(schemaFields) as any;\n}\n\n/**\n * Build the set schema for an array element.\n * For struct elements, uses the struct's set input schema.\n */\nfunction buildElementSetSchema(elementPrimitive: AnyPrimitive): Schema.Schema<any> {\n if (elementPrimitive._tag === \"StructPrimitive\") {\n return buildStructSetSchema(elementPrimitive as StructPrimitive<Record<string, AnyPrimitive>, any, any>);\n }\n return getBaseSchema(elementPrimitive);\n}\n\n/**\n * Build the set schema for a union primitive.\n * Creates a Schema.Union of all variant schemas.\n */\nfunction buildUnionSetSchema(unionPrimitive: UnionPrimitive<UnionVariants, any, any, any>): Schema.Schema<any> {\n const variants = unionPrimitive.variants;\n const variantSchemas: Schema.Schema<any>[] = [];\n \n for (const key in variants) {\n const variantPrimitive = variants[key]!;\n variantSchemas.push(buildStructSetSchema(variantPrimitive));\n }\n \n if (variantSchemas.length === 0) {\n return Schema.Unknown;\n }\n \n if (variantSchemas.length === 1) {\n return variantSchemas[0]!;\n }\n \n return Schema.Union(...variantSchemas as [Schema.Schema<any>, Schema.Schema<any>, ...Schema.Schema<any>[]]);\n}\n\n/**\n * Build the schema for an either primitive.\n * Creates a Schema.Union of all scalar variant types.\n */\nfunction buildEitherSchema(eitherPrimitive: EitherPrimitive<readonly ScalarPrimitive[], any, any>): Schema.Schema<any> {\n const variants = eitherPrimitive.variants;\n const variantSchemas: Schema.Schema<any>[] = [];\n \n for (const variant of variants) {\n variantSchemas.push(getBaseSchema(variant as unknown as ConvertiblePrimitive));\n }\n \n if (variantSchemas.length === 0) {\n return Schema.Unknown;\n }\n \n if (variantSchemas.length === 1) {\n return variantSchemas[0]!;\n }\n \n return Schema.Union(...variantSchemas as [Schema.Schema<any>, Schema.Schema<any>, ...Schema.Schema<any>[]]);\n}\n\n/**\n * Build the update schema for a union primitive.\n * Creates a Schema.Union of all variant update schemas.\n */\nfunction buildUnionUpdateSchema(unionPrimitive: UnionPrimitive<UnionVariants, any, any, any>): Schema.Schema<any> {\n const variants = unionPrimitive.variants;\n const variantSchemas: Schema.Schema<any>[] = [];\n \n for (const key in variants) {\n const variantPrimitive = variants[key]!;\n variantSchemas.push(buildStructUpdateSchema(variantPrimitive));\n }\n \n if (variantSchemas.length === 0) {\n return Schema.Unknown;\n }\n \n if (variantSchemas.length === 1) {\n return variantSchemas[0]!;\n }\n \n return Schema.Union(...variantSchemas as [Schema.Schema<any>, Schema.Schema<any>, ...Schema.Schema<any>[]]);\n}\n\n/**\n * Get the update schema for a primitive.\n * For structs, all fields are optional (partial updates).\n * For simple primitives, same as set schema.\n */\nfunction getUpdateSchema(primitive: ConvertiblePrimitive): Schema.Schema<any> {\n switch (primitive._tag) {\n case \"StructPrimitive\": {\n const structPrimitive = primitive as unknown as StructPrimitive<Record<string, AnyPrimitive>, any, any>;\n return buildStructUpdateSchema(structPrimitive);\n }\n \n case \"UnionPrimitive\": {\n const unionPrimitive = primitive as unknown as UnionPrimitive<UnionVariants, any, any, any>;\n return buildUnionUpdateSchema(unionPrimitive);\n }\n \n case \"TreeNodePrimitive\": {\n const treeNodePrimitive = primitive as unknown as TreeNodePrimitive<string, StructPrimitive<any>, any>;\n // TreeNode update delegates to data struct's update schema (all fields optional)\n return buildStructUpdateSchema(treeNodePrimitive.data);\n }\n \n case \"LazyPrimitive\": {\n const lazyPrimitive = primitive as unknown as LazyPrimitive<() => AnyPrimitive>;\n const resolved = (lazyPrimitive as any)._resolve?.() ?? (lazyPrimitive as any)._thunk();\n return getUpdateSchema(resolved);\n }\n \n default:\n // For simple primitives, update schema is same as set schema\n return getBaseSchema(primitive);\n }\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Convert a Mimic primitive to an Effect.Schema for set operations.\n * \n * The resulting schema:\n * - For structs: required fields (required=true, no default) are non-optional, others are optional\n * - For arrays: uses the element's set schema\n * - For unions: creates a Schema.Union of variant schemas\n * - For TreeNode: delegates to the node's data struct schema\n * - For Tree: returns Schema.Array of TreeNodeState\n * \n * @example\n * ```typescript\n * const UserSchema = Primitive.Struct({\n * name: Primitive.String().required(),\n * age: Primitive.Number().default(0),\n * email: Primitive.String(),\n * });\n * \n * const SetSchema = toSetSchema(UserSchema);\n * // { name: string, age?: number, email?: string }\n * ```\n */\nexport function toSetSchema<T extends AnyPrimitive>(primitive: T): ToSetSchema<T>;\nexport function toSetSchema<T extends AnyTreeNodePrimitive>(primitive: T): ToTreeNodeSetSchema<T>;\nexport function toSetSchema(primitive: ConvertiblePrimitive): Schema.Schema<any> {\n return getBaseSchema(primitive);\n}\n\n/**\n * Convert a Mimic primitive to an Effect.Schema for update operations.\n * \n * The resulting schema:\n * - For structs: all fields are optional (partial updates)\n * - For unions: all variant fields are optional\n * - For TreeNode: delegates to the node's data struct update schema\n * - For simple primitives: same as set schema\n * \n * @example\n * ```typescript\n * const UserSchema = Primitive.Struct({\n * name: Primitive.String().required(),\n * age: Primitive.Number().default(0),\n * email: Primitive.String(),\n * });\n * \n * const UpdateSchema = toUpdateSchema(UserSchema);\n * // { name?: string, age?: string, email?: string }\n * ```\n */\nexport function toUpdateSchema<T extends AnyPrimitive>(primitive: T): ToUpdateSchema<T>;\nexport function toUpdateSchema<T extends AnyTreeNodePrimitive>(primitive: T): ToTreeNodeUpdateSchema<T>;\nexport function toUpdateSchema(primitive: ConvertiblePrimitive): Schema.Schema<any> {\n return getUpdateSchema(primitive);\n}\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","schemaFields: Record<string, any>","fieldSchema: Schema.Schema<any>","variantSchemas: Schema.Schema<any>[]","ancestors: TreeNodeSnapshot<TNode>[]","descendants: TreeNodeSnapshot<TNode>[]","results: TreeNodeSnapshot<TNode>[]","result: FlattenedNode<TNode>[]","result: AnyTreeNodePrimitive[]"],"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","../src/EffectSchema.ts","../src/types/index.ts","../src/utils/tree-helpers.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 * Infer whether a primitive is required.\n * Alias for IsDefined for clarity.\n */\n export type IsRequired<T> = IsDefined<T>;\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","/**\n * Effect.Schema utilities for converting Mimic primitives to Effect.Schema schemas.\n * \n * @since 0.0.1\n */\nimport { Schema } from \"effect\";\nimport type { AnyPrimitive, InferSetInput, InferUpdateInput } from \"./primitives/shared\";\nimport type { LiteralPrimitive, LiteralValue } from \"./primitives/Literal\";\nimport type { StructPrimitive } from \"./primitives/Struct\";\nimport type { ArrayPrimitive } from \"./primitives/Array\";\nimport type { UnionPrimitive, UnionVariants } from \"./primitives/Union\";\nimport type { EitherPrimitive, ScalarPrimitive } from \"./primitives/Either\";\nimport type { LazyPrimitive } from \"./primitives/Lazy\";\nimport type { TreeNodePrimitive, AnyTreeNodePrimitive } from \"./primitives/TreeNode\";\n\n// =============================================================================\n// Type-level Schema Inference\n// =============================================================================\n\n/**\n * Infer the Effect.Schema type for a primitive's set input.\n */\nexport type ToSetSchema<T extends AnyPrimitive> = Schema.Schema<InferSetInput<T>>;\n\n/**\n * Infer the Effect.Schema type for a primitive's update input.\n */\nexport type ToUpdateSchema<T extends AnyPrimitive> = Schema.Schema<InferUpdateInput<T>>;\n\n/**\n * Type for TreeNode set schema - uses the node's data set input type\n */\nexport type ToTreeNodeSetSchema<T extends AnyTreeNodePrimitive> = Schema.Schema<InferSetInput<T[\"data\"]>>;\n\n/**\n * Type for TreeNode update schema - uses the node's data update input type\n */\nexport type ToTreeNodeUpdateSchema<T extends AnyTreeNodePrimitive> = Schema.Schema<InferUpdateInput<T[\"data\"]>>;\n\n// =============================================================================\n// Schema for TreeNodeState\n// =============================================================================\n\n/**\n * Schema for a tree node state (flat storage format).\n */\nexport const TreeNodeStateSchema = Schema.Struct({\n id: Schema.String,\n type: Schema.String,\n parentId: Schema.NullOr(Schema.String),\n pos: Schema.String,\n data: Schema.Unknown,\n});\n\n// =============================================================================\n// Internal type for primitives (including those that don't implement full Primitive interface)\n// =============================================================================\n\n/**\n * Internal type for anything that can be converted to a schema.\n * This includes both AnyPrimitive and AnyTreeNodePrimitive.\n */\ntype ConvertiblePrimitive = { _tag: string };\n\n// =============================================================================\n// Runtime Conversion Functions\n// =============================================================================\n\n/**\n * Check if a field is required for set operations.\n * A field is required if: TRequired is true AND THasDefault is false.\n * \n * We determine this by checking the primitive's schema properties.\n */\nfunction isRequiredForSet(primitive: ConvertiblePrimitive): boolean {\n // Access the private schema to check required and default status\n const schema = (primitive as any)._schema;\n if (!schema) return false;\n \n return schema.required === true && schema.defaultValue === undefined;\n}\n\n/**\n * Get the base Effect.Schema for a primitive type (without optional wrapper).\n */\nfunction getBaseSchema(primitive: ConvertiblePrimitive): Schema.Schema<any> {\n switch (primitive._tag) {\n case \"StringPrimitive\":\n return Schema.String;\n \n case \"NumberPrimitive\":\n return Schema.Number;\n \n case \"BooleanPrimitive\":\n return Schema.Boolean;\n \n case \"LiteralPrimitive\": {\n const literalPrimitive = primitive as unknown as LiteralPrimitive<LiteralValue, any, any>;\n const literalValue = (literalPrimitive as any)._schema?.literal ?? (literalPrimitive as any).literal;\n return Schema.Literal(literalValue);\n }\n \n case \"StructPrimitive\": {\n const structPrimitive = primitive as unknown as StructPrimitive<Record<string, AnyPrimitive>, any, any>;\n return buildStructSetSchema(structPrimitive);\n }\n \n case \"ArrayPrimitive\": {\n const arrayPrimitive = primitive as unknown as ArrayPrimitive<AnyPrimitive, any, any>;\n const elementSchema = buildElementSetSchema(arrayPrimitive.element);\n return Schema.Array(elementSchema);\n }\n \n case \"UnionPrimitive\": {\n const unionPrimitive = primitive as unknown as UnionPrimitive<UnionVariants, any, any, any>;\n return buildUnionSetSchema(unionPrimitive);\n }\n \n case \"EitherPrimitive\": {\n const eitherPrimitive = primitive as unknown as EitherPrimitive<readonly ScalarPrimitive[], any, any>;\n return buildEitherSchema(eitherPrimitive);\n }\n \n case \"LazyPrimitive\": {\n const lazyPrimitive = primitive as unknown as LazyPrimitive<() => AnyPrimitive>;\n // Resolve the lazy primitive and get its schema\n const resolved = (lazyPrimitive as any)._resolve?.() ?? (lazyPrimitive as any)._thunk();\n return getBaseSchema(resolved);\n }\n \n case \"TreeNodePrimitive\": {\n const treeNodePrimitive = primitive as unknown as TreeNodePrimitive<string, StructPrimitive<any>, any>;\n // TreeNode delegates to its data struct\n return buildStructSetSchema(treeNodePrimitive.data);\n }\n \n case \"TreePrimitive\": {\n // Tree returns an array of TreeNodeState\n return Schema.Array(TreeNodeStateSchema);\n }\n \n default:\n return Schema.Unknown;\n }\n}\n\n/**\n * Build the set schema for a struct primitive.\n * Required fields (required=true, no default) are non-optional.\n * Other fields are wrapped with Schema.optional.\n */\nfunction buildStructSetSchema(structPrimitive: StructPrimitive<Record<string, AnyPrimitive>, any, any>): Schema.Schema<any> {\n const fields = structPrimitive.fields;\n // Use any to avoid complex Schema type constraints\n const schemaFields: Record<string, any> = {};\n \n for (const key in fields) {\n const fieldPrimitive = fields[key]!;\n const baseSchema = getBaseSchema(fieldPrimitive);\n \n if (isRequiredForSet(fieldPrimitive)) {\n // Required field - use base schema directly\n schemaFields[key] = baseSchema;\n } else {\n // Optional field - wrap with Schema.optional\n schemaFields[key] = Schema.optional(baseSchema);\n }\n }\n \n return Schema.Struct(schemaFields) as any;\n}\n\n/**\n * Build the update schema for a struct primitive.\n * All fields are optional for partial updates.\n */\nfunction buildStructUpdateSchema(structPrimitive: StructPrimitive<Record<string, AnyPrimitive>, any, any>): Schema.Schema<any> {\n const fields = structPrimitive.fields;\n // Use any to avoid complex Schema type constraints\n const schemaFields: Record<string, any> = {};\n \n for (const key in fields) {\n const fieldPrimitive = fields[key]!;\n // For update, use the update schema for nested structs, otherwise base schema\n let fieldSchema: Schema.Schema<any>;\n \n if (fieldPrimitive._tag === \"StructPrimitive\") {\n fieldSchema = buildStructUpdateSchema(fieldPrimitive as StructPrimitive<Record<string, AnyPrimitive>, any, any>);\n } else {\n fieldSchema = getBaseSchema(fieldPrimitive);\n }\n \n // All fields are optional in update\n schemaFields[key] = Schema.optional(fieldSchema);\n }\n \n return Schema.Struct(schemaFields) as any;\n}\n\n/**\n * Build the set schema for an array element.\n * For struct elements, uses the struct's set input schema.\n */\nfunction buildElementSetSchema(elementPrimitive: AnyPrimitive): Schema.Schema<any> {\n if (elementPrimitive._tag === \"StructPrimitive\") {\n return buildStructSetSchema(elementPrimitive as StructPrimitive<Record<string, AnyPrimitive>, any, any>);\n }\n return getBaseSchema(elementPrimitive);\n}\n\n/**\n * Build the set schema for a union primitive.\n * Creates a Schema.Union of all variant schemas.\n */\nfunction buildUnionSetSchema(unionPrimitive: UnionPrimitive<UnionVariants, any, any, any>): Schema.Schema<any> {\n const variants = unionPrimitive.variants;\n const variantSchemas: Schema.Schema<any>[] = [];\n \n for (const key in variants) {\n const variantPrimitive = variants[key]!;\n variantSchemas.push(buildStructSetSchema(variantPrimitive));\n }\n \n if (variantSchemas.length === 0) {\n return Schema.Unknown;\n }\n \n if (variantSchemas.length === 1) {\n return variantSchemas[0]!;\n }\n \n return Schema.Union(...variantSchemas as [Schema.Schema<any>, Schema.Schema<any>, ...Schema.Schema<any>[]]);\n}\n\n/**\n * Build the schema for an either primitive.\n * Creates a Schema.Union of all scalar variant types.\n */\nfunction buildEitherSchema(eitherPrimitive: EitherPrimitive<readonly ScalarPrimitive[], any, any>): Schema.Schema<any> {\n const variants = eitherPrimitive.variants;\n const variantSchemas: Schema.Schema<any>[] = [];\n \n for (const variant of variants) {\n variantSchemas.push(getBaseSchema(variant as unknown as ConvertiblePrimitive));\n }\n \n if (variantSchemas.length === 0) {\n return Schema.Unknown;\n }\n \n if (variantSchemas.length === 1) {\n return variantSchemas[0]!;\n }\n \n return Schema.Union(...variantSchemas as [Schema.Schema<any>, Schema.Schema<any>, ...Schema.Schema<any>[]]);\n}\n\n/**\n * Build the update schema for a union primitive.\n * Creates a Schema.Union of all variant update schemas.\n */\nfunction buildUnionUpdateSchema(unionPrimitive: UnionPrimitive<UnionVariants, any, any, any>): Schema.Schema<any> {\n const variants = unionPrimitive.variants;\n const variantSchemas: Schema.Schema<any>[] = [];\n \n for (const key in variants) {\n const variantPrimitive = variants[key]!;\n variantSchemas.push(buildStructUpdateSchema(variantPrimitive));\n }\n \n if (variantSchemas.length === 0) {\n return Schema.Unknown;\n }\n \n if (variantSchemas.length === 1) {\n return variantSchemas[0]!;\n }\n \n return Schema.Union(...variantSchemas as [Schema.Schema<any>, Schema.Schema<any>, ...Schema.Schema<any>[]]);\n}\n\n/**\n * Get the update schema for a primitive.\n * For structs, all fields are optional (partial updates).\n * For simple primitives, same as set schema.\n */\nfunction getUpdateSchema(primitive: ConvertiblePrimitive): Schema.Schema<any> {\n switch (primitive._tag) {\n case \"StructPrimitive\": {\n const structPrimitive = primitive as unknown as StructPrimitive<Record<string, AnyPrimitive>, any, any>;\n return buildStructUpdateSchema(structPrimitive);\n }\n \n case \"UnionPrimitive\": {\n const unionPrimitive = primitive as unknown as UnionPrimitive<UnionVariants, any, any, any>;\n return buildUnionUpdateSchema(unionPrimitive);\n }\n \n case \"TreeNodePrimitive\": {\n const treeNodePrimitive = primitive as unknown as TreeNodePrimitive<string, StructPrimitive<any>, any>;\n // TreeNode update delegates to data struct's update schema (all fields optional)\n return buildStructUpdateSchema(treeNodePrimitive.data);\n }\n \n case \"LazyPrimitive\": {\n const lazyPrimitive = primitive as unknown as LazyPrimitive<() => AnyPrimitive>;\n const resolved = (lazyPrimitive as any)._resolve?.() ?? (lazyPrimitive as any)._thunk();\n return getUpdateSchema(resolved);\n }\n \n default:\n // For simple primitives, update schema is same as set schema\n return getBaseSchema(primitive);\n }\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Convert a Mimic primitive to an Effect.Schema for set operations.\n * \n * The resulting schema:\n * - For structs: required fields (required=true, no default) are non-optional, others are optional\n * - For arrays: uses the element's set schema\n * - For unions: creates a Schema.Union of variant schemas\n * - For TreeNode: delegates to the node's data struct schema\n * - For Tree: returns Schema.Array of TreeNodeState\n * \n * @example\n * ```typescript\n * const UserSchema = Primitive.Struct({\n * name: Primitive.String().required(),\n * age: Primitive.Number().default(0),\n * email: Primitive.String(),\n * });\n * \n * const SetSchema = toSetSchema(UserSchema);\n * // { name: string, age?: number, email?: string }\n * ```\n */\nexport function toSetSchema<T extends AnyPrimitive>(primitive: T): ToSetSchema<T>;\nexport function toSetSchema<T extends AnyTreeNodePrimitive>(primitive: T): ToTreeNodeSetSchema<T>;\nexport function toSetSchema(primitive: ConvertiblePrimitive): Schema.Schema<any> {\n return getBaseSchema(primitive);\n}\n\n/**\n * Convert a Mimic primitive to an Effect.Schema for update operations.\n * \n * The resulting schema:\n * - For structs: all fields are optional (partial updates)\n * - For unions: all variant fields are optional\n * - For TreeNode: delegates to the node's data struct update schema\n * - For simple primitives: same as set schema\n * \n * @example\n * ```typescript\n * const UserSchema = Primitive.Struct({\n * name: Primitive.String().required(),\n * age: Primitive.Number().default(0),\n * email: Primitive.String(),\n * });\n * \n * const UpdateSchema = toUpdateSchema(UserSchema);\n * // { name?: string, age?: string, email?: string }\n * ```\n */\nexport function toUpdateSchema<T extends AnyPrimitive>(primitive: T): ToUpdateSchema<T>;\nexport function toUpdateSchema<T extends AnyTreeNodePrimitive>(primitive: T): ToTreeNodeUpdateSchema<T>;\nexport function toUpdateSchema(primitive: ConvertiblePrimitive): Schema.Schema<any> {\n return getUpdateSchema(primitive);\n}\n","/**\n * Consolidated type inference utilities for all primitives.\n *\n * This module re-exports all inference types from a single location\n * for convenient access across the mimic package.\n *\n * @since 0.0.1\n */\n\n// =============================================================================\n// Core Inference Types (from shared.ts)\n// =============================================================================\n\nexport type {\n // Core primitive types\n Primitive,\n AnyPrimitive,\n PrimitiveInternal,\n\n // State and proxy inference\n InferState,\n InferProxy,\n\n // Input inference\n InferSetInput,\n InferUpdateInput,\n\n // Snapshot inference\n InferSnapshot,\n\n // Required/default status inference\n HasDefault,\n IsDefined,\n IsRequired,\n\n // Utility types\n MaybeUndefined,\n NeedsValue,\n Optional,\n\n // Validator type\n Validator,\n} from \"../primitives/shared.js\";\n\n// =============================================================================\n// Struct Inference Types\n// =============================================================================\n\nexport type {\n InferStructState,\n InferStructSnapshot,\n StructSetInput,\n StructUpdateValue,\n StructProxy,\n} from \"../primitives/Struct.js\";\n\n// =============================================================================\n// Array Inference Types\n// =============================================================================\n\nexport type {\n ArrayState,\n ArraySnapshot,\n ArrayEntrySnapshot,\n ArrayEntry,\n ArraySetInput,\n ArrayUpdateInput,\n ArrayElementSetInput,\n ArrayProxy,\n} from \"../primitives/Array.js\";\n\n// =============================================================================\n// Tree Inference Types\n// =============================================================================\n\nexport type {\n TreeState,\n TreeNodeState,\n TypedTreeNodeState,\n TreeNodeSnapshot,\n InferTreeSnapshot,\n TreeSetInput,\n TreeUpdateInput,\n TreeNodeUpdateValue,\n TreeNodeDataSetInput,\n TreeProxy,\n TypedNodeProxy,\n TreeNodeProxyBase,\n} from \"../primitives/Tree.js\";\n\n// =============================================================================\n// TreeNode Inference Types\n// =============================================================================\n\nexport type {\n AnyTreeNodePrimitive,\n InferTreeNodeDataState,\n InferTreeNodeType,\n InferTreeNodeChildren,\n TreeNodeSelfType,\n TreeNodeConfig,\n TreeNodeChildrenInput,\n} from \"../primitives/TreeNode.js\";\n\nexport { TreeNodePrimitive, TreeNodeSelf } from \"../primitives/TreeNode.js\";\n\n// =============================================================================\n// Union Inference Types\n// =============================================================================\n\nexport type {\n InferUnionState,\n InferUnionSnapshot,\n UnionVariants,\n} from \"../primitives/Union.js\";\n\n// =============================================================================\n// Either Inference Types\n// =============================================================================\n\nexport type {\n InferEitherState,\n InferEitherSnapshot,\n ScalarPrimitive,\n} from \"../primitives/Either.js\";\n\n// =============================================================================\n// Lazy Inference Types\n// =============================================================================\n\nexport type {\n InferLazyState,\n InferLazyProxy,\n InferLazySnapshot,\n InferLazySetInput,\n InferLazyUpdateInput,\n} from \"../primitives/Lazy.js\";\n","/**\n * Tree snapshot utility functions.\n *\n * Standalone helpers for traversing and querying tree snapshots.\n * All functions handle undefined snapshots gracefully.\n *\n * @since 0.0.1\n */\n\nimport type { TreeNodeSnapshot, TreePrimitive } from \"../primitives/Tree.js\";\nimport type { AnyTreeNodePrimitive } from \"../primitives/TreeNode.js\";\n\n// =============================================================================\n// Result Types\n// =============================================================================\n\n/**\n * Result of finding a node with path information.\n */\nexport interface NodeSearchResult<TNode extends AnyTreeNodePrimitive> {\n readonly node: TreeNodeSnapshot<TNode>;\n readonly path: readonly string[]; // Array of node IDs from root to this node\n readonly depth: number;\n}\n\n/**\n * Result of finding a parent node.\n */\nexport interface ParentSearchResult<TNode extends AnyTreeNodePrimitive> {\n readonly parent: TreeNodeSnapshot<TNode>;\n readonly childIndex: number; // Index of the target node in parent's children\n}\n\n/**\n * Flattened node with parent information.\n */\nexport interface FlattenedNode<TNode extends AnyTreeNodePrimitive> {\n readonly node: TreeNodeSnapshot<TNode>;\n readonly parentId: string | null;\n readonly depth: number;\n}\n\n/**\n * Options for tree traversal.\n */\nexport interface TraverseOptions {\n readonly order?: \"pre\" | \"post\";\n}\n\n// =============================================================================\n// Core Functions\n// =============================================================================\n\n/**\n * Find a node by ID in a tree snapshot.\n *\n * @param snapshot - The root tree snapshot\n * @param id - The node ID to find\n * @returns The node snapshot if found, undefined otherwise\n */\nexport function findNodeById<TNode extends AnyTreeNodePrimitive>(\n snapshot: TreeNodeSnapshot<TNode> | undefined,\n id: string\n): TreeNodeSnapshot<TNode> | undefined {\n if (!snapshot) return undefined;\n if (snapshot.id === id) return snapshot;\n\n for (const child of snapshot.children) {\n const found = findNodeById(child as TreeNodeSnapshot<TNode>, id);\n if (found) return found;\n }\n\n return undefined;\n}\n\n/**\n * Find a node by ID with full path information.\n *\n * @param snapshot - The root tree snapshot\n * @param id - The node ID to find\n * @returns NodeSearchResult with node, path, and depth, or undefined if not found\n */\nexport function findNodeWithPath<TNode extends AnyTreeNodePrimitive>(\n snapshot: TreeNodeSnapshot<TNode> | undefined,\n id: string\n): NodeSearchResult<TNode> | undefined {\n if (!snapshot) return undefined;\n\n const search = (\n node: TreeNodeSnapshot<TNode>,\n currentPath: string[],\n depth: number\n ): NodeSearchResult<TNode> | undefined => {\n const path = [...currentPath, node.id];\n\n if (node.id === id) {\n return { node, path, depth };\n }\n\n for (const child of node.children) {\n const result = search(child as TreeNodeSnapshot<TNode>, path, depth + 1);\n if (result) return result;\n }\n\n return undefined;\n };\n\n return search(snapshot, [], 0);\n}\n\n/**\n * Get the parent node of a given node ID.\n *\n * @param snapshot - The root tree snapshot\n * @param nodeId - The ID of the node whose parent we want\n * @returns ParentSearchResult with parent node and child index, or undefined\n */\nexport function getParent<TNode extends AnyTreeNodePrimitive>(\n snapshot: TreeNodeSnapshot<TNode> | undefined,\n nodeId: string\n): ParentSearchResult<TNode> | undefined {\n if (!snapshot) return undefined;\n\n // Check if any direct child is the target\n for (let i = 0; i < snapshot.children.length; i++) {\n const child = snapshot.children[i];\n if (child && child.id === nodeId) {\n return {\n parent: snapshot,\n childIndex: i,\n };\n }\n }\n\n // Recursively search children\n for (const child of snapshot.children) {\n const result = getParent(child as TreeNodeSnapshot<TNode>, nodeId);\n if (result) return result;\n }\n\n return undefined;\n}\n\n/**\n * Get a subtree rooted at a specific node ID.\n *\n * @param snapshot - The root tree snapshot\n * @param nodeId - The ID of the node to use as new root\n * @returns The subtree snapshot, or undefined if node not found\n */\nexport function getSubtree<TNode extends AnyTreeNodePrimitive>(\n snapshot: TreeNodeSnapshot<TNode> | undefined,\n nodeId: string\n): TreeNodeSnapshot<TNode> | undefined {\n return findNodeById(snapshot, nodeId);\n}\n\n/**\n * Get all ancestor nodes from a node up to the root.\n *\n * @param snapshot - The root tree snapshot\n * @param nodeId - The ID of the node\n * @returns Array of ancestor snapshots from immediate parent to root, or empty array\n */\nexport function getAncestors<TNode extends AnyTreeNodePrimitive>(\n snapshot: TreeNodeSnapshot<TNode> | undefined,\n nodeId: string\n): readonly TreeNodeSnapshot<TNode>[] {\n if (!snapshot) return [];\n\n const result = findNodeWithPath(snapshot, nodeId);\n if (!result || result.path.length <= 1) return [];\n\n // Path includes the node itself, so we need all nodes except the last one\n const ancestorIds = result.path.slice(0, -1);\n const ancestors: TreeNodeSnapshot<TNode>[] = [];\n\n // Collect ancestors in reverse order (parent first, root last)\n for (let i = ancestorIds.length - 1; i >= 0; i--) {\n const id = ancestorIds[i];\n if (id) {\n const ancestor = findNodeById(snapshot, id);\n if (ancestor) {\n ancestors.push(ancestor);\n }\n }\n }\n\n return ancestors;\n}\n\n/**\n * Get all descendant nodes of a given node (flat array).\n *\n * @param snapshot - The root tree snapshot\n * @param nodeId - The ID of the node (if undefined, returns all descendants of root)\n * @returns Flat array of all descendant node snapshots\n */\nexport function getDescendants<TNode extends AnyTreeNodePrimitive>(\n snapshot: TreeNodeSnapshot<TNode> | undefined,\n nodeId?: string\n): readonly TreeNodeSnapshot<TNode>[] {\n if (!snapshot) return [];\n\n const startNode = nodeId ? findNodeById(snapshot, nodeId) : snapshot;\n if (!startNode) return [];\n\n const descendants: TreeNodeSnapshot<TNode>[] = [];\n\n const collect = (node: TreeNodeSnapshot<TNode>) => {\n for (const child of node.children) {\n descendants.push(child as TreeNodeSnapshot<TNode>);\n collect(child as TreeNodeSnapshot<TNode>);\n }\n };\n\n collect(startNode);\n return descendants;\n}\n\n/**\n * Get siblings of a node (nodes with the same parent).\n *\n * @param snapshot - The root tree snapshot\n * @param nodeId - The ID of the node\n * @param includeSelf - Whether to include the node itself (default: false)\n * @returns Array of sibling snapshots\n */\nexport function getSiblings<TNode extends AnyTreeNodePrimitive>(\n snapshot: TreeNodeSnapshot<TNode> | undefined,\n nodeId: string,\n includeSelf: boolean = false\n): readonly TreeNodeSnapshot<TNode>[] {\n if (!snapshot) return [];\n\n const parentResult = getParent(snapshot, nodeId);\n\n // If no parent, this is the root - root has no siblings\n if (!parentResult) return [];\n\n const siblings = parentResult.parent.children as readonly TreeNodeSnapshot<TNode>[];\n\n if (includeSelf) {\n return siblings;\n }\n\n return siblings.filter((s) => s.id !== nodeId);\n}\n\n// =============================================================================\n// Query Functions\n// =============================================================================\n\n/**\n * Find the first node matching a predicate.\n *\n * @param snapshot - The root tree snapshot\n * @param predicate - Function to test each node\n * @returns First matching node snapshot, or undefined\n */\nexport function findNode<TNode extends AnyTreeNodePrimitive>(\n snapshot: TreeNodeSnapshot<TNode> | undefined,\n predicate: (node: TreeNodeSnapshot<TNode>) => boolean\n): TreeNodeSnapshot<TNode> | undefined {\n if (!snapshot) return undefined;\n\n if (predicate(snapshot)) return snapshot;\n\n for (const child of snapshot.children) {\n const found = findNode(child as TreeNodeSnapshot<TNode>, predicate);\n if (found) return found;\n }\n\n return undefined;\n}\n\n/**\n * Find all nodes matching a predicate.\n *\n * @param snapshot - The root tree snapshot\n * @param predicate - Function to test each node\n * @returns Array of matching node snapshots\n */\nexport function findNodes<TNode extends AnyTreeNodePrimitive>(\n snapshot: TreeNodeSnapshot<TNode> | undefined,\n predicate: (node: TreeNodeSnapshot<TNode>) => boolean\n): readonly TreeNodeSnapshot<TNode>[] {\n if (!snapshot) return [];\n\n const results: TreeNodeSnapshot<TNode>[] = [];\n\n const search = (node: TreeNodeSnapshot<TNode>) => {\n if (predicate(node)) {\n results.push(node);\n }\n for (const child of node.children) {\n search(child as TreeNodeSnapshot<TNode>);\n }\n };\n\n search(snapshot);\n return results;\n}\n\n/**\n * Get the depth of a specific node (0 = root).\n *\n * @param snapshot - The root tree snapshot\n * @param nodeId - The ID of the node\n * @returns The depth, or -1 if not found\n */\nexport function getNodeDepth<TNode extends AnyTreeNodePrimitive>(\n snapshot: TreeNodeSnapshot<TNode> | undefined,\n nodeId: string\n): number {\n if (!snapshot) return -1;\n\n const result = findNodeWithPath(snapshot, nodeId);\n return result ? result.depth : -1;\n}\n\n/**\n * Check if one node is an ancestor of another.\n *\n * @param snapshot - The root tree snapshot\n * @param ancestorId - Potential ancestor node ID\n * @param descendantId - Potential descendant node ID\n * @returns true if ancestorId is an ancestor of descendantId\n */\nexport function isAncestorOf<TNode extends AnyTreeNodePrimitive>(\n snapshot: TreeNodeSnapshot<TNode> | undefined,\n ancestorId: string,\n descendantId: string\n): boolean {\n if (!snapshot) return false;\n\n const result = findNodeWithPath(snapshot, descendantId);\n if (!result) return false;\n\n // Check if ancestorId is in the path (excluding the descendant itself)\n return result.path.slice(0, -1).includes(ancestorId);\n}\n\n// =============================================================================\n// Traversal Functions\n// =============================================================================\n\n/**\n * Traverse the tree and call a visitor function for each node.\n * Return false from visitor to stop traversal.\n *\n * @param snapshot - The root tree snapshot\n * @param visitor - Function called for each node (return false to stop)\n * @param options - Traversal options (order: 'pre' | 'post')\n */\nexport function traverse<TNode extends AnyTreeNodePrimitive>(\n snapshot: TreeNodeSnapshot<TNode> | undefined,\n visitor: (node: TreeNodeSnapshot<TNode>, depth: number) => void | false,\n options: TraverseOptions = {}\n): void {\n if (!snapshot) return;\n\n const { order = \"pre\" } = options;\n\n const visit = (node: TreeNodeSnapshot<TNode>, depth: number): boolean => {\n if (order === \"pre\") {\n const result = visitor(node, depth);\n if (result === false) return false;\n }\n\n for (const child of node.children) {\n const shouldContinue = visit(child as TreeNodeSnapshot<TNode>, depth + 1);\n if (!shouldContinue) return false;\n }\n\n if (order === \"post\") {\n const result = visitor(node, depth);\n if (result === false) return false;\n }\n\n return true;\n };\n\n visit(snapshot, 0);\n}\n\n/**\n * Flatten the tree into an array with parent information.\n *\n * @param snapshot - The root tree snapshot\n * @returns Array of { node, parentId, depth } objects\n */\nexport function flattenTree<TNode extends AnyTreeNodePrimitive>(\n snapshot: TreeNodeSnapshot<TNode> | undefined\n): readonly FlattenedNode<TNode>[] {\n if (!snapshot) return [];\n\n const result: FlattenedNode<TNode>[] = [];\n\n const flatten = (\n node: TreeNodeSnapshot<TNode>,\n parentId: string | null,\n depth: number\n ) => {\n result.push({ node, parentId, depth });\n\n for (const child of node.children) {\n flatten(child as TreeNodeSnapshot<TNode>, node.id, depth + 1);\n }\n };\n\n flatten(snapshot, null, 0);\n return result;\n}\n\n/**\n * Map over all nodes in the tree, transforming each node's data.\n * Preserves tree structure while transforming node content.\n *\n * @param snapshot - The root tree snapshot\n * @param mapper - Function to transform each node\n * @returns New tree structure with transformed nodes, or undefined\n */\nexport function mapTree<TNode extends AnyTreeNodePrimitive, R>(\n snapshot: TreeNodeSnapshot<TNode> | undefined,\n mapper: (node: TreeNodeSnapshot<TNode>, depth: number) => R\n): { value: R; children: ReturnType<typeof mapTree<TNode, R>>[] } | undefined {\n if (!snapshot) return undefined;\n\n const map = (\n node: TreeNodeSnapshot<TNode>,\n depth: number\n ): { value: R; children: ReturnType<typeof mapTree<TNode, R>>[] } => {\n const value = mapper(node, depth);\n const children = node.children.map((child) =>\n map(child as TreeNodeSnapshot<TNode>, depth + 1)\n );\n return { value, children };\n };\n\n return map(snapshot, 0);\n}\n\n// =============================================================================\n// Schema Functions (work with TreeNodePrimitive, not snapshots)\n// =============================================================================\n\n/**\n * Build a lookup map from node type strings to their TreeNodePrimitive definitions.\n * Useful for resolving snapshot node types back to their schema definitions.\n *\n * @param tree - The TreePrimitive to analyze\n * @returns Map from type string to TreeNodePrimitive\n *\n * @example\n * ```ts\n * const typeMap = buildNodeTypeMap(fileTree);\n * const folderPrimitive = typeMap.get(\"folder\"); // FolderNode\n * ```\n */\nexport function buildNodeTypeMap<TRoot extends AnyTreeNodePrimitive>(\n tree: TreePrimitive<TRoot>\n): Map<string, AnyTreeNodePrimitive> {\n const map = 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 map.set(node.type, node);\n\n for (const child of node.children) {\n visit(child);\n }\n };\n\n visit(tree.root);\n return map;\n}\n\n/**\n * Get the TreeNodePrimitive definition for a snapshot node.\n * Requires the tree schema to resolve the type string to its primitive.\n *\n * @param tree - The TreePrimitive schema\n * @param snapshot - The node snapshot to get the primitive for\n * @returns The TreeNodePrimitive, or undefined if not found\n *\n * @example\n * ```ts\n * const node = findNodeById(treeSnapshot, \"some-id\");\n * const primitive = getNodePrimitive(fileTree, node);\n * // primitive is FolderNode or FileNode depending on node.type\n * ```\n */\nexport function getNodePrimitive<TRoot extends AnyTreeNodePrimitive>(\n tree: TreePrimitive<TRoot>,\n snapshot: TreeNodeSnapshot<AnyTreeNodePrimitive>\n): AnyTreeNodePrimitive | undefined {\n return getNodeTypeByName(tree, snapshot.type);\n}\n\n/**\n * Get the allowed child types for a snapshot node.\n * Combines schema lookup with the node's allowed children.\n *\n * @param tree - The TreePrimitive schema\n * @param snapshot - The node snapshot to get allowed children for\n * @returns Array of allowed child TreeNodePrimitives, or empty array if not found\n *\n * @example\n * ```ts\n * const node = findNodeById(treeSnapshot, \"folder-id\");\n * const allowedChildren = getAllowedChildTypesForNode(fileTree, node);\n * // Returns [FolderNode, FileNode] if the folder can contain both\n * ```\n */\nexport function getAllowedChildTypesForNode<TRoot extends AnyTreeNodePrimitive>(\n tree: TreePrimitive<TRoot>,\n snapshot: TreeNodeSnapshot<AnyTreeNodePrimitive>\n): readonly AnyTreeNodePrimitive[] {\n const primitive = getNodePrimitive(tree, snapshot);\n if (!primitive) return [];\n return primitive.children;\n}\n\n/**\n * Check if a child type is allowed for a specific snapshot node.\n *\n * @param tree - The TreePrimitive schema\n * @param parentSnapshot - The parent node snapshot\n * @param childTypeName - The type string of the potential child\n * @returns true if the child type is allowed\n *\n * @example\n * ```ts\n * const folder = findNodeById(treeSnapshot, \"folder-id\");\n * canAddChildType(fileTree, folder, \"file\"); // true\n * canAddChildType(fileTree, folder, \"unknown\"); // false\n * ```\n */\nexport function canAddChildType<TRoot extends AnyTreeNodePrimitive>(\n tree: TreePrimitive<TRoot>,\n parentSnapshot: TreeNodeSnapshot<AnyTreeNodePrimitive>,\n childTypeName: string\n): boolean {\n const primitive = getNodePrimitive(tree, parentSnapshot);\n if (!primitive) return false;\n return primitive.isChildAllowed(childTypeName);\n}\n\n/**\n * Get all allowed child node types for a specific node type.\n *\n * @param nodeType - The TreeNodePrimitive to get children for\n * @returns Array of allowed child TreeNodePrimitives\n *\n * @example\n * ```ts\n * const FolderNode = TreeNode(\"folder\", { ... });\n * const FileNode = TreeNode(\"file\", { ... });\n *\n * // Get allowed children for FolderNode\n * const allowedChildren = getAllowedChildTypes(FolderNode);\n * // Returns [FolderNode, FileNode] if folder can contain both\n * ```\n */\nexport function getAllowedChildTypes<TNode extends AnyTreeNodePrimitive>(\n nodeType: TNode\n): readonly AnyTreeNodePrimitive[] {\n return nodeType.children;\n}\n\n/**\n * Get all unique node types reachable in a tree schema.\n * Recursively traverses the tree structure starting from the root.\n *\n * @param tree - The TreePrimitive to analyze\n * @returns Array of all unique TreeNodePrimitives in the tree schema\n *\n * @example\n * ```ts\n * const fileTree = Tree({ root: FolderNode });\n * const allNodeTypes = getAllNodeTypes(fileTree);\n * // Returns [FolderNode, FileNode] - all possible node types\n * ```\n */\nexport function getAllNodeTypes<TRoot extends AnyTreeNodePrimitive>(\n tree: TreePrimitive<TRoot>\n): readonly AnyTreeNodePrimitive[] {\n const visited = new Set<string>();\n const result: AnyTreeNodePrimitive[] = [];\n\n const visit = (node: AnyTreeNodePrimitive) => {\n if (visited.has(node.type)) return;\n visited.add(node.type);\n result.push(node);\n\n for (const child of node.children) {\n visit(child);\n }\n };\n\n visit(tree.root);\n return result;\n}\n\n/**\n * Get the node type primitive by its type string from a tree schema.\n *\n * @param tree - The TreePrimitive to search\n * @param typeName - The type string to find (e.g., \"folder\", \"file\")\n * @returns The matching TreeNodePrimitive, or undefined if not found\n *\n * @example\n * ```ts\n * const fileTree = Tree({ root: FolderNode });\n * const folderType = getNodeTypeByName(fileTree, \"folder\");\n * // Returns FolderNode\n * ```\n */\nexport function getNodeTypeByName<TRoot extends AnyTreeNodePrimitive>(\n tree: TreePrimitive<TRoot>,\n typeName: string\n): AnyTreeNodePrimitive | undefined {\n const allTypes = getAllNodeTypes(tree);\n return allTypes.find((node) => node.type === typeName);\n}\n\n/**\n * Check if a child type is allowed under a parent type.\n *\n * @param parentType - The parent TreeNodePrimitive\n * @param childTypeName - The type string of the potential child\n * @returns true if the child type is allowed\n *\n * @example\n * ```ts\n * isChildTypeAllowed(FolderNode, \"file\"); // true if folder can contain files\n * isChildTypeAllowed(FileNode, \"folder\"); // false - files can't have children\n * ```\n */\nexport function isChildTypeAllowed(\n parentType: AnyTreeNodePrimitive,\n childTypeName: string\n): boolean {\n return parentType.isChildAllowed(childTypeName);\n}\n"],"mappings":"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"}
|