Skip to content

Commit

Permalink
allow accessing args in Effect.fn pipe (#4417)
Browse files Browse the repository at this point in the history
Co-authored-by: Michael Arnaldi <[email protected]>
  • Loading branch information
2 people authored and effect-bot committed Feb 11, 2025
1 parent 04e1a4e commit b2b17d6
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 93 deletions.
5 changes: 5 additions & 0 deletions .changeset/mighty-turtles-battle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"effect": minor
---

allow accessing args in Effect.fn pipe
191 changes: 100 additions & 91 deletions packages/effect/src/Effect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13567,7 +13567,8 @@ export namespace fn {
AEff,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
>
>,
...args: Args
) => A
): (...args: Args) => A
<Eff extends YieldWrap<Effect<any, any, any>>, AEff, Args extends Array<any>, A, B extends Effect<any, any, any>>(
Expand All @@ -13577,9 +13578,10 @@ export namespace fn {
AEff,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
>
>,
...args: Args
) => A,
b: (_: A) => B
b: (_: A, ...args: Args) => B
): (...args: Args) => B
<
Eff extends YieldWrap<Effect<any, any, any>>,
Expand All @@ -13595,10 +13597,11 @@ export namespace fn {
AEff,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
>
>,
...args: Args
) => A,
b: (_: A) => B,
c: (_: B) => C
b: (_: A, ...args: Args) => B,
c: (_: B, ...args: Args) => C
): (...args: Args) => C
<
Eff extends YieldWrap<Effect<any, any, any>>,
Expand All @@ -13615,11 +13618,12 @@ export namespace fn {
AEff,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
>
>,
...args: Args
) => A,
b: (_: A) => B,
c: (_: B) => C,
d: (_: C) => D
b: (_: A, ...args: Args) => B,
c: (_: B, ...args: Args) => C,
d: (_: C, ...args: Args) => D
): (...args: Args) => D
<
Eff extends YieldWrap<Effect<any, any, any>>,
Expand All @@ -13637,12 +13641,13 @@ export namespace fn {
AEff,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
>
>,
...args: Args
) => A,
b: (_: A) => B,
c: (_: B) => C,
d: (_: C) => D,
e: (_: D) => E
b: (_: A, ...args: Args) => B,
c: (_: B, ...args: Args) => C,
d: (_: C, ...args: Args) => D,
e: (_: D, ...args: Args) => E
): (...args: Args) => E
<
Eff extends YieldWrap<Effect<any, any, any>>,
Expand All @@ -13661,13 +13666,14 @@ export namespace fn {
AEff,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
>
>,
...args: Args
) => A,
b: (_: A) => B,
c: (_: B) => C,
d: (_: C) => D,
e: (_: D) => E,
f: (_: E) => F
b: (_: A, ...args: Args) => B,
c: (_: B, ...args: Args) => C,
d: (_: C, ...args: Args) => D,
e: (_: D, ...args: Args) => E,
f: (_: E, ...args: Args) => F
): (...args: Args) => F
<
Eff extends YieldWrap<Effect<any, any, any>>,
Expand All @@ -13687,14 +13693,15 @@ export namespace fn {
AEff,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
>
>,
...args: Args
) => A,
b: (_: A) => B,
c: (_: B) => C,
d: (_: C) => D,
e: (_: D) => E,
f: (_: E) => F,
g: (_: F) => G
b: (_: A, ...args: Args) => B,
c: (_: B, ...args: Args) => C,
d: (_: C, ...args: Args) => D,
e: (_: D, ...args: Args) => E,
f: (_: E, ...args: Args) => F,
g: (_: F, ...args: Args) => G
): (...args: Args) => G
<
Eff extends YieldWrap<Effect<any, any, any>>,
Expand All @@ -13715,15 +13722,16 @@ export namespace fn {
AEff,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
>
>,
...args: Args
) => A,
b: (_: A) => B,
c: (_: B) => C,
d: (_: C) => D,
e: (_: D) => E,
f: (_: E) => F,
g: (_: F) => G,
h: (_: G) => H
b: (_: A, ...args: Args) => B,
c: (_: B, ...args: Args) => C,
d: (_: C, ...args: Args) => D,
e: (_: D, ...args: Args) => E,
f: (_: E, ...args: Args) => F,
g: (_: F, ...args: Args) => G,
h: (_: G, ...args: Args) => H
): (...args: Args) => H
<
Eff extends YieldWrap<Effect<any, any, any>>,
Expand All @@ -13745,16 +13753,17 @@ export namespace fn {
AEff,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
>
>,
...args: Args
) => A,
b: (_: A) => B,
c: (_: B) => C,
d: (_: C) => D,
e: (_: D) => E,
f: (_: E) => F,
g: (_: F) => G,
h: (_: G) => H,
i: (_: H) => I
b: (_: A, ...args: Args) => B,
c: (_: B, ...args: Args) => C,
d: (_: C, ...args: Args) => D,
e: (_: D, ...args: Args) => E,
f: (_: E, ...args: Args) => F,
g: (_: F, ...args: Args) => G,
h: (_: G, ...args: Args) => H,
i: (_: H, ...args: Args) => I
): (...args: Args) => I
}

