Skip to content

Effectの実行

Effect を実行するためには、Effect モジュールが提供するさまざまな「run」関数を利用できます。

runSync

Effect.runSync関数は、Effect を同期的に実行するために使用されます。これは、即座に実行され、結果が返されることを意味します。

import { Effect } from "effect";
const program = Effect.sync(() => {
console.log("Hello, World!");
return 1;
});
const result = Effect.runSync(program);
// Output: Hello, World!
console.log(result);
// Output: 1

コンソールを確認すると、メッセージ「Hello, World!」が表示されます。

import { Effect } from "effect";
Effect.runSync(Effect.fail("my error")); // throws
Effect.runSync(Effect.promise(() => Promise.resolve(1))); // throws

runSyncExit

Effect.runSyncExit関数は、Effect を同期的に実行し、その結果をExit(Effect ワークフローの実行結果を記述するために使用されるデータ型)として返します。

import { Effect } from "effect";
const result1 = Effect.runSyncExit(Effect.succeed(1));
console.log(result1);
/*
Output:
{
_id: "Exit",
_tag: "Success",
value: 1
}
*/
const result2 = Effect.runSyncExit(Effect.fail("my error"));
console.log(result2);
/*
Output:
{
_id: "Exit",
_tag: "Failure",
cause: {
_id: "Cause",
_tag: "Fail",
failure: "my error"
}
}
*/
import { Effect } from "effect";
Effect.runSyncExit(Effect.promise(() => Promise.resolve(1))); // throws

runPromise

Effect.runPromise関数は、Effect を実行し、その結果をPromiseとして取得するために使用されます。

import { Effect } from "effect";
Effect.runPromise(Effect.succeed(1)).then(console.log); // Output: 1
import { Effect } from "effect";
Effect.runPromise(Effect.fail("my error")); // rejects

runPromiseExit

Effect.runPromiseExit関数は、Effect を実行し、その結果をExitとして解決するPromiseとして取得するために使用されます。

import { Effect } from "effect";
Effect.runPromiseExit(Effect.succeed(1)).then(console.log);
/*
Output:
{
_id: "Exit",
_tag: "Success",
value: 1
}
*/
Effect.runPromiseExit(Effect.fail("my error")).then(console.log);
/*
Output:
{
_id: "Exit",
_tag: "Failure",
cause: {
_id: "Cause",
_tag: "Fail",
failure: "my error"
}
}
*/

runFork

Effect.runFork関数は、Effect を実行するための基本的な基盤を提供します。実際、すべての他の run 関数はこれに基づいて構築されています。Promise や同期操作の特定のニーズがない限り、Effect.runForkが推奨される選択肢です。これは、観察したり、中断したりできるファイバ(fiber)を返します。

import { Effect, Console, Schedule, Fiber } from "effect";
const program = Effect.repeat(
Console.log("running..."),
Schedule.spaced("200 millis")
);
const fiber = Effect.runFork(program);
setTimeout(() => {
Effect.runFork(Fiber.interrupt(fiber));
}, 500);

この例では、programは、200 ミリ秒間隔で「running…」を継続的にログに記録します。繰り返しやスケジューリングについて詳しくは、スケジューリングの紹介ガイドをご覧ください。

プログラムの実行を停止するために、Effect.runForkで返されたファイバに対してFiber.interruptを使用します。これにより、実行フローを制御し、必要に応じて終了できます。

ファイバの仕組みや中断の処理方法について深く理解するには、ファイバ中断に関するガイドをご覧ください。

チートシート

以下の表は、利用可能なrun*関数の概要を示しており、それに応じて適切な関数を選択できるように入力および出力の型を示しています。

名前引数返り値
runSyncEffect<A, E>A
runSyncExitEffect<A, E>Exit<A, E>
runPromiseEffect<A, E>Promise<A>
runPromiseExitEffect<A, E>Promise<Exit<A, E>>
runForkEffect<A, E>RuntimeFiber<A, E>

完全なrun*関数のリストはこちらで確認できます。