Skip to content

Commit b2b17d6

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 04e1a4e commit b2b17d6

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
@@ -13567,7 +13567,8 @@ export namespace fn {
1356713567
AEff,
1356813568
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1356913569
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13570-
>
13570+
>,
13571+
...args: Args
1357113572
) => A
1357213573
): (...args: Args) => A
1357313574
<Eff extends YieldWrap<Effect<any, any, any>>, AEff, Args extends Array<any>, A, B extends Effect<any, any, any>>(
@@ -13577,9 +13578,10 @@ export namespace fn {
1357713578
AEff,
1357813579
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1357913580
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13580-
>
13581+
>,
13582+
...args: Args
1358113583
) => A,
13582-
b: (_: A) => B
13584+
b: (_: A, ...args: Args) => B
1358313585
): (...args: Args) => B
1358413586
<
1358513587
Eff extends YieldWrap<Effect<any, any, any>>,
@@ -13595,10 +13597,11 @@ export namespace fn {
1359513597
AEff,
1359613598
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1359713599
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13598-
>
13600+
>,
13601+
...args: Args
1359913602
) => A,
13600-
b: (_: A) => B,
13601-
c: (_: B) => C
13603+
b: (_: A, ...args: Args) => B,
13604+
c: (_: B, ...args: Args) => C
1360213605
): (...args: Args) => C
1360313606
<
1360413607
Eff extends YieldWrap<Effect<any, any, any>>,
@@ -13615,11 +13618,12 @@ export namespace fn {
1361513618
AEff,
1361613619
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1361713620
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13618-
>
13621+
>,
13622+
...args: Args
1361913623
) => A,
13620-
b: (_: A) => B,
13621-
c: (_: B) => C,
13622-
d: (_: C) => D
13624+
b: (_: A, ...args: Args) => B,
13625+
c: (_: B, ...args: Args) => C,
13626+
d: (_: C, ...args: Args) => D
1362313627
): (...args: Args) => D
1362413628
<
1362513629
Eff extends YieldWrap<Effect<any, any, any>>,
@@ -13637,12 +13641,13 @@ export namespace fn {
1363713641
AEff,
1363813642
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1363913643
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13640-
>
13644+
>,
13645+
...args: Args
1364113646
) => A,
13642-
b: (_: A) => B,
13643-
c: (_: B) => C,
13644-
d: (_: C) => D,
13645-
e: (_: D) => E
13647+
b: (_: A, ...args: Args) => B,
13648+
c: (_: B, ...args: Args) => C,
13649+
d: (_: C, ...args: Args) => D,
13650+
e: (_: D, ...args: Args) => E
1364613651
): (...args: Args) => E
1364713652
<
1364813653
Eff extends YieldWrap<Effect<any, any, any>>,
@@ -13661,13 +13666,14 @@ export namespace fn {
1366113666
AEff,
1366213667
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1366313668
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13664-
>
13669+
>,
13670+
...args: Args
1366513671
) => A,
13666-
b: (_: A) => B,
13667-
c: (_: B) => C,
13668-
d: (_: C) => D,
13669-
e: (_: D) => E,
13670-
f: (_: E) => F
13672+
b: (_: A, ...args: Args) => B,
13673+
c: (_: B, ...args: Args) => C,
13674+
d: (_: C, ...args: Args) => D,
13675+
e: (_: D, ...args: Args) => E,
13676+
f: (_: E, ...args: Args) => F
1367113677
): (...args: Args) => F
1367213678
<
1367313679
Eff extends YieldWrap<Effect<any, any, any>>,
@@ -13687,14 +13693,15 @@ export namespace fn {
1368713693
AEff,
1368813694
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1368913695
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13690-
>
13696+
>,
13697+
...args: Args
1369113698
) => A,
13692-
b: (_: A) => B,
13693-
c: (_: B) => C,
13694-
d: (_: C) => D,
13695-
e: (_: D) => E,
13696-
f: (_: E) => F,
13697-
g: (_: F) => G
13699+
b: (_: A, ...args: Args) => B,
13700+
c: (_: B, ...args: Args) => C,
13701+
d: (_: C, ...args: Args) => D,
13702+
e: (_: D, ...args: Args) => E,
13703+
f: (_: E, ...args: Args) => F,
13704+
g: (_: F, ...args: Args) => G
1369813705
): (...args: Args) => G
1369913706
<
1370013707
Eff extends YieldWrap<Effect<any, any, any>>,
@@ -13715,15 +13722,16 @@ export namespace fn {
1371513722
AEff,
1371613723
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1371713724
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13718-
>
13725+
>,
13726+
...args: Args
1371913727
) => A,
13720-
b: (_: A) => B,
13721-
c: (_: B) => C,
13722-
d: (_: C) => D,
13723-
e: (_: D) => E,
13724-
f: (_: E) => F,
13725-
g: (_: F) => G,
13726-
h: (_: G) => H
13728+
b: (_: A, ...args: Args) => B,
13729+
c: (_: B, ...args: Args) => C,
13730+
d: (_: C, ...args: Args) => D,
13731+
e: (_: D, ...args: Args) => E,
13732+
f: (_: E, ...args: Args) => F,
13733+
g: (_: F, ...args: Args) => G,
13734+
h: (_: G, ...args: Args) => H
1372713735
): (...args: Args) => H
1372813736
<
1372913737
Eff extends YieldWrap<Effect<any, any, any>>,
@@ -13745,16 +13753,17 @@ export namespace fn {
1374513753
AEff,
1374613754
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer E, infer _R>>] ? E : never,
1374713755
[Eff] extends [never] ? never : [Eff] extends [YieldWrap<Effect<infer _A, infer _E, infer R>>] ? R : never
13748-
>
13756+
>,
13757+
...args: Args
1374913758
) => A,
13750-
b: (_: A) => B,
13751-
c: (_: B) => C,
13752-
d: (_: C) => D,
13753-
e: (_: D) => E,
13754-
f: (_: E) => F,
13755-
g: (_: F) => G,
13756-
h: (_: G) => H,
13757-
i: (_: H) => I
13759+
b: (_: A, ...args: Args) => B,
13760+
c: (_: B, ...args: Args) => C,
13761+
d: (_: C, ...args: Args) => D,
13762+
e: (_: D, ...args: Args) => E,
13763+
f: (_: E, ...args: Args) => F,
13764+
g: (_: F, ...args: Args) => G,
13765+
h: (_: G, ...args: Args) => H,
13766+
i: (_: H, ...args: Args) => I
1375813767
): (...args: Args) => I
1375913768
}
1376013769

