Effect.acquireRelease
from Scope (effect)
Effect.acquireRelease(acquire, release)
リソースを安全に取得し、不要になったときに確実に解放するための関数
ファイルハンドル・DB接続・ソケットなどのリソース管理に便利
リソースが正常に取得された場合、スコープが閉じられたときに必ず解放処理が実行されることを保証する
リソース管理する言語機能やパターンだmrsekut.icon
https://effect.website/docs/resource-management/scope/#defining-resources
以下2つの処理を定義する
Aqcuireing the Resource
リソースの取得処理
e.g. ファイルを開く、DB接続を確立するなど
Releasing the Resouce
リソースの解放処理
e.g. ファイルを閉じる、DB接続を切るなど
例:シンプルなリソースの定義
code:ts
import { Effect } from "effect"
// リソースの型定義
interface MyResource {
readonly contents: string
readonly close: () => Promise<void>
}
// リソースの取得処理
const getMyResource = (): Promise<MyResource> =>
Promise.resolve({
contents: "lorem ipsum",
close: () =>
new Promise((resolve) => {
console.log("Resource released")
resolve()
})
})
// 取得処理のEffect化
const acquire = Effect.tryPromise({
try: () =>
getMyResource().then((res) => {
console.log("Resource acquired")
return res
}),
catch: () => new Error("getMyResourceError")
})
// 解放処理の定義
const release = (res: MyResource) => Effect.promise(() => res.close())
// リソース取得+解放ワークフロー
// resource :: Effect<MyResource, Error, Scope>
const resource = Effect.acquireRelease(acquire, release)
リソースを使う
code:ts
// program :: Effect<void, Error, Scope>
const program = Effect.gen(function* () {
const res = yield* resource
console.log(content is ${res.contents})
})
Effect.scopedと使えば、Scope型がContextから消える
スコープの作成 → ワークフローの実行 → スコープのクローズが自動的に行われる
code:ts
// program :: Effect<void, Error, never>
const program = Effect.scoped(
Effect.gen(function* () {
const res = yield* resource
console.log(content is ${res.contents})
})
)