import { DependencyList } from "react"; import { AtomChange, ChangesEvent } from "../change/index.ts"; import { DetachedValue } from "../detached/index.ts"; import { EventsTree } from "../events/index.ts"; import type { Field } from "../field/definition.ts"; import type { State } from "../state/definition.ts"; import type { Enso } from "../types.ts"; import type { EnsoUtils as Utils } from "../utils.ts"; export declare class Atom> implements Utils.StaticImplements, Atom.Static>, Atom.Exact { static safeNullish(value: Type | Utils.Nullish): Enso.SafeNullish; constructor(value: ValueDef["read"], parent?: Atom.Parent.Ref); deconstruct(): void; [AtomPrivate.immutablePhantom]: Atom.Immutable.Phantom; readonly [AtomPrivate.variantPhantom]: Atom.Variant.Phantom; [AtomPrivate.qualifierPhantom]: Atom.Qualifier.Phantom; [AtomPrivate.valueExactPhantom]: Atom.ValueExactPhantom; [AtomPrivate.parentPhantom]: Atom.Parent.Phantom; readonly id: string; get value(): Atom.Value.Prop; useValue: Atom.Value.Use.Prop; compute(callback: Atom.Compute.Callback): Result; readonly useCompute: Atom.Compute.Use.Prop; set(value: NewValue): Atom.Set.Result; pave>(value: NewValue): Atom.Pave.Result; get lastChanges(): AtomChange; useMeta: Atom.Meta.Use.Prop; size: Atom.Size.Prop; remove: Atom.Remove.Prop; forEach: Atom.ForEachProp; map: Atom.MapProp; find: Atom.FindProp; filter: Atom.FilterProp; useCollection: Atom.Collection.Use.Prop; insert: Atom.Insert.Prop; push: Atom.Push.Prop; get root(): Atom.Root.Prop; get parent(): Atom.Parent.Prop; get key(): string; get $(): Atom.$.Prop; at: Atom.At.Prop; try: Atom.TryProp; get path(): string[]; get name(): string; readonly self: Atom.Self.Envelop; lookup(path: Atom.Path): Atom.Lookup.Result; events: Atom.Events.Prop; watch(callback: Atom.Watch.Callback): Atom.Unwatch; useWatch: Atom.Watch.Use.Prop; trigger: Atom.Trigger.Prop; readonly decompose: Atom.Decompose.Prop; readonly useDecompose: Atom.Decompose.Use.Prop; readonly decomposeNullish: Atom.DecomposeNullish.Prop; readonly useDecomposeNullish: Atom.DecomposeNullish.Prop; readonly discriminate: Atom.Discriminate.Prop; readonly useDiscriminate: Atom.Discriminate.Use.Prop; into: Atom.Proxy.Into.Prop; useInto: Atom.Proxy.Into.Use.Prop; useDefined: Atom.Defined.Use.Prop; shared: Atom.Shared.Prop; optional: Atom.Optional.Prop; } export declare namespace Atom { export type Path = readonly (string | number)[]; export interface Static { safeNullish(value: Type | Utils.Nullish): Enso.SafeNullish; } export namespace Static { interface Subclass { create> = Atom.Parent.Default>(value: Value, parent?: Parent.Ref): Envelop, Qualifier, Parent>; base>(atom: EnvelopType): Atom.Base.Result; proxy>(atom: Atom.Envelop, intoMapper: Atom.Proxy.Into.Mapper, fromMapper: Atom.Proxy.From.Mapper): Atom.Proxy.Envelop; use(initialValue: Value, deps: DependencyList): Atom.Envelop>; useEnsure | Utils.Falsy, MappedType extends Envelop | Utils.Falsy = undefined>(atom: EnvelopType, map?: Ensure.Mapper): Ensure.Result; } namespace Ensure { interface Mapper | Utils.Falsy, MappedType extends Envelop | Utils.Falsy> extends Bare.Mapper, AtomValueDef>, MappedType> { } type Result | Utils.Falsy, MappedType extends Envelop | Utils.Falsy> = MappedType extends undefined ? ResultDirect : ResultMapped; type ResultDirect | Utils.Falsy> = Utils.Expose, Def.Union, Utils.Extends extends true ? undefined : never>, AtomQualifier>>; type ResultMapped | Utils.Falsy, MappedType extends Envelop | Utils.Falsy> = Utils.Expose, Def.Union, Utils.Extends extends true ? undefined : never>, AtomQualifier>>; type AtomValueDef | Utils.Falsy> = Utils.NonFalsy extends Envelop ? ValueDef extends Atom.Def ? [WriteValue, ReadValue] extends [ReadValue, WriteValue] ? ValueDef : Atom.Def : never : never; type AtomQualifier | Utils.Falsy> = Utils.NonFalsy extends Envelop ? Qualifier : never; namespace Bare { interface Mapper { (atom: AtomType): MappedType; } } } } export namespace Flavor { type Constraint = Kind | Variant; type Kind = "state" | "field"; type Variant = "immutable" | "optional" | "base" | "exact"; type Extends = FlavorToCheck extends Flavor ? true : false; } export type Envelop = Atom.Parent.Default> = Kind extends "state" ? State.Envelop : Kind extends "field" ? Field.Envelop : never; export type Prop = Kind extends "state" ? State.Prop : Kind extends "field" ? Field.Prop : "atom"; export namespace Variant { type Phantom = "exact" extends Variant ? { read: true; base: true; exact: true; } : "base" extends Variant ? { read: true; base: true; } : "optional" extends Variant ? { read: true; optional: true; } : "immutable" extends Variant ? { read: true; } : {}; type Parse = Utils.NonFalsy extends { readonly [AtomPrivate.variantPhantom]: infer TypePhantom; } ? TypePhantom extends Phantom<"exact"> ? "exact" : TypePhantom extends Phantom<"base"> ? "base" : TypePhantom extends Phantom<"optional"> ? "optional" : TypePhantom extends Phantom<"immutable"> ? "immutable" : never : never; } export namespace Qualifier { interface Constraint { root?: true; detachable?: true; tried?: true; bound?: true; ref?: true; source?: any; } type Default = Constraint; type Phantom = Qualifier; namespace Ref { type DisableFor = Utils.Extends extends true ? undefined : Type; type Preserve = Utils.Extends extends true ? { ref: true; } : {}; } namespace External { type Default = unknown; type Constraint = Known | unknown; type Known = "root" | "detachable" | "tried" | "bound" | "ref" | Proxy.Qualifier; type Concat = Extract | ToAdd; } type Internalize = Utils.Transparent extends true ? {} : Internalize.Basic & Internalize.Basic & Internalize.Basic & Internalize.Basic & Internalize.Basic & Internalize.Proxy>; namespace Internalize { type Basic = TestQualifier extends Qualifier ? Utils.IsNever extends true ? {} : { [Key in TestQualifier]: true; } : {}; type Proxy = Extract> extends infer ProxyQualifier ? Utils.IsNever extends true ? {} : ProxyQualifier extends Proxy.Qualifier ? { source: SourceValue; } : {} : {}; } } export namespace Parent { type Constraint = Type>; type Type = ParentInterface extends Interface ? Value extends ParentValue[Key] ? ParentInterface : never : never; type Default = never; type Phantom> = Utils.IsNever extends true ? unknown : { parent: Parent; }; type Envelop = Atom.Envelop extends true ? any : Value>, Qualifier.Ref.Preserve>; type Prop> = Ref extends true ? Interface : Parent>; type Ref> = Parent extends Interface ? Parent.Direct | Parent.Source : never; type Direct = Bare.Direct, Key>; interface Interface { value: ParentValue; key: Key; } interface Source extends Bare.Source> { } namespace Bare { type Ref = Direct | Source; type Direct = { key: Key; } & { [Key in Atom.Prop]: AtomType; }; interface Source { source: AtomType; } } } export type Child = Envelop, Child.Value, Child.Qualifier>; export namespace Child { type Access = "indexed" | "iterated"; type Variant = Utils.IsAny extends true ? "exact" : Utils.IsReadonlyArray extends true ? Variant extends "immutable" ? "immutable" : "base" : Variant extends "base" ? "exact" : Variant; type Value = Utils.Expose extends true ? never : undefined : never) extends infer Value ? Utils.Extends extends true ? Utils.NonNullish : Value : never>>; type Qualifier, Qualifier extends Qualifier.Constraint> = Qualifier.Ref.Preserve & (Utils.IsAny extends true ? { detachable: true; } : Utils.IsStaticKey extends true ? Utils.IsOptionalKey extends true ? { detachable: true; } : {} : Utils.IsReadonlyArray extends true ? {} : ParentValue extends Utils.Tuple ? {} : { detachable: true; }); } export interface Exact> extends Immutable { set(value: NewValue): Set.Result; pave>(value: NewValue): Pave.Result; [AtomPrivate.valueExactPhantom]: Atom.ValueExactPhantom; lastChanges: AtomChange; remove: Remove.Prop; insert: Insert.Prop; push: Push.Prop; } export namespace Exact { type Envelop> = "state" extends Kind ? State.Exact : "field" extends Kind ? Field.Exact : never; interface Self> extends Immutable.Self { remove: Atom.Self.Remove.Prop; } } export interface Base = Atom.Parent.Default> extends Immutable { } export namespace Base { type Envelop> = Utils.Expose : Kind extends "field" ? Field.Base.Internal : never>; type Result> = Atom.Base.Envelop, Qualifier.Shared, never>; namespace Value { type BaseDef> = [EnvelopType] extends [Atom.Envelop] ? Def ? ReadValue : never, ValueDef extends Def ? WriteValue : never> : never; } namespace Qualifier { type Shared = Utils.Union.Shared>; type Union = EnvelopType extends Atom.Envelop ? Qualifier : never; type IsShared = EnvelopType extends Atom.Envelop ? QualifierUnion extends EnvelopTypeQualifier ? true : false : false; } interface Self = Atom.Parent.Default> extends Immutable.Self { } } export interface Optional = Atom.Parent.Default> extends Immutable { } export namespace Optional { type Envelop = Atom.Parent.Default> = Utils.Expose<"state" extends Kind ? State.Optional.Internal : "field" extends Kind ? Field.Optional.Internal : never>; interface Self = Atom.Parent.Default> extends Immutable.Self { } type Prop> = Fn; interface Fn> { (): Atom.Envelop, Qualifier, Parent>; } type Def = ValueDef extends Atom.Def ? Atom.Def, Utils.NonNullish> : never; } export interface Immutable> { [AtomPrivate.immutablePhantom]: Immutable.Phantom; readonly [AtomPrivate.variantPhantom]: Atom.Variant.Phantom; [AtomPrivate.qualifierPhantom]: Atom.Qualifier.Phantom; [AtomPrivate.parentPhantom]: Parent.Phantom; deconstruct(): void; readonly id: string; readonly value: Atom.Value.Prop; readonly useValue: Atom.Value.Use.Prop; compute(callback: Compute.Callback): Result; readonly useCompute: Compute.Use.Prop; useMeta: Meta.Use.Prop; root: Root.Prop; parent: Parent.Prop; readonly key: string; readonly path: string[]; readonly name: string; $: $.Prop; at: At.Prop; try: Atom.TryProp; readonly self: Self.Envelop; lookup(path: Atom.Path): Lookup.Result; size: Size.Prop; forEach: ForEachProp; map: MapProp; find: FindProp; filter: FilterProp; useCollection: Collection.Use.Prop; events: Events.Prop; watch(callback: Watch.Callback): Unwatch; useWatch: Watch.Use.Prop; trigger: Trigger.Prop; readonly decompose: Decompose.Prop; readonly useDecompose: Decompose.Use.Prop; readonly decomposeNullish: Atom.DecomposeNullish.Prop; readonly useDecomposeNullish: Atom.DecomposeNullish.Prop; readonly discriminate: Discriminate.Prop; readonly useDiscriminate: Discriminate.Use.Prop; into: Proxy.Into.Prop; useInto: Proxy.Into.Use.Prop; useDefined: Defined.Use.Prop; shared: Shared.Prop; optional: Optional.Prop; } export namespace Immutable { type Phantom = $.Prop; interface Self> { try(): Try; } type Try> = ValueDef["read"] extends infer Value ? (null extends Value ? null : never) | (undefined extends Value ? undefined : never) | Atom.Envelop>, Qualifier & { tried: true; }, Parent> : never; } export namespace Shared { namespace Value { type Tuple = [unknown, unknown, unknown, unknown, unknown] | [unknown, unknown, unknown, unknown] | [unknown, unknown, unknown] | [unknown, unknown]; type Union = ValueTuple extends Utils.Tuple ? Utils.IndexOfTuple extends infer Index extends keyof ValueTuple ? ValueTuple[Index] : never : never; type Intersection = Union extends infer Value ? ValueTuple extends Utils.Tuple ? Utils.IndexOfTuple extends infer Index extends keyof ValueTuple ? Value extends Value ? (Index extends Index ? Value extends ValueTuple[Index] ? true : false : never) extends true ? Value : never : never : never : never : never; } interface Prop = Parent.Default> { (): Result; } type Result> = Envelop extends infer ResultTuple extends Value.Tuple ? Utils.IsNever extends true ? Atom.Def : Shared.Def : never, Qualifier, Parent>; type Def = Atom.Def, Shared.Value.Intersection>; namespace Result { type Tuple = "exact" extends Variant ? Exact : Base; type Exact = Sharable extends true ? Extends extends true ? { [Key in keyof ValueTuple]: ExcludeSubclasses; } : never : never; type ExcludeSubclasses = ValueItem extends ValueItem ? Value extends ValueItem ? Value : ValueItem : never; type Base = Sharable extends true ? Extends extends true ? ValueTuple : never : never; type Sharable = true extends (Utils.IndexOfTuple extends infer Index1 extends keyof ValueTuple ? Index1 extends Index1 ? (Utils.IndexOfTuple extends infer Index2 extends keyof ValueTuple ? Index2 extends Index2 ? ValueTuple[Index1] extends ValueTuple[Index2] ? true : false : never : never) extends true ? true : never : never : never) ? true : false; type Extends = true extends (Utils.IndexOfTuple extends infer Index extends keyof ValueTuple ? Index extends Index ? EachExtends extends true ? true : never : never : never) ? true : false; type EachExtends = (Value extends Value ? true extends (TupleValue extends TupleValue ? Value extends TupleValue ? true : never : never) ? true : false : never) | (TupleValue extends TupleValue ? true extends (Value extends Value ? Value extends TupleValue ? true : never : never) ? true : false : never) extends true ? true : false; } } export interface Def { readonly read: ReadValue; readonly write: WriteValue; [defBrand]: true; } const defBrand: unique symbol; export namespace Def { type Constraint = Atom.Def; type Union = ValueDef extends Def ? Def : never; } export namespace Value { type Prop = Opaque; type Opaque = Utils.IsNotTop extends true ? Value extends string & (infer Brand extends Utils.AnyBrand) ? string & Brand : Value extends number & (infer Brand extends Utils.AnyBrand) ? number & Brand : Value extends boolean & (infer Brand extends Utils.AnyBrand) ? boolean & Brand : Value extends symbol & (infer Brand extends Utils.AnyBrand) ? symbol & Brand : { [Key in keyof Value]: Value[Key]; } : Utils.IsUnknown extends true ? never : Utils.IsAny extends true ? any : Value; type FromEnvelop> = EnvelopType extends Atom.Envelop ? Value : never; namespace Use { type Prop = Qualifier.Ref.DisableFor>; interface Fn { | undefined = undefined>(props?: Props): Result; } type Result | undefined> = IncludeMeta extends true ? [ Opaque, Props extends { meta: true; } ? Meta : Meta ] : Opaque; type Props = "state" extends Kind ? State.Value.Use.Props : "field" extends Kind ? Field.Value.Use.Props : never; type IncludeMeta | undefined> = "state" extends Kind ? State.Value.Use.IncludeMeta : "field" extends Kind ? Field.Value.Use.IncludeMeta : never; } } export type ValueExactPhantom = (value: Value) => void; export type ValueExactPhantomArg = Utils.IsUnknown extends true ? any : Value; export type ValueExactPhantomResult = Utils.IsUnknown extends true ? Value : void; export namespace Set { type Result> = Envelop, Qualifier, Parent>; type Def = Atom.Def; } export namespace Pave { type Result> = Envelop, Qualifier, Parent>; type Def = Atom.Def; } export type Meta | undefined> = "state" extends Kind ? State.Meta : "field" extends Kind ? Field.Meta : never; export namespace Meta { type Props = "state" extends Flavor ? State.Meta.Props : "field" extends Flavor ? Field.Meta.Props : never; namespace Use { type Prop> = Qualifier.Ref.DisableFor>; interface Fn> { | undefined = undefined>(props?: Props): Meta; } } } export namespace Self { type Envelop> = Variant extends "exact" ? Exact.Self : Variant extends "base" ? Base.Self : Variant extends "optional" ? Optional.Self : Variant extends "immutable" ? Immutable.Self : never; namespace Remove { type Prop = Atom.Parent.Default> = Utils.IsNever> extends false ? Fn : undefined; interface Fn = Atom.Parent.Default> { (): Atom.Envelop, Qualifier, Parent>; } } } export namespace Size { type Prop = ValueDef["read"] extends infer Value ? Value extends object ? Value extends Utils.BrandedPrimitive ? undefined : number : undefined : never; } export namespace Remove { type Prop = ValueDef["read"] extends infer Value ? Value extends unknown[] | readonly unknown[] ? Utils.IsReadonlyArray extends true ? undefined : Value extends Utils.Tuple ? undefined : Value extends unknown[] ? Fn.Array : never : Value extends object ? Value extends Utils.BrandedPrimitive ? undefined : Fn.Object : undefined : never; namespace Fn { interface Array { (item: number): Envelop, { detachable: true; }>; } interface Object { >(key: Key): Envelop, { detachable: true; }>; } type ObjectDetachableKeys = Exclude<{ [Key in keyof Value]: Utils.IsStaticKey extends true ? Utils.IsOptionalKey extends true ? Key : never : Key; }[keyof Value], undefined>; } } export namespace Collection { interface TupleHandlerPair { (...args: { [Key in Utils.IndexOfTuple]: [ Child, Key ]; }[Utils.IndexOfTuple]): Result; } interface TupleHandlerSingle { (item: { [Key in keyof Value]: Envelop>; }[Utils.IndexOfTuple], index?: Utils.IndexOfTuple): Result; } type TupleItem = { [Key in Utils.IndexOfTuple]: Envelop>; }[Utils.IndexOfTuple]; interface ArrayHandler { (item: Child, index: number): Result; } interface ObjectHandlerPair { (...args: Exclude<{ [Key in Utils.CovariantifyKeyof]: [ Child, Key ]; }[Utils.CovariantifyKeyof], undefined>): Result; } interface ObjectHandlerSingle { (item: Exclude<{ [Key in keyof Value]: Child; }[keyof Value], undefined>): Result; } type ObjectItem = Exclude<{ [Key in keyof Value]: Child; }[keyof Value], undefined>; type Mapper = ValueDef["read"] extends infer Value ? Utils.IsReadonlyArray extends true ? Value extends Utils.ReadonlyArrayConstraint ? Mapper.Array : never : Value extends Utils.Tuple ? Mapper.Tuple : Value extends unknown[] ? Mapper.Array : Value extends object ? Value extends Utils.BrandedPrimitive ? undefined : Mapper.Object : undefined : never; namespace Mapper { type ResultType = "each" | "map"; type CallbackResult = ProcessorType extends "each" ? unknown : Result; type Result = ProcessorType extends "each" ? void : Result[]; interface Tuple { (callback: Collection.TupleHandlerPair>): Mapper.Result; (callback: Collection.TupleHandlerSingle>): Mapper.Result; } interface Array { (callback: Collection.ArrayHandler>): Mapper.Result; } interface Object { (callback: Collection.ObjectHandlerPair>): Mapper.Result; (callback: Collection.ObjectHandlerSingle>): Mapper.Result; } } type Selector = ValueDef["read"] extends infer Value ? Utils.IsReadonlyArray extends true ? Value extends Utils.ReadonlyArrayConstraint ? Selector.Array : undefined : Value extends Utils.Tuple ? Selector.Tuple : Value extends unknown[] ? Selector.Array : Value extends object ? Value extends Utils.BrandedPrimitive ? undefined : Selector.Object : undefined : never; namespace Selector { type Type = "find" | "filter"; type Result = SelectorType extends "find" ? Result | undefined : Result[]; interface Tuple { (callback: Collection.TupleHandlerPair): Result>; (callback: Collection.TupleHandlerSingle): Result>; } interface Array { (callback: Collection.ArrayHandler): Result>; } interface Object { (callback: Collection.ObjectHandlerPair): Result>; (callback: Collection.ObjectHandlerSingle): Result>; } } namespace Use { type Prop> = Qualifier.Ref.DisableFor>; type Fn> = ValueDef["read"] extends infer Value ? Value extends object ? Value extends Utils.BrandedPrimitive ? undefined : () => Envelop, Qualifier & { bound: true; }, Parent> : undefined : never; } } export type ForEachProp = Collection.Mapper; export type MapProp = Collection.Mapper; export type FindProp = Collection.Selector; export type FilterProp = Collection.Selector; export namespace Insert { type Prop> = ValueDef["read"] extends infer Value ? Value extends Utils.StaticArray ? undefined : Value extends unknown[] ? Fn : undefined : never; interface Fn { (index: number, value: Value[number]): Envelop, Atom.Def, Child.Qualifier>; } } export namespace Push { type Prop = ValueDef["read"] extends infer Value ? Value extends Utils.Tuple ? undefined : Value extends unknown[] ? Fn : undefined : never; interface Fn { (value: Value[number]): Envelop, Atom.Def, Child.Qualifier>; } } export namespace Root { type Prop = Envelop, Qualifier.Ref.Preserve & { root: true; }>; } export namespace $ { type Prop = Utils.IsAny extends true ? any : Utils.IsUnknown extends true ? never : Value extends object ? Value extends Utils.BrandedPrimitive ? undefined : { [Key in keyof Value]-?: Utils.Expose>; } : Utils.Extends extends true ? never : undefined; } export namespace At { type Prop = (Utils.HasNonObject extends true ? undefined : never) | (Utils.OnlyObject extends infer Value ? Fn, keyof Utils.NonNullish, Qualifier> : never); interface Fn { (key: ArgKey | Enso.SafeNullish): Child; } type Child = Key extends Key ? Atom.Child : never; } export type TryProp> = Utils.OnlyObject | Utils.OnlyAny extends infer Value ? Utils.IsNever extends false ? keyof Value extends infer Key extends keyof Value ? (key: ArgKey | Enso.SafeNullish) => TryChild | (Utils.HasNonObject extends true ? undefined : never) : never : never : never; export type TryChild, Qualifier extends Atom.Qualifier.Constraint> = Key extends Key ? TryEnvelop[Key], Child.Qualifier> | (Utils.Or, Key>, Utils.IsAny> extends true ? never : undefined) : never; export type TryEnvelop = (null extends Value ? null : never) | (undefined extends Value ? undefined : never) | Atom.Envelop, Atom.Def>, Qualifier & { tried: true; }>; export interface TrySelfFn> { (): TrySelfResult; } export type TrySelfResult> = ValueDef["read"] extends infer Value ? Utils.IsAny extends true ? any : (null extends Value ? null : never) | (undefined extends Value ? undefined : never) | Atom.Envelop>, Qualifier & { tried: true; }, Parent> : never; export type BareTry = (key: Key) => Type | undefined; export namespace Lookup { type Result> = Envelop, Def, Lookup.Qualifier, never>; type Variant = Utils.Extends extends true ? "exact" : Utils.Extends extends true ? "exact" : Variant; type Qualifier = Qualifier.Ref.Preserve; } /** * Optional reference target. */ export type OptionalTarget = OptionalTargetDirect | OptionalTargetProjection; export type OptionalTargetDirect = BareOptionalTargetDirect>>; export type OptionalTargetProjection = BareOptionalTargetProjection>>; export type BareOptionalTarget = BareOptionalTargetDirect | BareOptionalTargetProjection; export type BareOptionalTargetDirect = { type: "direct"; } & { [Key in Atom.Prop]: Type; }; export interface BareOptionalTargetProjection { type: "shadow"; closest: Type; /** Path relative to the closest atom. */ path: Atom.Path; } export type Unwatch = () => void; export namespace Watch { type Callback = Bare.Callback; namespace Use { type Prop = Qualifier.Ref.DisableFor>; interface Fn { (callback: Watch.Callback, deps: DependencyList): Unwatch; } } namespace Bare { interface Callback { (value: ValueType, event: ChangesEvent): void; } } } export namespace Events { type Prop = Qualifier.Ref.DisableFor>; } export namespace Trigger { type Prop = Qualifier.Ref.DisableFor; interface Fn { (changes: AtomChange, notifyParents?: boolean): void; } } export namespace Compute { interface Callback { (value: Value): Result; } namespace Use { type Prop = Qualifier.Ref.DisableFor>; interface Fn { (callback: Callback, deps: DependencyList): Result; } } } export namespace Decompose { interface Prop> { (): Result; } type Result> = ValueDef["read"] extends infer Value ? (Value extends Value ? { value: Value; } & { [Key in Atom.Prop]: Envelop, Qualifier, Parent>; } : never) | (Utils.Extends extends true ? { value: unknown; } & { [Key in Atom.Prop]: Envelop, Qualifier, Parent>; } : never) : never; namespace Use { type Prop> = Qualifier.Ref.DisableFor>; interface Fn> { (callback: Callback, deps: DependencyList): Result; } type Callback = (newValue: ValueDef["read"], prevValue: ValueDef["read"]) => boolean; } } export namespace DecomposeNullish { interface Prop> { (): Result; } type Result> = (ValueDef["read"] & {} extends infer Value ? Utils.IsNever extends false ? { value: Value; } & { [Key in Atom.Prop]: Envelop, Qualifier, Parent>; } : never : never) | (Exclude extends infer Value ? Utils.IsNever extends false ? { value: Value; } & { [Key in Atom.Prop]: Envelop, Qualifier, Parent>; } : never : never) | (Utils.Extends extends true ? { value: unknown; } & { [Key in Atom.Prop]: Envelop, Qualifier, Parent>; } : never); } export namespace Discriminate { type Prop> = Fn; interface Fn> { >(discriminator: Discriminator): Result; } type Discriminator = keyof Utils.NonNullish; type Result, Qualifier extends Atom.Qualifier.Constraint, Parent extends Atom.Parent.Constraint> = Inner; type Inner, Qualifier extends Atom.Qualifier.Constraint, Parent extends Atom.Parent.Constraint> = ValueDef["read"] extends infer Value ? (Value extends Value ? Discriminator extends keyof Value ? Value[Discriminator] extends infer DiscriminatorValue ? DiscriminatorValue extends Value[Discriminator] ? { discriminator: DiscriminatorValue; } & { [Key in Atom.Prop]: Envelop, Qualifier, Parent>; } : never : never : // Add the payload type without the discriminator (i.e. undefined) { discriminator: Exclude; } & { [Key in Atom.Prop]: Envelop, Qualifier, Parent>; } : never) | (Utils.Extends extends true ? { discriminator: unknown; } & { [Key in Atom.Prop]: Envelop, Qualifier, Parent>; } : never) : never; namespace Use { type Prop> = Qualifier.Ref.DisableFor>; } } export namespace Proxy { interface Qualifier { source: ValueDef; } type Envelop> = Atom.Envelop, Proxy.Qualifier, Parent>; namespace Into { type Prop> = Into.Fn; interface Fn> { (intoMapper: Into.Mapper): Result; } interface Mapper { (value: ValueDef["read"]): ComputedValue; } interface Result> { from: From.Fn; } namespace Use { type Prop> = Qualifier.Ref.DisableFor>; interface Fn> { (intoMapper: Proxy.Into.Mapper, deps: DependencyList): Result; } interface Result = Atom.Parent.Default> { from: Proxy.From.Use.Fn; } } } namespace From { interface Fn = Atom.Parent.Default> { (fromMapper: Mapper): Envelop; } interface Mapper { (computedValue: ComputedValue, value: ValueDef["read"]): MappedValue; } namespace Use { interface Fn = Atom.Parent.Default> { (fromMapper: Mapper, deps: DependencyList): Envelop; } } } } export namespace Defined { interface FnString> = Atom.Parent.Default> { (to: "string"): Envelop, Qualifier, Parent>; } interface FnObject> = Atom.Parent.Default> { (to: "object" | "array"): Envelop, Qualifier, Parent>; } namespace Use { type Prop> = Qualifier.Ref.DisableFor>; type Fn> = ValueDef["read"] extends infer Value ? Utils.IsNever> extends false ? Value & {} extends infer NonNullishValue ? NonNullishValue extends string ? FnString : NonNullishValue extends object ? NonNullishValue extends Utils.StaticArray ? never : NonNullishValue extends unknown[] ? FnObject : NonNullishValue extends object ? Utils.StaticKeys extends Utils.OptionalKeys ? FnObject : never : never : undefined : never : never : never; } } export type DefinedType = "string" | "array" | "object"; export namespace Hooks { type Result = Enable extends true | undefined ? Type : undefined; } export {}; } declare namespace AtomPrivate { const immutablePhantom: unique symbol; const qualifierPhantom: unique symbol; const variantPhantom: unique symbol; const valueExactPhantom: unique symbol; const parentPhantom: unique symbol; } export {}; //# sourceMappingURL=definition.d.ts.map