1import * as Fly from "alchemy/Fly";
2import * as Effect from "effect/Effect";
3import Users from "./users.ts";
4
5const ORDERS = [
6 { id: "o1", userId: "u1", item: "keyboard" },
7 { id: "o2", userId: "u2", item: "monitor" },
8];
9
10/**
11 * Private Service that calls {@link Users} through a binding. Binding
12 * `Users` makes Orders deploy after it and hands Orders a typed client.
13 */
14export default class Orders extends Fly.Service<Orders>()(
15 "Orders",
16 Effect.gen(function* () {
17 return {
18 main: import.meta.url,
19 public: false,
20 network: yield* Fly.stackNetwork,
21 };
22 }),
23 Effect.gen(function* () {
24 const users = yield* Fly.bindService(Users);
25 return {
26 list: () =>
27 Effect.forEach(ORDERS, (order) =>
28 users
29 .get(order.userId)
30 .pipe(Effect.map((user) => ({ ...order, user }))),
31 ),
32 };
33 }),
34) {}