const program = Effect.gen(function*() {
const randomNumber = ({ n, s }: { n: number; s: string }) =>
Random.nextIntBetween(1, n).pipe(Effect.andThen((v) => `Hello ${s}: ${v}`))
console.log("non-memoized version:")
console.log(yield* randomNumber({ n: 10, s: "World" })) // Generates a new random number
console.log(yield* randomNumber({ n: 10, s: "World" })) // ❌ Generates a different number
console.log("broken memoized version:")
const memoized = yield* Effect.cachedFunction(randomNumber)
console.log(yield* memoized({ n: 10, s: "Broken" })) // Generates and caches the result
console.log(yield* memoized({ n: 10, s: "Broken" })) // ❌ Generates a different number
console.log("memoized arg version:")
const arg = { n: 10, s: "World" }
console.log(yield* memoized(arg)) // Generates and caches the result
console.log(yield* memoized(arg)) // ✅ Reuses the cached result
console.log("memoized data version:")
console.log(yield* memoized(Data.struct({ n: 10, s: "Data"}))) // Generates and caches the result
console.log(yield* memoized(Data.struct({ n: 10, s: "Data"}))) // ✅ Reuses the cached result
})
const program = Effect.gen(function*() {
const randomNumber = ({ n, s }: { n: number; s: string }) =>
Random.nextIntBetween(1, n).pipe(Effect.andThen((v) => `Hello ${s}: ${v}`))
console.log("non-memoized version:")
console.log(yield* randomNumber({ n: 10, s: "World" })) // Generates a new random number
console.log(yield* randomNumber({ n: 10, s: "World" })) // ❌ Generates a different number
console.log("broken memoized version:")
const memoized = yield* Effect.cachedFunction(randomNumber)
console.log(yield* memoized({ n: 10, s: "Broken" })) // Generates and caches the result
console.log(yield* memoized({ n: 10, s: "Broken" })) // ❌ Generates a different number
console.log("memoized arg version:")
const arg = { n: 10, s: "World" }
console.log(yield* memoized(arg)) // Generates and caches the result
console.log(yield* memoized(arg)) // ✅ Reuses the cached result
console.log("memoized data version:")
console.log(yield* memoized(Data.struct({ n: 10, s: "Data"}))) // Generates and caches the result
console.log(yield* memoized(Data.struct({ n: 10, s: "Data"}))) // ✅ Reuses the cached result
})