UNPKG

warscript

Version:

A typescript library for Warcraft III using Warpack.

85 lines (84 loc) 7.01 kB
/// <reference types="@typescript-to-lua/language-extensions" /> /** @noSelfInFile */ import { DispatchingEvent } from "../event"; import { AbstractConstructor } from "../utility/types"; import { ObjectDataEntry, ObjectDataEntryIdType, ObjectDataEntryLevelFieldValueSupplier } from "./object-data/entry"; export type ObjectFieldId = number & { readonly __objectDataEntryFieldId: unique symbol; }; export type ObjectFieldConstructor<T extends ObjectFieldBase<any, any, any, any>> = OmitConstructor<typeof ObjectFieldBase> & (new (id: number) => T); export type ObjectFieldAbstractConstructor<T extends ObjectFieldBase<any, any, any, any>> = OmitConstructor<typeof ObjectFieldBase> & (abstract new (id: number) => T); declare abstract class ObjectFieldBase<ObjectDataEntryType extends ObjectDataEntry, InstanceType extends AnyNotNil, ValueType, NativeFieldType> { protected readonly valueByInstance: LuaMap<InstanceType, ValueType>; protected abstract readonly instanceClass: AbstractConstructor<InstanceType> | Function; supports(instance: AnyNotNil): instance is InstanceType & { readonly __oneSidedTypeGuard: unique symbol; }; protected get nativeField(): NativeFieldType; readonly id: ObjectFieldId; protected abstract getNativeFieldById(id: number): NativeFieldType; protected abstract getObjectDataEntryId(instance: InstanceType): ObjectDataEntryIdType<ObjectDataEntryType>; constructor(id: number); static create<T extends ObjectFieldBase<any, any, any, any>>(this: ObjectFieldConstructor<T>, id?: number): T & symbol; static of<T extends ObjectFieldBase<any, any, any, any>>(this: ObjectFieldAbstractConstructor<T>, id: number): T | undefined; } export type ObjectFieldValueChangeEvent<T extends ObjectField<any, any, any, any> | ReadonlyObjectFieldType<ObjectField<any, any, any, any>>> = T extends ObjectField<any, infer InstanceType, infer ValueType, any> ? DispatchingEvent<[ instance: InstanceType, field: T, previousValue: ValueType, newValue: ValueType ]> : T extends ReadonlyObjectFieldType<ObjectField<any, infer InstanceType, infer ValueType, any>> ? DispatchingEvent<[ instance: InstanceType, field: T, previousValue: ValueType, newValue: ValueType ]> : never; export type ReadonlyObjectFieldType<T extends ObjectField<any, any, any, any>> = Omit<T, "setValue" | "removeValue">; type ReadonlyObjectFieldConstructor<T extends ObjectField> = OmitConstructor<typeof ObjectField> & (abstract new (...args: any[]) => ReadonlyObjectFieldType<T>); export declare abstract class ObjectField<ObjectDataEntryType extends ObjectDataEntry = ObjectDataEntry, InstanceType extends AnyNotNil = AnyNotNil, ValueType extends number | string | boolean = number | string | boolean, NativeFieldType = unknown> extends ObjectFieldBase<ObjectDataEntryType, InstanceType, ValueType, NativeFieldType> { protected abstract readonly defaultValue: ValueType; protected abstract getNativeFieldValue(instance: InstanceType): ValueType; protected abstract setNativeFieldValue(instance: InstanceType, value: ValueType): boolean; getValue(entry: ObjectDataEntryType | InstanceType): ValueType; setValue(entry: ObjectDataEntryType | InstanceType, value: ValueType): boolean; removeValue(entry: ObjectDataEntryType): boolean; private invokeValueChangeEvent; private invokeValueChangeEventRecursive; protected static getOrCreateValueChangeEvent<T extends ObjectField, R extends ReadonlyObjectFieldType<T>>(this: ReadonlyObjectFieldConstructor<T>): ObjectFieldValueChangeEvent<R>; static get valueChangeEvent(): ObjectFieldValueChangeEvent<ReadonlyObjectFieldType<ObjectField>>; } export type ReadonlyObjectLevelFieldType<T extends ObjectLevelField<any, any, any, any>> = Omit<T, "setValue">; export type ObjectLevelFieldValueChangeEvent<T extends ObjectLevelField<any, any, any, any> | ReadonlyObjectLevelFieldType<ObjectLevelField<any, any, any, any>>> = T extends ObjectLevelField<any, infer InstanceType, infer ValueType, any, any> ? DispatchingEvent<[ instance: InstanceType, field: T, level: number, previousValue: ValueType, newValue: ValueType ]> : T extends ReadonlyObjectLevelFieldType<ObjectLevelField<any, infer InstanceType, infer ValueType, any, any>> ? DispatchingEvent<[ instance: InstanceType, field: T, level: number, previousValue: ValueType, newValue: ValueType ]> : never; type ReadonlyObjectLevelFieldConstructor<T extends ObjectLevelField> = OmitConstructor<typeof ObjectLevelField> & (abstract new (...args: any[]) => ReadonlyObjectLevelFieldType<T>); export declare abstract class ObjectArrayField<ObjectDataEntryType extends ObjectDataEntry = ObjectDataEntry, InstanceType extends AnyNotNil = AnyNotNil, ValueType extends number | string | boolean = number | string | boolean, NativeFieldType = unknown> extends ObjectFieldBase<ObjectDataEntryType, InstanceType, ValueType[], NativeFieldType> { protected abstract readonly defaultValue: ValueType; protected abstract getNativeFieldValue(instance: InstanceType, index: number): ValueType; protected abstract setNativeFieldValue(instance: InstanceType, index: number, value: ValueType): boolean; getValue<IndexType extends [number] | []>(entry: ObjectDataEntryType | InstanceType, ...[index]: IndexType): IndexType extends [number] ? ValueType : ValueType[]; setValue(entry: ObjectDataEntryType | InstanceType, value: ValueType[]): boolean; } export declare abstract class ObjectLevelField<ObjectDataEntryType extends ObjectDataEntry = ObjectDataEntry, InstanceType extends AnyNotNil = AnyNotNil, ValueType extends number | string | boolean = number | string | boolean, InputValueType extends ValueType = never, NativeFieldType = unknown> extends ObjectFieldBase<ObjectDataEntryType, InstanceType, ValueType[], NativeFieldType> { protected abstract readonly defaultValue: ValueType; protected abstract getNativeFieldValue(instance: InstanceType, level: number): ValueType; protected abstract setNativeFieldValue(instance: InstanceType, level: number, value: ValueType): boolean; protected abstract getLevelCount(entry: ObjectDataEntryType | InstanceType): number; getValue<LevelType extends [number] | []>(entry: ObjectDataEntryType | InstanceType, ...[level]: LevelType): LevelType extends [number] ? ValueType : ValueType[]; setValue(entry: ObjectDataEntryType | InstanceType, ...[levelOrValue, value]: [value: ObjectDataEntryLevelFieldValueSupplier<InputValueType, ValueType>] | [level: number, value: InputValueType]): boolean; private invokeValueChangeEvent; private invokeValueChangeEventRecursive; protected static getOrCreateValueChangeEvent<T extends ObjectLevelField, R extends ReadonlyObjectLevelFieldType<T>>(this: ReadonlyObjectLevelFieldConstructor<T>): ObjectLevelFieldValueChangeEvent<R>; static get valueChangeEvent(): ObjectLevelFieldValueChangeEvent<ReadonlyObjectLevelFieldType<ObjectLevelField>>; } export {};