diff --git a/.changeset/early-olives-lay.md b/.changeset/early-olives-lay.md new file mode 100644 index 00000000000..49f968773ae --- /dev/null +++ b/.changeset/early-olives-lay.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +Support `this` argument for `Micro.gen` diff --git a/packages/effect/src/Micro.ts b/packages/effect/src/Micro.ts index d118588c61e..6186c3ce5b7 100644 --- a/packages/effect/src/Micro.ts +++ b/packages/effect/src/Micro.ts @@ -1243,15 +1243,17 @@ 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) { - const iterator = f() as Iterator>, AEff, any> + const iterator: Generator = args.length === 1 ? args[0]() : args[1].call(args[0]) let running = false let value: any = undefined function run() { diff --git a/packages/effect/test/Micro.test.ts b/packages/effect/test/Micro.test.ts index aaf9e17c90b..f9a37e99fa2 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", () =>