Effect.gen
do記法的なやつ
pipelineでも書けるが、手続き的にEffectの組み合わせ処理を書ける
code:ts
import { Effect } from "effect"
// Function to add a small service charge to a transaction amount
const addServiceCharge = (amount: number) => amount + 1
// Function to apply a discount safely to a transaction amount
const applyDiscount = (
total: number,
discountRate: number
): Effect.Effect<number, Error> =>
discountRate === 0
? Effect.fail(new Error("Discount rate cannot be zero"))
: Effect.succeed(total - (total * discountRate) / 100)
const fetchTransactionAmount = Effect.promise(() => Promise.resolve(100)) // Effect.Effect<number, never, never>
const fetchDiscountRate = Effect.promise(() => Promise.resolve(5))
yield*を通すことで、successの型が得られるのがわかる
code:ts
// Assembling the program using a generator function
const program = Effect.gen(function* () {
const transactionAmount = yield* fetchTransactionAmount // number
const discountRate = yield* fetchDiscountRate
const discountedAmount = yield* applyDiscount(
transactionAmount,
discountRate
)
const finalAmount = addServiceCharge(discountedAmount)
return Final amount to charge: ${finalAmount}
})
// Execute the program and log the result
Effect.runPromise(program).then(console.log)
// Output: Final amount to charge: 96
https://effect.website/docs/getting-started/using-generators/
class内で使う場合は第1引数にthisを渡す
code:ts
class MyClass {
readonly local = 1
compute = Effect.gen(this, function* () {
const n = this.local + 1
yield* Effect.log(Computed value: ${n})
return n
})
}