memoize property

IO<ZIO<R, E, A>> memoize

Memoize the result of this ZIO in a Deferred.

The result will be computed only once, and subsequent calls will return the same value.

Implementation

IO<ZIO<R, E, A>> get memoize => IO(() {
      final deferred = Deferred<E, A>();
      var executed = false;

      return ZIO<R, E, A>.from((ctx) {
        if (executed) {
          return deferred.await().unsafeRun(ctx);
        }

        executed = true;
        return tapExit(deferred.completeExit).unsafeRun(ctx);
      });
    });