@@ -13768,75 +13777,75 @@ export namespace fn {
1376813777
): (...args: Args) => Eff
1376913778
<Eff extends Effect<any, any, any>, A, Args extends Array<any>>(
1377013779
body: (...args: Args) => A,
13771-
a: (_: A) => Eff
13780+
a: (_: A, ...args: Args) => Eff
1377213781
): (...args: Args) => Eff
1377313782
<Eff extends Effect<any, any, any>, A, B, Args extends Array<any>>(
1377413783
body: (...args: Args) => A,
13775-
a: (_: A) => B,
13776-
b: (_: B) => Eff
13784+
a: (_: A, ...args: Args) => B,
13785+
b: (_: B, ...args: Args) => Eff
1377713786
): (...args: Args) => Eff
1377813787
<Eff extends Effect<any, any, any>, A, B, C, Args extends Array<any>>(
1377913788
body: (...args: Args) => A,
13780-
a: (_: A) => B,
13781-
b: (_: B) => C,
13782-
c: (_: C) => Eff
13789+
a: (_: A, ...args: Args) => B,
13790+
b: (_: B, ...args: Args) => C,
13791+
c: (_: C, ...args: Args) => Eff
1378313792
): (...args: Args) => Eff
1378413793
<Eff extends Effect<any, any, any>, A, B, C, D, Args extends Array<any>>(
1378513794
body: (...args: Args) => A,
13786-
a: (_: A) => B,
13787-
b: (_: B) => C,
13788-
c: (_: C) => D,
13789-
d: (_: D) => Eff
13795+
a: (_: A, ...args: Args) => B,
13796+
b: (_: B, ...args: Args) => C,
13797+
c: (_: C, ...args: Args) => D,
13798+
d: (_: D, ...args: Args) => Eff
1379013799
): (...args: Args) => Eff
1379113800
<Eff extends Effect<any, any, any>, A, B, C, D, E, Args extends Array<any>>(
1379213801
body: (...args: Args) => A,
13793-
a: (_: A) => B,
13794-
b: (_: B) => C,
13795-
c: (_: C) => D,
13796-
d: (_: D) => E,
13797-
e: (_: E) => Eff
13802+
a: (_: A, ...args: Args) => B,
13803+
b: (_: B, ...args: Args) => C,
13804+
c: (_: C, ...args: Args) => D,
13805+
d: (_: D, ...args: Args) => E,
13806+
e: (_: E, ...args: Args) => Eff
1379813807
): (...args: Args) => Eff
1379913808
<Eff extends Effect<any, any, any>, A, B, C, D, E, F, Args extends Array<any>>(
1380013809
body: (...args: Args) => A,
13801-
a: (_: A) => B,
13802-
b: (_: B) => C,
13803-
c: (_: C) => D,
13804-
d: (_: D) => E,
13805-
e: (_: E) => F,
13806-
f: (_: E) => Eff
13810+
a: (_: A, ...args: Args) => B,
13811+
b: (_: B, ...args: Args) => C,
13812+
c: (_: C, ...args: Args) => D,
13813+
d: (_: D, ...args: Args) => E,
13814+
e: (_: E, ...args: Args) => F,
13815+
f: (_: F, ...args: Args) => Eff
1380713816
): (...args: Args) => Eff
1380813817
<Eff extends Effect<any, any, any>, A, B, C, D, E, F, G, Args extends Array<any>>(
1380913818
body: (...args: Args) => A,
13810-
a: (_: A) => B,
13811-
b: (_: B) => C,
13812-
c: (_: C) => D,
13813-
d: (_: D) => E,
13814-
e: (_: E) => F,
13815-
f: (_: E) => G,
13816-
g: (_: G) => Eff
13819+
a: (_: A, ...args: Args) => B,
13820+
b: (_: B, ...args: Args) => C,
13821+
c: (_: C, ...args: Args) => D,
13822+
d: (_: D, ...args: Args) => E,
13823+
e: (_: E, ...args: Args) => F,
13824+
f: (_: F, ...args: Args) => G,
13825+
g: (_: G, ...args: Args) => Eff
1381713826
): (...args: Args) => Eff
1381813827
<Eff extends Effect<any, any, any>, A, B, C, D, E, F, G, H, Args extends Array<any>>(
1381913828
body: (...args: Args) => A,
13820-
a: (_: A) => B,
13821-
b: (_: B) => C,
13822-
c: (_: C) => D,
13823-
d: (_: D) => E,
13824-
e: (_: E) => F,
13825-
f: (_: E) => G,
13826-
g: (_: G) => H,
13827-
h: (_: H) => Eff
13829+
a: (_: A, ...args: Args) => B,
13830+
b: (_: B, ...args: Args) => C,
13831+
c: (_: C, ...args: Args) => D,
13832+
d: (_: D, ...args: Args) => E,
13833+
e: (_: E, ...args: Args) => F,
13834+
f: (_: F, ...args: Args) => G,
13835+
g: (_: G, ...args: Args) => H,
13836+
h: (_: H, ...args: Args) => Eff
1382813837
): (...args: Args) => Eff
1382913838
<Eff extends Effect<any, any, any>, A, B, C, D, E, F, G, H, I, Args extends Array<any>>(
1383013839
body: (...args: Args) => A,
13831-
a: (_: A) => B,
13832-
b: (_: B) => C,
13833-
c: (_: C) => D,
13834-
d: (_: D) => E,
13835-
e: (_: E) => F,
13836-
f: (_: E) => G,
13837-
g: (_: G) => H,
13838-
h: (_: H) => I,
13839-
i: (_: H) => Eff
13840+
a: (_: A, ...args: Args) => B,
13841+
b: (_: B, ...args: Args) => C,
13842+
c: (_: C, ...args: Args) => D,
13843+
d: (_: D, ...args: Args) => E,
13844+
e: (_: E, ...args: Args) => F,
13845+
f: (_: F, ...args: Args) => G,
13846+
g: (_: G, ...args: Args) => H,
13847+
h: (_: H, ...args: Args) => I,
13848+
i: (_: H, ...args: Args) => Eff
1384013849
): (...args: Args) => Eff
1384113850
}
1384213851
}
@@ -13994,7 +14003,7 @@ function fnApply(options: {
1399414003
if (options.pipeables.length > 0) {
1399514004
try {
1399614005
for (const x of options.pipeables) {
13997-
effect = x(effect)
14006+
effect = x(effect, ...options.args)
1399814007
}
1399914008
} catch (error) {
1400014009
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)