1import { assert, describe, it } from "@effect/vitest"
2import { Deferred, Effect, Fiber, Stream } from "effect"
3import { Template } from "effect/http"
4import { TestClock } from "effect/testing"
5
6describe("Template", () => {
7 it.effect("preserves template segment order", () =>
8 Effect.gen(function*() {
9 const fiber = yield* Stream.runCollect(
10 Template.stream`a${Effect.delay(Effect.succeed("slow"), "1 second")}b${"fast"}c`
11 ).pipe(Effect.forkChild)
12 yield* Effect.yieldNow
13 yield* TestClock.adjust("1 second")
14 const chunks = yield* Fiber.join(fiber)
15 assert.strictEqual(chunks.join(""), "aslowbfastc")
16 }))
17
18 it.effect("evaluates effect interpolations concurrently", () =>
19 Effect.gen(function*() {
20 const firstStarted = yield* Deferred.make<void>()
21 const secondStarted = yield* Deferred.make<void>()
22 const releaseFirst = yield* Deferred.make<void>()
23 const fiber = yield* Template.stream`${
24 Deferred.succeed(firstStarted, void 0).pipe(
25 Effect.andThen(Deferred.await(releaseFirst)),
26 Effect.as("first")
27 )
28 }${Deferred.succeed(secondStarted, void 0).pipe(Effect.as("second"))}`.pipe(
29 Stream.runCollect,
30 Effect.forkChild
31 )
32 yield* Deferred.await(firstStarted)
33 yield* Effect.yieldNow
34 assert.isTrue(yield* Deferred.isDone(secondStarted))
35 yield* Deferred.succeed(releaseFirst, void 0)
36 assert.deepStrictEqual(yield* Fiber.join(fiber), ["first", "second"])
37 }))
38})