@ankhzet/gcl 1.1.0 → 1.2.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @ankhzet/gcl
2
2
 
3
+ ## 1.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Fix release
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @ankhzet/eventual@1.2.0
13
+
3
14
  ## 1.1.0
4
15
 
5
16
  ### Minor Changes
@@ -0,0 +1,183 @@
1
+ import { EventName } from '@ankhzet/eventual';
2
+ import { Eventual } from '@ankhzet/eventual';
3
+ import { IEventHandler } from '@ankhzet/eventual';
4
+ import { IEventSource } from '@ankhzet/eventual';
5
+
6
+ /** @public */
7
+ export declare type Chain<In extends Class<any, any, any>, Rest extends any[]> = (Rest extends Mixed<infer Head, infer Tail> ? Chain<Mix<In, Head>, Tail> : In);
8
+
9
+ /** @public */
10
+ export declare type Class<T extends NonNullable<unknown> = any, Args extends unknown[] = any[], IsAbstract = false> = IsAbstract extends true ? abstract new (...args: Args) => T : new (...args: Args) => T;
11
+
12
+ /** @public */
13
+ export declare abstract class Component<P> extends DisposableEventSource implements GCInterface<P> {
14
+ parent: P;
15
+ constructor(parent: P);
16
+ static isClass<K extends {
17
+ new (...args: any[]): any;
18
+ }>(klass: K): (instance: any) => instance is InstanceType<K>;
19
+ }
20
+
21
+ /** @public */
22
+ export declare type ComponentConstructor<P, E> = {
23
+ new (parent: P, factories: ComponentsFactory<E, any>[], ...args: any[]): E;
24
+ };
25
+
26
+ /** @public */
27
+ export declare interface ComponentsFactory<P, C extends GCInterface<P>> {
28
+ (parent: P): C | C[];
29
+ }
30
+
31
+ /** @public */
32
+ export declare interface DGCInterface<P = any> extends GCInterface<P> {
33
+ isDriven: boolean;
34
+ update(delta: number): void;
35
+ onDrive(handler: IEventHandler<this>): Disposer;
36
+ }
37
+
38
+ /** @public */
39
+ export declare class DisposableEventSource extends Eventual implements DisposableInterface {
40
+ private _disposers?;
41
+ dispose(): void;
42
+ addDisposer(d: Disposer): void;
43
+ addControlledDisposer(d: Disposer): Disposer;
44
+ removeDisposer(d: Disposer): void;
45
+ onDispose(handler: IEventHandler<this>): Disposer;
46
+ /* Excluded from this release type: handleEvent */
47
+ }
48
+
49
+ /** @public */
50
+ export declare interface DisposableInterface extends IEventSource {
51
+ dispose(): void;
52
+ addDisposer(d: Disposer): void;
53
+ addControlledDisposer(d: Disposer): Disposer;
54
+ removeDisposer(d: Disposer): void;
55
+ onDispose(handler: IEventHandler<this>): Disposer;
56
+ }
57
+
58
+ /** @public */
59
+ export declare type Disposer = () => void;
60
+
61
+ /** @public */
62
+ export declare abstract class DynamicComponent<P> extends Component<P> implements DGCInterface<P> {
63
+ private _isDriven;
64
+ get isDriven(): boolean;
65
+ set isDriven(value: boolean);
66
+ onDrive(handler: IEventHandler<this>): Disposer;
67
+ abstract update(delta: number): void;
68
+ }
69
+
70
+ /** @public */
71
+ export declare class EntitiesPool<E extends EntityInterface> extends DisposableEventSource {
72
+ #private;
73
+ constructor();
74
+ get uid(): string;
75
+ get entities(): Iterable<E>;
76
+ add(entity: E): void;
77
+ remove(entity: E): void;
78
+ update(delta: number): void;
79
+ onEntity(handler: IEventHandler<{
80
+ entity: E;
81
+ added: boolean;
82
+ }>): Disposer;
83
+ }
84
+
85
+ /** @public */
86
+ export declare class Entity<P extends GCInterface | null = null> extends DynamicComponent<P> implements EntityInterface<P>, Reference<EntityInterface<P>> {
87
+ private static GUID;
88
+ static is: (ref: Reference) => ref is Reference<EntityInterface>;
89
+ readonly uid: string;
90
+ readonly components: GCInterface<this>[];
91
+ protected readonly disposers: Map<GCInterface<this>, Disposer>;
92
+ protected readonly driven: DGCInterface<this>[];
93
+ private readonly componentsMap;
94
+ constructor(parent: P, factories?: ComponentsFactory<any, any>[]);
95
+ toString(): string;
96
+ get type(): ReferenceType;
97
+ private handleComponentDrive;
98
+ private registerComponent;
99
+ addComponent(component: GCInterface): void;
100
+ removeComponent(component: GCInterface): void;
101
+ findComponent<T extends GCInterface>(predicate: (c: any) => c is T): T | undefined;
102
+ findComponents<T extends GCInterface>(predicate: (c: any) => c is T): T[];
103
+ onComponent(handler: IEventHandler<{
104
+ component: GCInterface;
105
+ added: boolean;
106
+ }>): Disposer;
107
+ update(delta: number): void;
108
+ }
109
+
110
+ /** @public */
111
+ export declare interface EntityInterface<P extends GCInterface | null = any> extends DGCInterface<P>, Reference {
112
+ readonly uid: string;
113
+ readonly type: ReferenceType;
114
+ addComponent(component: GCInterface): void;
115
+ removeComponent(component: GCInterface): void;
116
+ findComponents<T extends GCInterface>(predicate: (c: any) => c is T): T[];
117
+ findComponent<T extends GCInterface>(predicate: (c: any) => c is T): T | undefined;
118
+ onComponent(handler: IEventHandler<{
119
+ component: GCInterface;
120
+ added: boolean;
121
+ }>): Disposer;
122
+ }
123
+
124
+ /** @public */
125
+ export declare interface GCInterface<P = any> extends DisposableInterface {
126
+ parent: P;
127
+ }
128
+
129
+ /** @public */
130
+ export declare type Getter<This, Value> = (this: This) => Value;
131
+
132
+ /** @public */
133
+ export declare const isDynamicComponent: <C extends GCInterface>(c: C) => c is (DGCInterface & C);
134
+
135
+ /** @public */
136
+ export declare const isEntityRef: (ref: Reference) => ref is Reference<EntityInterface>;
137
+
138
+ /** @public */
139
+ export declare const lazy: <This, Value>(target: Getter<This, Value>, context: ClassGetterDecoratorContext<This, Value>) => Getter<This, Value>;
140
+
141
+ /** @public */
142
+ export declare const lazyAccessor: <This, Value>(init: Getter<This, Value>) => ({ get, set }: ClassAccessorDecoratorTarget<This, Value>, _context: ClassAccessorDecoratorContext<This, Value>) => ClassAccessorDecoratorResult<This, Value>;
143
+
144
+ /** @public */
145
+ export declare type Mix<Base extends Class<any, any, any>, Mixin extends Class<any, any>> = {
146
+ [k in keyof Base | keyof Mixin]: (k extends keyof Mixin ? Mixin[k] : k extends keyof Base ? Base[k] : never);
147
+ } & (new (...args: ConstructorParameters<Mixin>) => InstanceType<Base> & InstanceType<Mixin>);
148
+
149
+ /** @public */
150
+ export declare type Mixed<Head extends Class, Tail extends Class[]> = [Head, ...Tail];
151
+
152
+ /** @public */
153
+ export declare type MixFactory = (base: Class<any, any>) => Class<any, any>;
154
+
155
+ /** @public */
156
+ export declare const Mixin: <Base extends Class<any, any, true>>(base: Base) => <Mixins extends MixFactory[]>(...mixins: Mixins) => Chain<Base, Returns<Mixins>>;
157
+
158
+ /** @public */
159
+ export declare type Reference<T = {}> = T & {
160
+ readonly type: ReferenceType;
161
+ };
162
+
163
+ /** @public */
164
+ export declare class ReferenceBuckets<R extends Reference> extends Map<ReferenceType, Set<R>> {
165
+ #private;
166
+ get size(): number;
167
+ set size(value: number);
168
+ map<U>(mapper: (element: R) => U): U[];
169
+ contains(reference: R): Set<R> | undefined;
170
+ add(reference: R): void;
171
+ remove(reference: R): boolean;
172
+ }
173
+
174
+ /** @public */
175
+ export declare type ReferenceType = number;
176
+
177
+ /** @public */
178
+ export declare const RefTypeEntity: ReferenceType;
179
+
180
+ /** @public */
181
+ export declare type Returns<Mixins extends any[]> = (Mixins extends [infer Last, ...infer Rest] ? Last extends MixFactory ? [ReturnType<Last>, ...Returns<Rest>] : [] : []);
182
+
183
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1,196 @@
1
+ import { Eventual as e } from "@ankhzet/eventual";
2
+ //#region src/Disposable.ts
3
+ var t = Symbol.for("disposed"), n = class extends e {
4
+ _disposers;
5
+ dispose() {
6
+ let e = this._disposers;
7
+ if (this.dispatchEvent(t, this), e) {
8
+ this._disposers = void 0;
9
+ for (let t of e) t();
10
+ }
11
+ }
12
+ addDisposer(e) {
13
+ (this._disposers ||= []).push(e);
14
+ }
15
+ addControlledDisposer(e) {
16
+ return this.addDisposer(e), () => {
17
+ e &&= (this.removeDisposer(e), e(), void 0);
18
+ };
19
+ }
20
+ removeDisposer(e) {
21
+ if (!this._disposers) return;
22
+ let t = this._disposers.indexOf(e);
23
+ t >= 0 && this._disposers.splice(t, 1);
24
+ }
25
+ onDispose(e) {
26
+ return this.handleEvent(t, e, !0);
27
+ }
28
+ handleEvent(e, t, n) {
29
+ return this.addControlledDisposer(super.handleEvent(e, t, n));
30
+ }
31
+ }, r = class extends n {
32
+ parent;
33
+ constructor(e) {
34
+ super(), this.parent = e;
35
+ }
36
+ static isClass(e) {
37
+ return (t) => t.constructor === e;
38
+ }
39
+ }, i = Symbol.for("drive_component"), a = (e) => "isDriven" in e, o = class extends r {
40
+ _isDriven = !0;
41
+ get isDriven() {
42
+ return this._isDriven;
43
+ }
44
+ set isDriven(e) {
45
+ this._isDriven !== e && (this._isDriven = e, this.dispatchEvent(i, this));
46
+ }
47
+ onDrive(e) {
48
+ return this.handleEvent(i, e);
49
+ }
50
+ }, s = 1, c = class extends Map {
51
+ #e = 0;
52
+ get size() {
53
+ return this.#e;
54
+ }
55
+ set size(e) {
56
+ this.#e = e;
57
+ }
58
+ map(e) {
59
+ let t = this.size, n = Array(t);
60
+ if (!t) return n;
61
+ let r = 0;
62
+ for (let t of this.values()) for (let i of t) n[r++] = e(i);
63
+ return n;
64
+ }
65
+ contains(e) {
66
+ let t = this.get(e.type);
67
+ if (t?.has(e)) return t;
68
+ }
69
+ add(e) {
70
+ let t = this.get(e.type);
71
+ if (t) {
72
+ if (t.has(e)) return;
73
+ t.add(e);
74
+ } else this.set(e.type, new Set([e]));
75
+ this.size++;
76
+ }
77
+ remove(e) {
78
+ let t = this.contains(e);
79
+ return t ? (t.delete(e), this.size--, !0) : !1;
80
+ }
81
+ }, l = Symbol.for("E_COMPONENT"), u = (e) => !!(e.type & 1), d = class e extends o {
82
+ static GUID = 0;
83
+ static is = u;
84
+ uid = `${++e.GUID}`;
85
+ components;
86
+ disposers = /* @__PURE__ */ new Map();
87
+ driven;
88
+ componentsMap = /* @__PURE__ */ new WeakMap();
89
+ constructor(e, t) {
90
+ super(e), this.components = t?.length ? t.map((e) => e(this)).flat() : [], this.driven = [];
91
+ for (let e of this.components) this.registerComponent(e);
92
+ }
93
+ toString() {
94
+ return this.uid;
95
+ }
96
+ get type() {
97
+ return 1;
98
+ }
99
+ handleComponentDrive = (e) => {
100
+ let t = this.driven.indexOf(e);
101
+ e.isDriven ? t < 0 && this.driven.push(e) : t >= 0 && this.driven.splice(t, 1);
102
+ };
103
+ registerComponent(e) {
104
+ let t = () => e.dispose();
105
+ this.addDisposer(t);
106
+ let n = [() => this.removeDisposer(t)];
107
+ a(e) && (e.isDriven && this.driven.push(e), n.push(e.onDrive(this.handleComponentDrive), () => {
108
+ if (!e.isDriven) return;
109
+ let t = this.driven.indexOf(e);
110
+ t >= 0 && this.driven.splice(t, 1);
111
+ })), this.disposers.set(e, this.addControlledDisposer(() => {
112
+ for (let e of n) e();
113
+ }));
114
+ }
115
+ addComponent(e) {
116
+ this.components.includes(e) || (this.components.push(e), this.registerComponent(e), this.dispatchEvent(l, {
117
+ component: e,
118
+ added: !0
119
+ }));
120
+ }
121
+ removeComponent(e) {
122
+ let t = this.components.indexOf(e);
123
+ t >= 0 && (this.components.splice(t, 1), this.disposers.get(e)?.(), this.dispatchEvent(l, {
124
+ component: e,
125
+ added: !1
126
+ }));
127
+ }
128
+ findComponent(e) {
129
+ let t = this.componentsMap.get(e);
130
+ if (!t) {
131
+ let t = this.components.find(e);
132
+ return this.componentsMap.set(e, t), t;
133
+ }
134
+ return t;
135
+ }
136
+ findComponents(e) {
137
+ return this.components.filter(e);
138
+ }
139
+ onComponent(e) {
140
+ return this.handleEvent(l, e);
141
+ }
142
+ update(e) {
143
+ for (let t of this.driven) t.update(e);
144
+ }
145
+ }, f = Symbol.for("pool_entity"), p = class extends n {
146
+ #e = new d(null);
147
+ constructor() {
148
+ super(), this.addDisposer(() => {
149
+ this.#e.dispose();
150
+ });
151
+ }
152
+ get uid() {
153
+ return this.#e.uid;
154
+ }
155
+ get entities() {
156
+ return this.#e.components;
157
+ }
158
+ add(e) {
159
+ this.#e.addComponent(e), this.dispatchEvent(f, {
160
+ entity: e,
161
+ added: !0
162
+ });
163
+ }
164
+ remove(e) {
165
+ this.#e.removeComponent(e), this.dispatchEvent(f, {
166
+ entity: e,
167
+ added: !1
168
+ });
169
+ }
170
+ update(e) {
171
+ this.#e.update(e);
172
+ }
173
+ onEntity(e) {
174
+ return this.handleEvent(f, e);
175
+ }
176
+ }, m = (e, t) => function() {
177
+ let n = e.call(this);
178
+ return Object.defineProperty(this, t.name, {
179
+ enumerable: !t.private,
180
+ configurable: !0,
181
+ value: n
182
+ }), n;
183
+ }, h = Symbol("INIT"), g = (e) => (({ get: t, set: n }, r) => ({
184
+ init() {
185
+ return h;
186
+ },
187
+ get() {
188
+ let r = t.call(this);
189
+ return r === h && (r = e.call(this), n.call(this, r)), r;
190
+ },
191
+ set: n
192
+ })), _ = (e) => ((...t) => t.reduce((e, t) => t(e), e));
193
+ //#endregion
194
+ export { r as Component, n as DisposableEventSource, o as DynamicComponent, p as EntitiesPool, d as Entity, _ as Mixin, s as RefTypeEntity, c as ReferenceBuckets, a as isDynamicComponent, u as isEntityRef, m as lazy, g as lazyAccessor };
195
+
196
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["#size","#pool"],"sources":["../src/Disposable.ts","../src/Component.ts","../src/DynamicComponent.ts","../src/Reference.ts","../src/ReferenceBuckets.ts","../src/Entity.ts","../src/EntitiesPool.ts","../src/lazy.ts","../src/lazyAccessor.ts","../src/Mixin.ts"],"sourcesContent":["import type { IEventSource, EventName, IEventHandler} from '@ankhzet/eventual';\nimport { Eventual } from '@ankhzet/eventual';\n\n/** @public */\nexport type Disposer = () => void;\n\nconst E_DISPOSED = Symbol.for('disposed');\n\n/** @public */\nexport interface DisposableInterface extends IEventSource {\n dispose(): void;\n addDisposer(d: Disposer): void;\n addControlledDisposer(d: Disposer): Disposer;\n removeDisposer(d: Disposer): void;\n onDispose(handler: IEventHandler<this>): Disposer;\n}\n\n/** @public */\nexport class DisposableEventSource extends Eventual implements DisposableInterface {\n private _disposers?: Disposer[];\n\n public dispose(): void {\n const disposers = this._disposers;\n\n this.dispatchEvent(E_DISPOSED, this);\n\n if (disposers) {\n this._disposers = void 0;\n\n for (const disposer of disposers) {\n disposer();\n }\n }\n }\n\n public addDisposer(d: Disposer) {\n (this._disposers || (this._disposers = [])).push(d);\n }\n\n public addControlledDisposer(d: Disposer): Disposer {\n this.addDisposer(d);\n\n return () => {\n if (!d) {\n return;\n }\n\n this.removeDisposer(d);\n d();\n (d as any) = void 0;\n };\n }\n\n public removeDisposer(d: Disposer) {\n if (!this._disposers) {\n return;\n }\n\n const idx = this._disposers.indexOf(d);\n\n if (idx >= 0) {\n this._disposers.splice(idx, 1);\n }\n }\n\n public onDispose(handler: IEventHandler<this>) {\n return this.handleEvent(E_DISPOSED, handler, true);\n }\n\n /** @internal */\n public handleEvent<D, N extends EventName>(type: N, handler: IEventHandler<D>, once?: boolean): Disposer {\n return this.addControlledDisposer(super.handleEvent(type, handler, once));\n }\n}\n","import type { DisposableInterface } from './Disposable';\nimport { DisposableEventSource } from './Disposable';\n\n/** @public */\nexport interface GCInterface<P = any> extends DisposableInterface {\n parent: P;\n}\n\n/** @public */\nexport type ComponentConstructor<P, E> = {\n new(parent: P, factories: ComponentsFactory<E, any>[], ...args: any[]): E;\n};\n\n/** @public */\nexport interface ComponentsFactory<P, C extends GCInterface<P>> {\n (parent: P): C|C[];\n}\n\n/** @public */\nexport abstract class Component<P> extends DisposableEventSource implements GCInterface<P> {\n public parent: P;\n\n public constructor(parent: P) {\n super();\n this.parent = parent;\n }\n\n public static isClass<K extends { new (...args: any[]): any }>(klass: K) {\n return (instance: any): instance is InstanceType<K> => (instance as any).constructor === klass;\n }\n}\n","import type { IEventHandler } from '@ankhzet/eventual';\nimport type { Disposer } from './Disposable';\nimport type { GCInterface } from './Component';\nimport { Component } from './Component';\n\nconst E_DRIVE = Symbol.for('drive_component');\n\n/** @public */\nexport const isDynamicComponent = <C extends GCInterface>(c: C): c is (DGCInterface & C) => (\n 'isDriven' in c\n);\n\n/** @public */\nexport interface DGCInterface<P = any> extends GCInterface<P> {\n isDriven: boolean;\n update(delta: number): void;\n onDrive(handler: IEventHandler<this>): Disposer;\n}\n\n/** @public */\nexport abstract class DynamicComponent<P> extends Component<P> implements DGCInterface<P> {\n private _isDriven: boolean = true;\n\n public get isDriven(): boolean {\n return this._isDriven;\n }\n\n public set isDriven(value: boolean) {\n if (this._isDriven === value) {\n return;\n }\n\n this._isDriven = value;\n this.dispatchEvent(E_DRIVE, this);\n }\n\n public onDrive(handler: IEventHandler<this>): Disposer {\n return this.handleEvent(E_DRIVE, handler);\n }\n\n public abstract update(delta: number): void;\n}\n","/** @public */\nexport type ReferenceType = number;\n\n/** @public */\nexport type Reference<T = {}> = T & {\n readonly type: ReferenceType;\n}\n\n/** @public */\nexport const RefTypeEntity: ReferenceType = 1 << 0;\n","import type { Reference, ReferenceType } from './Reference';\n\n/** @public */\nexport class ReferenceBuckets<R extends Reference> extends Map<ReferenceType, Set<R>> {\n #size: number = 0;\n\n public get size(): number {\n return this.#size;\n }\n\n public set size(value: number) {\n this.#size = value;\n }\n\n public map<U>(mapper: (element: R) => U): U[] {\n const size = this.size;\n const result: U[] = Array(size);\n\n if (!size) {\n return result;\n }\n\n let idx = 0;\n\n for (const set of this.values()) {\n for (const element of set) {\n result[idx++] = mapper(element);\n }\n }\n\n return result;\n }\n\n public contains(reference: R): Set<R> | undefined {\n const bucket = this.get(reference.type);\n\n if (bucket?.has(reference)) {\n return bucket;\n }\n }\n\n public add(reference: R): void {\n const bucket = this.get(reference.type);\n\n if (bucket) {\n if (bucket.has(reference)) {\n return;\n }\n\n bucket.add(reference);\n } else {\n this.set(reference.type, new Set([reference]));\n }\n\n this.size++;\n }\n\n public remove(reference: R): boolean {\n const found = this.contains(reference);\n\n if (found) {\n found.delete(reference);\n this.size--;\n\n return true;\n }\n\n return false;\n }\n}\n","import type { IEventHandler } from '@ankhzet/eventual';\nimport type { ComponentsFactory, GCInterface } from './Component';\nimport type { EntityInterface } from './EntityInterface';\nimport type { Reference, ReferenceType} from './Reference';\nimport type { Disposer } from './Disposable';\nimport type { DGCInterface} from './DynamicComponent';\nimport { RefTypeEntity } from './Reference';\nimport { DynamicComponent, isDynamicComponent } from './DynamicComponent';\n\nconst E_COMPONENT = Symbol.for('E_COMPONENT');\n\n/** @public */\nexport const isEntityRef = (ref: Reference): ref is Reference<EntityInterface> => !!(\n ref.type & RefTypeEntity\n);\n\n/** @public */\nexport class Entity<P extends GCInterface|null = null>\n extends DynamicComponent<P>\n implements EntityInterface<P>, Reference<EntityInterface<P>>\n{\n private static GUID: number = 0;\n public static is = isEntityRef;\n\n public readonly uid: string = `${++Entity.GUID}`;\n public readonly components: GCInterface<this>[];\n protected readonly disposers = new Map<GCInterface<this>, Disposer>();\n protected readonly driven: DGCInterface<this>[];\n private readonly componentsMap = new WeakMap();\n\n public constructor(parent: P, factories?: ComponentsFactory<any, any>[]) {\n super(parent);\n this.components = factories?.length\n ? factories.map((factory) => factory(this)).flat()\n : []\n ;\n this.driven = [];\n\n for (const component of this.components) {\n this.registerComponent(component);\n }\n }\n\n public toString() {\n return this.uid;\n }\n\n public get type(): ReferenceType {\n return RefTypeEntity;\n }\n\n private handleComponentDrive = (component: DGCInterface) => {\n const has = this.driven.indexOf(component);\n\n if (component.isDriven) {\n if (has < 0) {\n this.driven.push(component);\n }\n } else if (has >= 0) {\n this.driven.splice(has, 1);\n }\n }\n\n private registerComponent(component: GCInterface) {\n const free = () => component.dispose();\n\n this.addDisposer(free);\n\n const disposers: Disposer[] = [() => this.removeDisposer(free)];\n\n if (isDynamicComponent(component)) {\n if (component.isDriven) {\n this.driven.push(component);\n }\n\n disposers.push(\n component.onDrive(this.handleComponentDrive),\n () => {\n if (!component.isDriven) {\n return;\n }\n\n const index = this.driven.indexOf(component);\n\n if (index >= 0) {\n this.driven.splice(index, 1);\n }\n },\n );\n }\n\n this.disposers.set(component, this.addControlledDisposer(() => {\n for (const disposer of disposers) {\n disposer();\n }\n }));\n }\n\n public addComponent(component: GCInterface): void {\n if (this.components.includes(component)) {\n return;\n }\n\n this.components.push(component);\n this.registerComponent(component);\n\n this.dispatchEvent(E_COMPONENT, { component, added: true });\n }\n\n public removeComponent(component: GCInterface): void {\n const index = this.components.indexOf(component);\n\n if (index >= 0) {\n this.components.splice(index, 1);\n this.disposers.get(component)?.();\n\n this.dispatchEvent(E_COMPONENT, { component, added: false });\n }\n }\n\n public findComponent<T extends GCInterface>(predicate: (c: any) => c is T): T|undefined {\n const has = this.componentsMap.get(predicate);\n\n if (!has) {\n const component = this.components.find(predicate);\n this.componentsMap.set(predicate, component);\n\n return component;\n }\n\n return has;\n }\n\n public findComponents<T extends GCInterface>(predicate: (c: any) => c is T): T[] {\n return this.components.filter(predicate);\n }\n\n public onComponent(handler: IEventHandler<{ component: GCInterface; added: boolean }>): Disposer {\n return this.handleEvent(E_COMPONENT, handler);\n }\n\n public update(delta: number) {\n for (const component of this.driven) {\n component.update(delta);\n }\n }\n}\n","import type { IEventHandler } from '@ankhzet/eventual';\nimport type { EntityInterface } from './EntityInterface';\nimport { Entity } from './Entity';\nimport { DisposableEventSource } from './Disposable';\n\nconst E_ENTITY = Symbol.for('pool_entity');\n\n/** @public */\nexport class EntitiesPool<E extends EntityInterface> extends DisposableEventSource {\n #pool = new Entity(null);\n\n public constructor() {\n super();\n\n this.addDisposer(() => {\n this.#pool.dispose();\n });\n }\n\n public get uid() {\n return this.#pool.uid;\n }\n\n public get entities(): Iterable<E> {\n return this.#pool.components as Iterable<E>;\n }\n\n public add(entity: E): void {\n this.#pool.addComponent(entity);\n\n this.dispatchEvent(E_ENTITY, {\n entity,\n added: true,\n });\n }\n\n public remove(entity: E): void {\n this.#pool.removeComponent(entity);\n\n this.dispatchEvent(E_ENTITY, {\n entity,\n added: false,\n });\n }\n\n public update(delta: number) {\n this.#pool.update(delta);\n }\n\n public onEntity(handler: IEventHandler<{ entity: E; added: boolean }>) {\n return this.handleEvent(E_ENTITY, handler);\n }\n}\n","/** @public */\nexport type Getter<This, Value> = (this: This) => Value;\n\n/** @public */\nexport const lazy = <This, Value>(\n target: Getter<This, Value>,\n context: ClassGetterDecoratorContext<This, Value>,\n): Getter<This, Value> => {\n return function (this: This): Value {\n const value = target.call(this);\n\n Object.defineProperty(this, context.name, {\n enumerable: !context.private,\n configurable: true,\n value,\n });\n\n return value;\n };\n};\n","import type { Getter } from './lazy';\n\nconst INIT = Symbol('INIT');\n\n/** @public */\nexport const lazyAccessor = <This, Value>(init: Getter<This, Value>) => (\n (\n { get, set }: ClassAccessorDecoratorTarget<This, Value>,\n _context: ClassAccessorDecoratorContext<This, Value>,\n ): ClassAccessorDecoratorResult<This, Value> => ({\n init(): Value {\n return INIT as Value;\n },\n get(this: This): Value {\n let value = get.call(this);\n\n if (value === INIT) {\n value = init.call(this);\n\n set.call(this, value);\n }\n\n return value;\n },\n set,\n })\n);\n","/** @public */\nexport type Class<\n T extends NonNullable<unknown> = any,\n Args extends unknown[] = any[],\n IsAbstract = false\n> = IsAbstract extends true ? abstract new(...args: Args) => T : new(...args: Args) => T;\n\n/** @public */\nexport type Mix<Base extends Class<any, any, any>, Mixin extends Class<any, any>> = {\n [k in keyof Base | keyof Mixin]: (\n k extends keyof Mixin\n ? Mixin[k]\n : k extends keyof Base\n ? Base[k]\n : never\n );\n} & (new(...args: ConstructorParameters<Mixin>) => InstanceType<Base> & InstanceType<Mixin>);\n\n/** @public */\nexport type Mixed<Head extends Class, Tail extends Class[]> = [Head, ...Tail];\n\n/** @public */\nexport type Chain<In extends Class<any, any, any>, Rest extends any[]> = (\n Rest extends Mixed<infer Head, infer Tail>\n ? Chain<Mix<In, Head>, Tail>\n : In\n);\n\n/** @public */\nexport type MixFactory = (base: Class<any, any>) => Class<any, any>;\n\n/** @public */\nexport type Returns<Mixins extends any[]> = (\n Mixins extends [infer Last, ...infer Rest]\n ? Last extends MixFactory\n ? [ReturnType<Last>, ...Returns<Rest>]\n : []\n : []\n );\n\n/** @public */\nexport const Mixin = <Base extends Class<any, any, true>>(base: Base) => (\n <Mixins extends MixFactory[]>(...mixins: Mixins): Chain<Base, Returns<Mixins>> => {\n return mixins.reduce((acc: Class<any, any>, mixin: MixFactory) => mixin(acc), base as any) as any;\n }\n);\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ankhzet/gcl",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "author": "AnkhZet ankhzet@gmail.com",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
@@ -9,7 +9,7 @@
9
9
  "package.json",
10
10
  "src/**/*.ts",
11
11
  "src/**/*.tsx",
12
- "build",
12
+ "dist",
13
13
  "*.md"
14
14
  ],
15
15
  "exports": {
@@ -22,7 +22,7 @@
22
22
  "access": "public"
23
23
  },
24
24
  "dependencies": {
25
- "@ankhzet/eventual": "1.1.0"
25
+ "@ankhzet/eventual": "1.2.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@microsoft/api-extractor": "^7.58.7"