1import { assert, describe, it } from "@effect/vitest"
2import { Cause, Exit, Result } from "effect"
3import * as Pull from "effect/Pull"
4
5describe("Pull", () => {
6 describe("filterDone", () => {
7 it("succeeds when the done signal is the only failure", () => {
8 const result = Pull.filterDone(Cause.fail(Cause.Done("leftover")))
9 assert.deepStrictEqual(result, Result.succeed(Cause.Done("leftover")))
10 })
11
12 it("strips the done signal when merged with other failures", () => {
13 const cause = Cause.combine(Cause.fail(Cause.Done("leftover")), Cause.die("boom"))
14 const result = Pull.filterDone(cause)
15 assert.deepStrictEqual(result, Result.fail(Cause.die("boom")))
16 })
17
18 it("fails with the original cause when no done signal is present", () => {
19 const cause = Cause.fail("error")
20 assert.deepStrictEqual(Pull.filterDone(cause), Result.fail(cause))
21 })
22
23 it("succeeds when the done signal is merged only with interruptions", () => {
24 const cause = Cause.combine(Cause.interrupt(1), Cause.fail(Cause.Done("leftover")))
25 assert.deepStrictEqual(Pull.filterDone(cause), Result.succeed(Cause.Done("leftover")))
26 })
27 })
28
29 describe("doneExitFromCause", () => {
30 it("treats a pure done cause as success", () => {
31 const exit = Pull.doneExitFromCause(Cause.fail(Cause.Done("leftover")))
32 assert.deepStrictEqual(exit, Exit.succeed("leftover"))
33 })
34
35 it("fails with the stripped cause when the done signal was merged with a failure", () => {
36 const cause = Cause.combine(Cause.fail(Cause.Done("leftover")), Cause.die("boom"))
37 assert.deepStrictEqual(Pull.doneExitFromCause(cause), Exit.failCause(Cause.die("boom")))
38 })
39 })
40})