/** * Returns a memoized version of the specified effectual function. * * @tsplus static effect/core/io/Effect.Ops memoize */ export function memoizeF( f: (a: A) => Effect ): Effect Effect> { return Ref.Synchronized.make(new Map>()).map( (ref) => (a: A) => ref.modifyEffect((map) => { const result = Maybe.fromNullable(map.get(a)) return result.fold( Deferred.make() .tap((deferred) => f(a).intoDeferred(deferred).fork) .map((deferred) => [deferred, map.set(a, deferred)] as const), (deferred) => Effect.succeed([deferred, map] as const) ) }) .flatMap((deferred) => deferred.await) ) }