From c261e661261e6c49428af5627224b4c744c9860a Mon Sep 17 00:00:00 2001 From: "maksim.khramtsov" Date: Mon, 24 Jun 2024 11:18:18 +0200 Subject: [PATCH] Support `this` argument for `Micro.gen` --- .changeset/early-olives-lay.md | 5 +++++ packages/effect/src/Micro.ts | 12 ++++++++++-- packages/effect/test/Micro.test.ts | 21 +++++++++++++++------ 3 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 .changeset/early-olives-lay.md diff --git a/.changeset/early-olives-lay.md b/.changeset/early-olives-lay.md new file mode 100644 index 0000000000..dc14b090d7 --- /dev/null +++ b/.changeset/early-olives-lay.md @@ -0,0 +1,5 @@ +--- +"effect": minor +--- + +Support `this` argument for `Micro.gen` diff --git a/packages/effect/src/Micro.ts b/packages/effect/src/Micro.ts index 7d5be32bb0..2bd7a94b83 100644 --- a/packages/effect/src/Micro.ts +++ b/packages/effect/src/Micro.ts @@ -1223,14 +1223,22 @@ export const never: Micro = async(function() { * @experimental * @category constructors */ -export const gen = >, AEff>( - f: () => Generator +export const gen = >, AEff>( + ...args: + | [self: Self, body: (this: Self) => Generator] + | [body: () => Generator] ): Micro< AEff, [Eff] extends [never] ? never : [Eff] extends [YieldWrap>] ? E : never, [Eff] extends [never] ? never : [Eff] extends [YieldWrap>] ? R : never > => make(function(env, onResult) { + let f: () => Generator + if (args.length === 1) { + f = args[0] + } else { + f = args[1].bind(args[0]) + } const iterator = f() as Iterator>, AEff, any> let running = false let value: any = undefined diff --git a/packages/effect/test/Micro.test.ts b/packages/effect/test/Micro.test.ts index aaf9e17c90..f9a37e99fa 100644 --- a/packages/effect/test/Micro.test.ts +++ b/packages/effect/test/Micro.test.ts @@ -106,12 +106,21 @@ describe.concurrent("Micro", () => { Micro.runPromise )) - it("gen", () => - Micro.gen(function*() { - const result = yield* Micro.succeed(1) - assert.strictEqual(result, 1) - return result - }).pipe(Micro.runPromise).then((_) => assert.deepStrictEqual(_, 1))) + describe("gen", () => { + it("gen", () => + Micro.gen(function*() { + const result = yield* Micro.succeed(1) + assert.strictEqual(result, 1) + return result + }).pipe(Micro.runPromise).then((_) => assert.deepStrictEqual(_, 1))) + + it("gen with context", () => + Micro.gen({ a: 1, b: 2 }, function*() { + const result = yield* Micro.succeed(this.a) + assert.strictEqual(result, 1) + return result + this.b + }).pipe(Micro.runPromise).then((_) => assert.deepStrictEqual(_, 3))) + }) describe("forEach", () => { it("sequential", () =>