Skip to content

Commit fdc729c

Browse files
tim-smartmikearnaldi
authored andcommitted
allow accessing args in Effect.fn pipe (#4417)
Co-authored-by: Michael Arnaldi <michael.arnaldi@effectful.co>
1 parent f16b5fd commit fdc729c

File tree

4 files changed

+120
-93
lines changed

4 files changed

+120
-93
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"effect": minor
3+
---
4+
5+
allow accessing args in Effect.fn pipe

packages/effect/src/Effect.ts

Lines changed: 100 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -13560,7 +13560,8 @@ export namespace fn {
1356013560
AEff,
1356113561
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1356213562
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13563-
>
13563+
>,
13564+
...args: Args
1356413565
) => A
1356513566
): (...args: Args) => A
1356613567
<Eff extends YieldWrap<Effect<any, any, any>>, AEff, Args extends Array<any>, A, B extends Effect<any, any, any>>(
@@ -13570,9 +13571,10 @@ export namespace fn {
1357013571
AEff,
1357113572
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1357213573
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13573-
>
13574+
>,
13575+
...args: Args
1357413576
) => A,
13575-
b: (_: A) => B
13577+
b: (_: A, ...args: Args) => B
1357613578
): (...args: Args) => B
1357713579
<
1357813580
Eff extends YieldWrap<Effect<any, any, any>>,
@@ -13588,10 +13590,11 @@ export namespace fn {
1358813590
AEff,
1358913591
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1359013592
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13591-
>
13593+
>,
13594+
...args: Args
1359213595
) => A,
13593-
b: (_: A) => B,
13594-
c: (_: B) => C
13596+
b: (_: A, ...args: Args) => B,
13597+
c: (_: B, ...args: Args) => C
1359513598
): (...args: Args) => C
1359613599
<
1359713600
Eff extends YieldWrap<Effect<any, any, any>>,
@@ -13608,11 +13611,12 @@ export namespace fn {
1360813611
AEff,
1360913612
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1361013613
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13611-
>
13614+
>,
13615+
...args: Args
1361213616
) => A,
13613-
b: (_: A) => B,
13614-
c: (_: B) => C,
13615-
d: (_: C) => D
13617+
b: (_: A, ...args: Args) => B,
13618+
c: (_: B, ...args: Args) => C,
13619+
d: (_: C, ...args: Args) => D
1361613620
): (...args: Args) => D
1361713621
<
1361813622
Eff extends YieldWrap<Effect<any, any, any>>,
@@ -13630,12 +13634,13 @@ export namespace fn {
1363013634
AEff,
1363113635
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1363213636
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13633-
>
13637+
>,
13638+
...args: Args
1363413639
) => A,
13635-
b: (_: A) => B,
13636-
c: (_: B) => C,
13637-
d: (_: C) => D,
13638-
e: (_: D) => E
13640+
b: (_: A, ...args: Args) => B,
13641+
c: (_: B, ...args: Args) => C,
13642+
d: (_: C, ...args: Args) => D,
13643+
e: (_: D, ...args: Args) => E
1363913644
): (...args: Args) => E
1364013645
<
1364113646
Eff extends YieldWrap<Effect<any, any, any>>,
@@ -13654,13 +13659,14 @@ export namespace fn {
1365413659
AEff,
1365513660
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1365613661
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13657-
>
13662+
>,
13663+
...args: Args
1365813664
) => A,
13659-
b: (_: A) => B,
13660-
c: (_: B) => C,
13661-
d: (_: C) => D,
13662-
e: (_: D) => E,
13663-
f: (_: E) => F
13665+
b: (_: A, ...args: Args) => B,
13666+
c: (_: B, ...args: Args) => C,
13667+
d: (_: C, ...args: Args) => D,
13668+
e: (_: D, ...args: Args) => E,
13669+
f: (_: E, ...args: Args) => F
1366413670
): (...args: Args) => F
1366513671
<
1366613672
Eff extends YieldWrap<Effect<any, any, any>>,
@@ -13680,14 +13686,15 @@ export namespace fn {
1368013686
AEff,
1368113687
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1368213688
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13683-
>
13689+
>,
13690+
...args: Args
1368413691
) => A,
13685-
b: (_: A) => B,
13686-
c: (_: B) => C,
13687-
d: (_: C) => D,
13688-
e: (_: D) => E,
13689-
f: (_: E) => F,
13690-
g: (_: F) => G
13692+
b: (_: A, ...args: Args) => B,
13693+
c: (_: B, ...args: Args) => C,
13694+
d: (_: C, ...args: Args) => D,
13695+
e: (_: D, ...args: Args) => E,
13696+
f: (_: E, ...args: Args) => F,
13697+
g: (_: F, ...args: Args) => G
1369113698
): (...args: Args) => G
1369213699
<
1369313700
Eff extends YieldWrap<Effect<any, any, any>>,
@@ -13708,15 +13715,16 @@ export namespace fn {
1370813715
AEff,
1370913716
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1371013717
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13711-
>
13718+
>,
13719+
...args: Args
1371213720
) => A,
13713-
b: (_: A) => B,
13714-
c: (_: B) => C,
13715-
d: (_: C) => D,
13716-
e: (_: D) => E,
13717-
f: (_: E) => F,
13718-
g: (_: F) => G,
13719-
h: (_: G) => H
13721+
b: (_: A, ...args: Args) => B,
13722+
c: (_: B, ...args: Args) => C,
13723+
d: (_: C, ...args: Args) => D,
13724+
e: (_: D, ...args: Args) => E,
13725+
f: (_: E, ...args: Args) => F,
13726+
g: (_: F, ...args: Args) => G,
13727+
h: (_: G, ...args: Args) => H
1372013728
): (...args: Args) => H
1372113729
<
1372213730
Eff extends YieldWrap<Effect<any, any, any>>,
@@ -13738,16 +13746,17 @@ export namespace fn {
1373813746
AEff,
1373913747
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1374013748
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13741-
>
13749+
>,
13750+
...args: Args
1374213751
) => A,
13743-
b: (_: A) => B,
13744-
c: (_: B) => C,
13745-
d: (_: C) => D,
13746-
e: (_: D) => E,
13747-
f: (_: E) => F,
13748-
g: (_: F) => G,
13749-
h: (_: G) => H,
13750-
i: (_: H) => I
13752+
b: (_: A, ...args: Args) => B,
13753+
c: (_: B, ...args: Args) => C,
13754+
d: (_: C, ...args: Args) => D,
13755+
e: (_: D, ...args: Args) => E,
13756+
f: (_: E, ...args: Args) => F,
13757+
g: (_: F, ...args: Args) => G,
13758+
h: (_: G, ...args: Args) => H,
13759+
i: (_: H, ...args: Args) => I
1375113760
): (...args: Args) => I
1375213761
}
1375313762