Expand All @@ -13768,75 +13777,75 @@ export namespace fn {
): (...args: Args) => Eff
<Eff extends Effect<any, any, any>, A, Args extends Array<any>>(
body: (...args: Args) => A,
a: (_: A) => Eff
a: (_: A, ...args: Args) => Eff
): (...args: Args) => Eff
<Eff extends Effect<any, any, any>, A, B, Args extends Array<any>>(
body: (...args: Args) => A,
a: (_: A) => B,
b: (_: B) => Eff
a: (_: A, ...args: Args) => B,
b: (_: B, ...args: Args) => Eff
): (...args: Args) => Eff
<Eff extends Effect<any, any, any>, A, B, C, Args extends Array<any>>(
body: (...args: Args) => A,
a: (_: A) => B,
b: (_: B) => C,
c: (_: C) => Eff
a: (_: A, ...args: Args) => B,
b: (_: B, ...args: Args) => C,
c: (_: C, ...args: Args) => Eff
): (...args: Args) => Eff
<Eff extends Effect<any, any, any>, A, B, C, D, Args extends Array<any>>(
body: (...args: Args) => A,
a: (_: A) => B,
b: (_: B) => C,
c: (_: C) => D,
d: (_: D) => Eff
a: (_: A, ...args: Args) => B,
b: (_: B, ...args: Args) => C,
c: (_: C, ...args: Args) => D,
d: (_: D, ...args: Args) => Eff
): (...args: Args) => Eff
<Eff extends Effect<any, any, any>, A, B, C, D, E, Args extends Array<any>>(
body: (...args: Args) => A,
a: (_: A) => B,
b: (_: B) => C,
c: (_: C) => D,
d: (_: D) => E,
e: (_: E) => Eff
a: (_: A, ...args: Args) => B,
b: (_: B, ...args: Args) => C,
c: (_: C, ...args: Args) => D,
d: (_: D, ...args: Args) => E,
e: (_: E, ...args: Args) => Eff
): (...args: Args) => Eff
<Eff extends Effect<any, any, any>, A, B, C, D, E, F, Args extends Array<any>>(
body: (...args: Args) => A,
a: (_: A) => B,
b: (_: B) => C,
c: (_: C) => D,
d: (_: D) => E,
e: (_: E) => F,
f: (_: E) => Eff
a: (_: A, ...args: Args) => B,
b: (_: B, ...args: Args) => C,
c: (_: C, ...args: Args) => D,
d: (_: D, ...args: Args) => E,
e: (_: E, ...args: Args) => F,
f: (_: F, ...args: Args) => Eff
): (...args: Args) => Eff
<Eff extends Effect<any, any, any>, A, B, C, D, E, F, G, Args extends Array<any>>(
body: (...args: Args) => A,
a: (_: A) => B,
b: (_: B) => C,
c: (_: C) => D,
d: (_: D) => E,
e: (_: E) => F,
f: (_: E) => G,
g: (_: G) => Eff
a: (_: A, ...args: Args) => B,
b: (_: B, ...args: Args) => C,
c: (_: C, ...args: Args) => D,
d: (_: D, ...args: Args) => E,
e: (_: E, ...args: Args) => F,
f: (_: F, ...args: Args) => G,
g: (_: G, ...args: Args) => Eff
): (...args: Args) => Eff
<Eff extends Effect<any, any, any>, A, B, C, D, E, F, G, H, Args extends Array<any>>(
body: (...args: Args) => A,
a: (_: A) => B,
b: (_: B) => C,
c: (_: C) => D,
d: (_: D) => E,
e: (_: E) => F,
f: (_: E) => G,
g: (_: G) => H,
h: (_: H) => Eff
a: (_: A, ...args: Args) => B,
b: (_: B, ...args: Args) => C,
c: (_: C, ...args: Args) => D,
d: (_: D, ...args: Args) => E,
e: (_: E, ...args: Args) => F,
f: (_: F, ...args: Args) => G,
g: (_: G, ...args: Args) => H,
h: (_: H, ...args: Args) => Eff
): (...args: Args) => Eff
<Eff extends Effect<any, any, any>, A, B, C, D, E, F, G, H, I, Args extends Array<any>>(
body: (...args: Args) => A,
a: (_: A) => B,
b: (_: B) => C,
c: (_: C) => D,
d: (_: D) => E,
e: (_: E) => F,
f: (_: E) => G,
g: (_: G) => H,
h: (_: H) => I,
i: (_: H) => Eff
a: (_: A, ...args: Args) => B,
b: (_: B, ...args: Args) => C,
c: (_: C, ...args: Args) => D,
d: (_: D, ...args: Args) => E,
e: (_: E, ...args: Args) => F,
f: (_: F, ...args: Args) => G,
g: (_: G, ...args: Args) => H,
h: (_: H, ...args: Args) => I,
i: (_: H, ...args: Args) => Eff
): (...args: Args) => Eff
}
}
Expand Down Expand Up @@ -13994,7 +14003,7 @@ function fnApply(options: {
if (options.pipeables.length > 0) {
try {
for (const x of options.pipeables) {
effect = x(effect)
effect = x(effect, ...options.args)
}
} catch (error) {
effect = fnError
Expand Down
2 changes: 1 addition & 1 deletion packages/effect/src/internal/core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1430,7 +1430,7 @@ export const fnUntraced: Effect.fn.Gen = (body: Function, ...pipeables: Array<an
: function(this: any, ...args: Array<any>) {
let effect = fromIterator(() => body.apply(this, args))
for (const x of pipeables) {
effect = x(effect)
effect = x(effect, ...args)
}
return effect
}
Expand Down
15 changes: 14 additions & 1 deletion packages/effect/test/Effect/fn.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { describe, it } from "@effect/vitest"
import { Cause, Effect } from "effect"
import { assertInstanceOf, assertTrue, strictEqual } from "effect/test/util"
import { assertEquals, assertInstanceOf, assertTrue, strictEqual } from "effect/test/util"

describe("Effect.fn", () => {
it.effect("catches defects in the function", () =>
Expand Down Expand Up @@ -64,4 +64,17 @@ describe("Effect.fn", () => {
assertInstanceOf(cause.right.defect, Error)
strictEqual(cause.right.defect.message, "test2")
}))

it.effect("can access args in single pipe", () =>
Effect.gen(function*() {
const fn = Effect.fn("test")(
function*(n: number) {
return n
},
(effect, n) => Effect.map(effect, (a) => a + n),
(effect, n) => Effect.map(effect, (a) => a + n)
)
const n = yield* fn(1)
assertEquals(n, 3)
}))
})

0 comments on commit b2b17d6

Please sign in to comment.