From 823f527e3d4c78de565fa397f6d72a38cf260eb2 Mon Sep 17 00:00:00 2001 From: Roger Qiu Date: Fri, 22 Apr 2022 18:18:37 +1000 Subject: [PATCH 1/2] Parameterising resource acquisitions --- src/types.ts | 8 ++++---- src/utils.ts | 4 ++-- tests/index.test.ts | 35 ++++++++++++++++++++++++++++++++++- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/types.ts b/src/types.ts index 072181d..0ae8482 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,10 +1,10 @@ -type ResourceAcquire = () => Promise< - readonly [ResourceRelease, Resource?] ->; +type ResourceAcquire = ( + resources: readonly any[], +) => Promise; type ResourceRelease = (e?: Error) => Promise; -type Resources[]> = { +type Resources[]> = { [K in keyof T]: T[K] extends ResourceAcquire ? R : never; }; diff --git a/src/utils.ts b/src/utils.ts index 738854e..7472419 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -17,7 +17,7 @@ async function withF< let e_: Error | undefined; try { for (const acquire of acquires) { - const [release, resource] = await acquire(); + const [release, resource] = await acquire(resources); releases.push(release); resources.push(resource); } @@ -54,7 +54,7 @@ async function* withG< let e_: Error | undefined; try { for (const acquire of acquires) { - const [release, resource] = await acquire(); + const [release, resource] = await acquire(resources); releases.push(release); resources.push(resource); } diff --git a/tests/index.test.ts b/tests/index.test.ts index e30bf8e..123672f 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -82,7 +82,7 @@ describe('index', () => { // Multiple resources outside requires type declaration const resourceAcquires6: [ ResourceAcquire, - ResourceAcquire, + ResourceAcquire, ResourceAcquire, ] = [ async () => { @@ -246,4 +246,37 @@ describe('index', () => { expect(acquireOrder).toStrictEqual([lock1, lock2]); expect(releaseOrder).toStrictEqual([lock2, lock1]); }); + test('withF parameterised resources', async () => { + await withF( + [ + async () => [async () => {}, 1], + async ([a]) => [async () => {}, a + 1], + async ([, b]) => [async () => {}, b + 1], + ], + async ([a, b, c]) => { + expect(a).toBe(1); + expect(b).toBe(2); + expect(c).toBe(3); + }, + ); + }); + test('withG parameterised resources', async () => { + const g = withG( + [ + async () => [async () => {}, 1], + async ([a]) => [async () => {}, a + 1], + async ([, b]) => [async () => {}, b + 1], + ], + async function* ([a, b, c]): AsyncGenerator { + yield a; + yield b; + yield c; + }, + ); + let counter = 1; + for await (const r of g) { + expect(r).toBe(counter); + counter++; + } + }); }); From 1895e9130cd52d96579db35086606faebc889c13 Mon Sep 17 00:00:00 2001 From: Roger Qiu Date: Fri, 22 Apr 2022 19:57:23 +1000 Subject: [PATCH 2/2] Updated docs --- docs/modules.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules.html b/docs/modules.html index 03aee26..3705e41 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1,4 +1,4 @@ -@matrixai/resources
Options
All
  • Public
  • Public/Protected
  • All
Menu

@matrixai/resources

Index

Type aliases

ResourceAcquire<Resource>: () => Promise<readonly [ResourceRelease, Resource?]>

Type parameters

  • Resource = void

Type declaration

ResourceRelease: (e?: Error) => Promise<void>

Type declaration

    • (e?: Error): Promise<void>
    • Parameters

      • Optional e: Error

      Returns Promise<void>

Resources<T>: { [ K in keyof T]: T[K] extends ResourceAcquire<infer R> ? R : never }

Type parameters

Functions

  • withF<ResourceAcquires, T>(acquires: ResourceAcquires, f: (resources: Resources<ResourceAcquires>) => Promise<T>): Promise<T>
  • +@matrixai/resources
    Options
    All
    • Public
    • Public/Protected
    • All
    Menu

    @matrixai/resources

    Index

    Type aliases

    ResourceAcquire<Resource>: (resources: readonly any[]) => Promise<readonly [ResourceRelease, Resource?]>

    Type parameters

    • Resource

    Type declaration

      • (resources: readonly any[]): Promise<readonly [ResourceRelease, Resource?]>
      • Parameters

        • resources: readonly any[]

        Returns Promise<readonly [ResourceRelease, Resource?]>

    ResourceRelease: (e?: Error) => Promise<void>

    Type declaration

      • (e?: Error): Promise<void>
      • Parameters

        • Optional e: Error

        Returns Promise<void>

    Resources<T>: { [ K in keyof T]: T[K] extends ResourceAcquire<infer R> ? R : never }

    Type parameters

    Functions

    • withF<ResourceAcquires, T>(acquires: ResourceAcquires, f: (resources: Resources<ResourceAcquires>) => Promise<T>): Promise<T>
    • Make sure to explicitly declare or cast acquires as a tuple using [ResourceAcquire...] or as const

      Type parameters

      Parameters

      • acquires: ResourceAcquires
      • f: (resources: Resources<ResourceAcquires>) => Promise<T>
          • (resources: Resources<ResourceAcquires>): Promise<T>
          • Parameters

            Returns Promise<T>

      Returns Promise<T>

    • withG<ResourceAcquires, T, TReturn, TNext>(acquires: ResourceAcquires, g: (resources: Resources<ResourceAcquires>) => AsyncGenerator<T, TReturn, TNext>): AsyncGenerator<T, TReturn, TNext>
    • Make sure to explicitly declare or cast acquires as a tuple using [ResourceAcquire...] or as const