@@ -13761,75 +13770,75 @@ export namespace fn {
1376113770
): (...args: Args) => Eff
1376213771
<Eff extends Effect<any, any, any>, A, Args extends Array<any>>(
1376313772
body: (...args: Args) => A,
13764-
a: (_: A) => Eff
13773+
a: (_: A, ...args: Args) => Eff
1376513774
): (...args: Args) => Eff
1376613775
<Eff extends Effect<any, any, any>, A, B, Args extends Array<any>>(
1376713776
body: (...args: Args) => A,
13768-
a: (_: A) => B,
13769-
b: (_: B) => Eff
13777+
a: (_: A, ...args: Args) => B,
13778+
b: (_: B, ...args: Args) => Eff
1377013779
): (...args: Args) => Eff
1377113780
<Eff extends Effect<any, any, any>, A, B, C, Args extends Array<any>>(
1377213781
body: (...args: Args) => A,
13773-
a: (_: A) => B,
13774-
b: (_: B) => C,
13775-
c: (_: C) => Eff
13782+
a: (_: A, ...args: Args) => B,
13783+
b: (_: B, ...args: Args) => C,
13784+
c: (_: C, ...args: Args) => Eff
1377613785
): (...args: Args) => Eff
1377713786
<Eff extends Effect<any, any, any>, A, B, C, D, Args extends Array<any>>(
1377813787
body: (...args: Args) => A,
13779-
a: (_: A) => B,
13780-
b: (_: B) => C,
13781-
c: (_: C) => D,
13782-
d: (_: D) => Eff
13788+
a: (_: A, ...args: Args) => B,
13789+
b: (_: B, ...args: Args) => C,
13790+
c: (_: C, ...args: Args) => D,
13791+
d: (_: D, ...args: Args) => Eff
1378313792
): (...args: Args) => Eff
1378413793
<Eff extends Effect<any, any, any>, A, B, C, D, E, Args extends Array<any>>(
1378513794
body: (...args: Args) => A,
13786-
a: (_: A) => B,
13787-
b: (_: B) => C,
13788-
c: (_: C) => D,
13789-
d: (_: D) => E,
13790-
e: (_: E) => Eff
13795+
a: (_: A, ...args: Args) => B,
13796+
b: (_: B, ...args: Args) => C,
13797+
c: (_: C, ...args: Args) => D,
13798+
d: (_: D, ...args: Args) => E,
13799+
e: (_: E, ...args: Args) => Eff
1379113800
): (...args: Args) => Eff
1379213801
<Eff extends Effect<any, any, any>, A, B, C, D, E, F, Args extends Array<any>>(
1379313802
body: (...args: Args) => A,
13794-
a: (_: A) => B,
13795-
b: (_: B) => C,
13796-
c: (_: C) => D,
13797-
d: (_: D) => E,
13798-
e: (_: E) => F,
13799-
f: (_: E) => Eff
13803+
a: (_: A, ...args: Args) => B,
13804+
b: (_: B, ...args: Args) => C,
13805+
c: (_: C, ...args: Args) => D,
13806+
d: (_: D, ...args: Args) => E,
13807+
e: (_: E, ...args: Args) => F,
13808+
f: (_: F, ...args: Args) => Eff
1380013809
): (...args: Args) => Eff
1380113810
<Eff extends Effect<any, any, any>, A, B, C, D, E, F, G, Args extends Array<any>>(
1380213811
body: (...args: Args) => A,
13803-
a: (_: A) => B,
13804-
b: (_: B) => C,
13805-
c: (_: C) => D,
13806-
d: (_: D) => E,
13807-
e: (_: E) => F,
13808-
f: (_: E) => G,
13809-
g: (_: G) => Eff
13812+
a: (_: A, ...args: Args) => B,
13813+
b: (_: B, ...args: Args) => C,
13814+
c: (_: C, ...args: Args) => D,
13815+
d: (_: D, ...args: Args) => E,
13816+
e: (_: E, ...args: Args) => F,
13817+
f: (_: F, ...args: Args) => G,
13818+
g: (_: G, ...args: Args) => Eff
1381013819
): (...args: Args) => Eff
1381113820
<Eff extends Effect<any, any, any>, A, B, C, D, E, F, G, H, Args extends Array<any>>(
1381213821
body: (...args: Args) => A,
13813-
a: (_: A) => B,
13814-
b: (_: B) => C,
13815-
c: (_: C) => D,
13816-
d: (_: D) => E,
13817-
e: (_: E) => F,
13818-
f: (_: E) => G,
13819-
g: (_: G) => H,
13820-
h: (_: H) => Eff
13822+
a: (_: A, ...args: Args) => B,
13823+
b: (_: B, ...args: Args) => C,
13824+
c: (_: C, ...args: Args) => D,
13825+
d: (_: D, ...args: Args) => E,
13826+
e: (_: E, ...args: Args) => F,
13827+
f: (_: F, ...args: Args) => G,
13828+
g: (_: G, ...args: Args) => H,
13829+
h: (_: H, ...args: Args) => Eff
1382113830
): (...args: Args) => Eff
1382213831
<Eff extends Effect<any, any, any>, A, B, C, D, E, F, G, H, I, Args extends Array<any>>(
1382313832
body: (...args: Args) => A,
13824-
a: (_: A) => B,
13825-
b: (_: B) => C,
13826-
c: (_: C) => D,
13827-
d: (_: D) => E,
13828-
e: (_: E) => F,
13829-
f: (_: E) => G,
13830-
g: (_: G) => H,
13831-
h: (_: H) => I,
13832-
i: (_: H) => Eff
13833+
a: (_: A, ...args: Args) => B,
13834+
b: (_: B, ...args: Args) => C,
13835+
c: (_: C, ...args: Args) => D,
13836+
d: (_: D, ...args: Args) => E,
13837+
e: (_: E, ...args: Args) => F,
13838+
f: (_: F, ...args: Args) => G,
13839+
g: (_: G, ...args: Args) => H,
13840+
h: (_: H, ...args: Args) => I,
13841+
i: (_: H, ...args: Args) => Eff
1383313842
): (...args: Args) => Eff
1383413843
}
1383513844
}
@@ -13987,7 +13996,7 @@ function fnApply(options: {
1398713996
if (options.pipeables.length > 0) {
1398813997
try {
1398913998
for (const x of options.pipeables) {
13990-
effect = x(effect)
13999+
effect = x(effect, ...options.args)
1399114000
}
1399214001
} catch (error) {
1399314002
effect = fnError

packages/effect/src/internal/core.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1430,7 +1430,7 @@ export const fnUntraced: Effect.fn.Gen = (body: Function, ...pipeables: Array<an
14301430
: function(this: any, ...args: Array<any>) {
14311431
let effect = fromIterator(() => body.apply(this, args))
14321432
for (const x of pipeables) {
1433-
effect = x(effect)
1433+
effect = x(effect, ...args)
14341434
}
14351435
return effect
14361436
}

packages/effect/test/Effect/fn.test.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describe, it } from "@effect/vitest"
22
import { Cause, Effect } from "effect"
3-
import { assertInstanceOf, assertTrue, strictEqual } from "effect/test/util"
3+
import { assertEquals, assertInstanceOf, assertTrue, strictEqual } from "effect/test/util"
44

55
describe("Effect.fn", () => {
66
it.effect("catches defects in the function", () =>
@@ -64,4 +64,17 @@ describe("Effect.fn", () => {
6464
assertInstanceOf(cause.right.defect, Error)
6565
strictEqual(cause.right.defect.message, "test2")
6666
}))
67+
68+
it.effect("can access args in single pipe", () =>
69+
Effect.gen(function*() {
70+
const fn = Effect.fn("test")(
71+
function*(n: number) {
72+
return n
73+
},
74+
(effect, n) => Effect.map(effect, (a) => a + n),
75+
(effect, n) => Effect.map(effect, (a) => a + n)
76+
)
77+
const n = yield* fn(1)
78+
assertEquals(n, 3)
79+
}))
6780
})

0 commit comments

Comments
 (0)