//effect version (not ideal)
import {
Console,
Context,
Data,
Effect,
Layer,
Logger,
Option,
pipe,
Ref,
} from "effect";
const task = Effect.fn(function* (taskName: string) {
yield* Effect.log(`[running] ${taskName}`);
});
//very low priority
const sendNotifyToDiscord = Effect.fn(function* (msg: string) {
yield* Effect.log(`[sending] ${msg}`);
yield* Effect.sleep("5 seconds"); // emulating network time
yield* Effect.log(`[finished] ${msg}`);
});
const taskFlow = Effect.fn(function* (taskId: string) {
// critical task
yield* task(`id:${taskId} Task1`);
const fb1 = yield* Effect.fork(sendNotifyToDiscord(`id:${taskId} Task1`)); // I don't want wait for this to finish
yield* task(`id:${taskId} Task2`);
const fb2 = yield* Effect.fork(sendNotifyToDiscord(`id:${taskId} Task2`));
yield* fb1; //but this still blocks next call
yield* fb2;
});
const program = Effect.gen(function* () {
yield* Effect.log("start");
yield* taskFlow("1");
yield* taskFlow("2");
yield* Effect.log("program finished");
});
const runnable = program.pipe(Effect.provide(Logger.pretty), Effect.scoped);
Effect.runPromise(runnable).catch(console.error);
/*
[21:27:38.758] INFO (#0): [running] id:1 Task1
[21:27:38.759] INFO (#0): [running] id:1 Task2
[21:27:38.760] INFO (#1): [sending] id:1 Task1
[21:27:38.761] INFO (#2): [sending] id:1 Task2
[21:27:43.766] INFO (#1): [finished] id:1 Task1
[21:27:43.772] INFO (#2): [finished] id:1 Task2
[21:27:43.773] INFO (#0): [running] id:2 Task1
[21:27:43.774] INFO (#0): [running] id:2 Task2
[21:27:43.775] INFO (#3): [sending] id:2 Task1
[21:27:43.775] INFO (#4): [sending] id:2 Task2
[21:27:48.780] INFO (#3): [finished] id:2 Task1
[21:27:48.783] INFO (#4): [finished] id:2 Task2
*/
//effect version (not ideal)
import {
Console,
Context,
Data,
Effect,
Layer,
Logger,
Option,
pipe,
Ref,
} from "effect";
const task = Effect.fn(function* (taskName: string) {
yield* Effect.log(`[running] ${taskName}`);
});
//very low priority
const sendNotifyToDiscord = Effect.fn(function* (msg: string) {
yield* Effect.log(`[sending] ${msg}`);
yield* Effect.sleep("5 seconds"); // emulating network time
yield* Effect.log(`[finished] ${msg}`);
});
const taskFlow = Effect.fn(function* (taskId: string) {
// critical task
yield* task(`id:${taskId} Task1`);
const fb1 = yield* Effect.fork(sendNotifyToDiscord(`id:${taskId} Task1`)); // I don't want wait for this to finish
yield* task(`id:${taskId} Task2`);
const fb2 = yield* Effect.fork(sendNotifyToDiscord(`id:${taskId} Task2`));
yield* fb1; //but this still blocks next call
yield* fb2;
});
const program = Effect.gen(function* () {
yield* Effect.log("start");
yield* taskFlow("1");
yield* taskFlow("2");
yield* Effect.log("program finished");
});
const runnable = program.pipe(Effect.provide(Logger.pretty), Effect.scoped);
Effect.runPromise(runnable).catch(console.error);
/*
[21:27:38.758] INFO (#0): [running] id:1 Task1
[21:27:38.759] INFO (#0): [running] id:1 Task2
[21:27:38.760] INFO (#1): [sending] id:1 Task1
[21:27:38.761] INFO (#2): [sending] id:1 Task2
[21:27:43.766] INFO (#1): [finished] id:1 Task1
[21:27:43.772] INFO (#2): [finished] id:1 Task2
[21:27:43.773] INFO (#0): [running] id:2 Task1
[21:27:43.774] INFO (#0): [running] id:2 Task2
[21:27:43.775] INFO (#3): [sending] id:2 Task1
[21:27:43.775] INFO (#4): [sending] id:2 Task2
[21:27:48.780] INFO (#3): [finished] id:2 Task1
[21:27:48.783] INFO (#4): [finished] id:2 Task2
*/