better-effect 0.2.0 → 0.3.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.
@@ -1,10 +1,9 @@
1
- import { r as LayerProvider, s as AnyServiceToken, t as LayerBackend } from "./backend-CNAls62W.mjs";
1
+ import { U as AnyServiceToken, b as LayerProvider, r as LayerBackend } from "./index-Bg6ofRE1.mjs";
2
2
  //#region src/testing/memory-layer-backend.d.ts
3
3
  declare class MemoryLayerBackend implements LayerBackend {
4
4
  private readonly providers;
5
5
  private readonly instances;
6
6
  private readonly pending;
7
- private readonly resolutionOrder;
8
7
  register(provider: LayerProvider): void;
9
8
  resolve<T extends AnyServiceToken>(token: T): Promise<InstanceType<T>>;
10
9
  disposeAll(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing/memory-layer-backend.ts"],"mappings":";;cAIa,8BAA8B;mBACxB;mBAEA;mBAEA;mBAEA;EAEjB,SAAS,UAAU;EAQb,QAAQ,UAAU,iBAAiB,OAAO,IAAI,QAAQ,aAAa;EAkCnE,cAAc"}
1
+ {"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing/memory-layer-backend.ts"],"mappings":";;cAIa,8BAA8B;mBACxB;mBAEA;mBAEA;EAEjB,SAAS,UAAU;EAQb,QAAQ,UAAU,iBAAiB,OAAO,IAAI,QAAQ,aAAa;EAgCnE,cAAc"}
package/dist/testing.mjs CHANGED
@@ -4,7 +4,6 @@ var MemoryLayerBackend = class {
4
4
  providers = /* @__PURE__ */ new Map();
5
5
  instances = /* @__PURE__ */ new Map();
6
6
  pending = /* @__PURE__ */ new Map();
7
- resolutionOrder = [];
8
7
  register(provider) {
9
8
  if (this.providers.has(provider.service)) throw new DuplicateServiceError(provider.service);
10
9
  this.providers.set(provider.service, provider);
@@ -17,7 +16,6 @@ var MemoryLayerBackend = class {
17
16
  if (!provider) throw new ServiceNotFoundError(token);
18
17
  const acquisition = Promise.resolve(provider.acquire()).then((instance) => {
19
18
  this.instances.set(token, instance);
20
- this.resolutionOrder.push(token);
21
19
  return instance;
22
20
  }).finally(() => {
23
21
  this.pending.delete(token);
@@ -27,23 +25,9 @@ var MemoryLayerBackend = class {
27
25
  }
28
26
  async disposeAll() {
29
27
  if (this.pending.size > 0) await Promise.allSettled(this.pending.values());
30
- const errors = [];
31
- for (let index = this.resolutionOrder.length - 1; index >= 0; index--) {
32
- const token = this.resolutionOrder[index];
33
- if (!token) continue;
34
- const instance = this.instances.get(token);
35
- const provider = this.providers.get(token);
36
- if (instance === void 0 || !provider?.release) continue;
37
- try {
38
- await provider.release(instance);
39
- } catch (cause) {
40
- errors.push(cause);
41
- }
42
- }
43
28
  this.instances.clear();
44
29
  this.pending.clear();
45
- this.resolutionOrder.splice(0);
46
- if (errors.length > 0) throw new AggregateError(errors, "Failed to dispose one or more services");
30
+ this.providers.clear();
47
31
  }
48
32
  };
49
33
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"testing.mjs","names":[],"sources":["../src/testing/memory-layer-backend.ts"],"sourcesContent":["import { DuplicateServiceError, type LayerBackend, type LayerProvider } from '../layer'\n\nimport { ServiceNotFoundError, type AnyServiceToken } from '../service'\n\nexport class MemoryLayerBackend implements LayerBackend {\n private readonly providers = new Map<AnyServiceToken, LayerProvider>()\n\n private readonly instances = new Map<AnyServiceToken, unknown>()\n\n private readonly pending = new Map<AnyServiceToken, Promise<unknown>>()\n\n private readonly resolutionOrder: AnyServiceToken[] = []\n\n register(provider: LayerProvider): void {\n if (this.providers.has(provider.service)) {\n throw new DuplicateServiceError(provider.service)\n }\n\n this.providers.set(provider.service, provider)\n }\n\n async resolve<T extends AnyServiceToken>(token: T): Promise<InstanceType<T>> {\n if (this.instances.has(token)) {\n return this.instances.get(token) as InstanceType<T>\n }\n\n const pending = this.pending.get(token)\n\n if (pending) {\n return (await pending) as InstanceType<T>\n }\n\n const provider = this.providers.get(token)\n\n if (!provider) {\n throw new ServiceNotFoundError(token)\n }\n\n const acquisition = Promise.resolve(provider.acquire())\n .then((instance) => {\n this.instances.set(token, instance)\n\n this.resolutionOrder.push(token)\n\n return instance\n })\n .finally(() => {\n this.pending.delete(token)\n })\n\n this.pending.set(token, acquisition)\n\n return (await acquisition) as InstanceType<T>\n }\n\n async disposeAll(): Promise<void> {\n if (this.pending.size > 0) {\n await Promise.allSettled(this.pending.values())\n }\n\n const errors: unknown[] = []\n\n for (let index = this.resolutionOrder.length - 1; index >= 0; index--) {\n const token = this.resolutionOrder[index]\n\n if (!token) {\n continue\n }\n\n const instance = this.instances.get(token)\n\n const provider = this.providers.get(token)\n\n if (instance === undefined || !provider?.release) {\n continue\n }\n\n try {\n await provider.release(instance)\n } catch (cause) {\n errors.push(cause)\n }\n }\n\n this.instances.clear()\n this.pending.clear()\n\n this.resolutionOrder.splice(0)\n\n if (errors.length > 0) {\n throw new AggregateError(errors, 'Failed to dispose one or more services')\n }\n }\n}\n"],"mappings":";;AAIA,IAAa,qBAAb,MAAwD;CACtD,4BAA6B,IAAI,IAAoC;CAErE,4BAA6B,IAAI,IAA8B;CAE/D,0BAA2B,IAAI,IAAuC;CAEtE,kBAAsD,CAAC;CAEvD,SAAS,UAA+B;EACtC,IAAI,KAAK,UAAU,IAAI,SAAS,OAAO,GACrC,MAAM,IAAI,sBAAsB,SAAS,OAAO;EAGlD,KAAK,UAAU,IAAI,SAAS,SAAS,QAAQ;CAC/C;CAEA,MAAM,QAAmC,OAAoC;EAC3E,IAAI,KAAK,UAAU,IAAI,KAAK,GAC1B,OAAO,KAAK,UAAU,IAAI,KAAK;EAGjC,MAAM,UAAU,KAAK,QAAQ,IAAI,KAAK;EAEtC,IAAI,SACF,OAAQ,MAAM;EAGhB,MAAM,WAAW,KAAK,UAAU,IAAI,KAAK;EAEzC,IAAI,CAAC,UACH,MAAM,IAAI,qBAAqB,KAAK;EAGtC,MAAM,cAAc,QAAQ,QAAQ,SAAS,QAAQ,CAAC,CAAC,CACpD,MAAM,aAAa;GAClB,KAAK,UAAU,IAAI,OAAO,QAAQ;GAElC,KAAK,gBAAgB,KAAK,KAAK;GAE/B,OAAO;EACT,CAAC,CAAC,CACD,cAAc;GACb,KAAK,QAAQ,OAAO,KAAK;EAC3B,CAAC;EAEH,KAAK,QAAQ,IAAI,OAAO,WAAW;EAEnC,OAAQ,MAAM;CAChB;CAEA,MAAM,aAA4B;EAChC,IAAI,KAAK,QAAQ,OAAO,GACtB,MAAM,QAAQ,WAAW,KAAK,QAAQ,OAAO,CAAC;EAGhD,MAAM,SAAoB,CAAC;EAE3B,KAAK,IAAI,QAAQ,KAAK,gBAAgB,SAAS,GAAG,SAAS,GAAG,SAAS;GACrE,MAAM,QAAQ,KAAK,gBAAgB;GAEnC,IAAI,CAAC,OACH;GAGF,MAAM,WAAW,KAAK,UAAU,IAAI,KAAK;GAEzC,MAAM,WAAW,KAAK,UAAU,IAAI,KAAK;GAEzC,IAAI,aAAa,KAAA,KAAa,CAAC,UAAU,SACvC;GAGF,IAAI;IACF,MAAM,SAAS,QAAQ,QAAQ;GACjC,SAAS,OAAO;IACd,OAAO,KAAK,KAAK;GACnB;EACF;EAEA,KAAK,UAAU,MAAM;EACrB,KAAK,QAAQ,MAAM;EAEnB,KAAK,gBAAgB,OAAO,CAAC;EAE7B,IAAI,OAAO,SAAS,GAClB,MAAM,IAAI,eAAe,QAAQ,wCAAwC;CAE7E;AACF"}
1
+ {"version":3,"file":"testing.mjs","names":[],"sources":["../src/testing/memory-layer-backend.ts"],"sourcesContent":["import { DuplicateServiceError, type LayerBackend, type LayerProvider } from '../layer'\n\nimport { ServiceNotFoundError, type AnyServiceToken } from '../service'\n\nexport class MemoryLayerBackend implements LayerBackend {\n private readonly providers = new Map<AnyServiceToken, LayerProvider>()\n\n private readonly instances = new Map<AnyServiceToken, unknown>()\n\n private readonly pending = new Map<AnyServiceToken, Promise<unknown>>()\n\n register(provider: LayerProvider): void {\n if (this.providers.has(provider.service)) {\n throw new DuplicateServiceError(provider.service)\n }\n\n this.providers.set(provider.service, provider)\n }\n\n async resolve<T extends AnyServiceToken>(token: T): Promise<InstanceType<T>> {\n if (this.instances.has(token)) {\n return this.instances.get(token) as InstanceType<T>\n }\n\n const pending = this.pending.get(token)\n\n if (pending) {\n return (await pending) as InstanceType<T>\n }\n\n const provider = this.providers.get(token)\n\n if (!provider) {\n throw new ServiceNotFoundError(token)\n }\n\n const acquisition = Promise.resolve(provider.acquire())\n .then((instance) => {\n this.instances.set(token, instance)\n\n return instance\n })\n .finally(() => {\n this.pending.delete(token)\n })\n\n this.pending.set(token, acquisition)\n\n return (await acquisition) as InstanceType<T>\n }\n\n async disposeAll(): Promise<void> {\n if (this.pending.size > 0) {\n await Promise.allSettled(this.pending.values())\n }\n\n this.instances.clear()\n this.pending.clear()\n this.providers.clear()\n }\n}\n"],"mappings":";;AAIA,IAAa,qBAAb,MAAwD;CACtD,4BAA6B,IAAI,IAAoC;CAErE,4BAA6B,IAAI,IAA8B;CAE/D,0BAA2B,IAAI,IAAuC;CAEtE,SAAS,UAA+B;EACtC,IAAI,KAAK,UAAU,IAAI,SAAS,OAAO,GACrC,MAAM,IAAI,sBAAsB,SAAS,OAAO;EAGlD,KAAK,UAAU,IAAI,SAAS,SAAS,QAAQ;CAC/C;CAEA,MAAM,QAAmC,OAAoC;EAC3E,IAAI,KAAK,UAAU,IAAI,KAAK,GAC1B,OAAO,KAAK,UAAU,IAAI,KAAK;EAGjC,MAAM,UAAU,KAAK,QAAQ,IAAI,KAAK;EAEtC,IAAI,SACF,OAAQ,MAAM;EAGhB,MAAM,WAAW,KAAK,UAAU,IAAI,KAAK;EAEzC,IAAI,CAAC,UACH,MAAM,IAAI,qBAAqB,KAAK;EAGtC,MAAM,cAAc,QAAQ,QAAQ,SAAS,QAAQ,CAAC,CAAC,CACpD,MAAM,aAAa;GAClB,KAAK,UAAU,IAAI,OAAO,QAAQ;GAElC,OAAO;EACT,CAAC,CAAC,CACD,cAAc;GACb,KAAK,QAAQ,OAAO,KAAK;EAC3B,CAAC;EAEH,KAAK,QAAQ,IAAI,OAAO,WAAW;EAEnC,OAAQ,MAAM;CAChB;CAEA,MAAM,aAA4B;EAChC,IAAI,KAAK,QAAQ,OAAO,GACtB,MAAM,QAAQ,WAAW,KAAK,QAAQ,OAAO,CAAC;EAGhD,KAAK,UAAU,MAAM;EACrB,KAAK,QAAQ,MAAM;EACnB,KAAK,UAAU,MAAM;CACvB;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "better-effect",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Lightweight Effect-inspired primitives for better-result",
5
5
  "keywords": [
6
6
  "better-result",
@@ -1,39 +0,0 @@
1
- //#region src/service/types.d.ts
2
- type ServiceToken<A = unknown> = (abstract new (...args: any[]) => A) & {
3
- readonly name: string;
4
- };
5
- type AnyServiceToken = ServiceToken<any>;
6
- type ServiceClass<A = unknown> = (new (...args: any[]) => A) & {
7
- readonly name: string;
8
- };
9
- type ServiceInstance<T extends AnyServiceToken> = InstanceType<T>;
10
- //#endregion
11
- //#region src/service/runtime.d.ts
12
- interface ServiceResolver {
13
- resolve<T extends AnyServiceToken>(token: T): InstanceType<T> | PromiseLike<InstanceType<T>>;
14
- }
15
- declare class ServiceRuntime {
16
- static run<A>(resolver: ServiceResolver, program: () => A): A;
17
- static current(): ServiceResolver;
18
- static resolve<T extends AnyServiceToken>(token: T): Promise<InstanceType<T>>;
19
- }
20
- //#endregion
21
- //#region src/utils/types.d.ts
22
- type MaybePromise<T> = T | PromiseLike<T>;
23
- //#endregion
24
- //#region src/layer/types.d.ts
25
- interface LayerProvider {
26
- readonly service: ServiceClass<any>;
27
- readonly acquire: () => MaybePromise<unknown>;
28
- readonly release?: (instance: unknown) => MaybePromise<void>;
29
- }
30
- type LayerGenerator<S extends ServiceClass<any>> = () => AsyncGenerator<never, InstanceType<S>, unknown>;
31
- //#endregion
32
- //#region src/layer/backend.d.ts
33
- interface LayerBackend extends ServiceResolver {
34
- register(provider: LayerProvider): void | PromiseLike<void>;
35
- disposeAll(): void | PromiseLike<void>;
36
- }
37
- //#endregion
38
- export { ServiceResolver as a, ServiceClass as c, MaybePromise as i, ServiceInstance as l, LayerGenerator as n, ServiceRuntime as o, LayerProvider as r, AnyServiceToken as s, LayerBackend as t, ServiceToken as u };
39
- //# sourceMappingURL=backend-CNAls62W.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"backend-CNAls62W.d.mts","names":[],"sources":["../src/service/types.ts","../src/service/runtime.ts","../src/utils/types.ts","../src/layer/types.ts","../src/layer/backend.ts"],"mappings":";KAAY,aAAa,iCAAiC,gBAAgB;WAC/D;;KAGC,kBAAkB;KAElB,aAAa,wBAAwB,gBAAgB;WACtD;;KAGC,gBAAgB,UAAU,mBAAmB,aAAa;;;UCJrD;EACf,QAAQ,UAAU,iBAAiB,OAAO,IAAI,aAAa,KAAK,YAAY,aAAa;;cAK9E;SACJ,IAAI,GAAG,UAAU,iBAAiB,eAAe,IAAI;SAIrD,WAAW;SAUL,QAAQ,UAAU,iBAAiB,OAAO,IAAI,QAAQ,aAAa;;;;KC3BtE,aAAa,KAAK,IAAI,YAAY;;;UCG7B;WACN,SAAS;WAET,eAAe;WAEf,WAAW,sBAAsB;;KAGhC,eAAe,UAAU,2BAA2B,sBAE9D,aAAa;;;UCTE,qBAAqB;EACpC,SAAS,UAAU,uBAAuB;EAC1C,qBAAqB"}