Simplify Access to `SynchronizedRef` in R
I have a
I would like to hide the implementation (
to:
This is the service that provides the
I tried some approaches without success unfortunately. Is it possible?
SynchronizedRef<A>SynchronizedRef<A> in RR in some places that is updated every N minutes in background. I would like to hide the implementation (
SynchronizedRefSynchronizedRef) when accessing the service and directly access AA, from:const accessTokenRef = yield* $(AccessToken);
const accessToken = yield* $(SynchronizedRef.get(accessTokenRef));const accessTokenRef = yield* $(AccessToken);
const accessToken = yield* $(SynchronizedRef.get(accessTokenRef));to:
const accessToken = yield* $(AccessToken);const accessToken = yield* $(AccessToken);This is the service that provides the
AccessTokenAccessToken and updates it:const AccessTokenLive = Layer.scoped(
AccessToken,
Effect.gen(function* ($) {
const authorizationRequest = Effect.request(
new AuthorizationRequest(),
AuthorizationRequestResolver,
);
const response = yield* $(authorizationRequest);
const accessTokenRef = yield* $(SynchronizedRef.make(response.accessToken));
const updateAccessToken = Effect.tap(
authorizationRequest,
({ accessToken }) =>
SynchronizedRef.update(accessTokenRef, () => accessToken).pipe(
Effect.tap(() => Effect.logDebug(accessToken)),
),
);
yield* $(
Effect.scheduleForked(
Effect.void,
Schedule.modifyDelayEffect(
Schedule.fixed(Duration.seconds(response.expiresIn)),
() =>
Effect.map(updateAccessToken, ({ expiresIn }) =>
Duration.seconds(expiresIn),
),
),
),
);
return accessTokenRef;
}),
).pipe(Layer.provide(AuthorizationRequestResolverLive));const AccessTokenLive = Layer.scoped(
AccessToken,
Effect.gen(function* ($) {
const authorizationRequest = Effect.request(
new AuthorizationRequest(),
AuthorizationRequestResolver,
);
const response = yield* $(authorizationRequest);
const accessTokenRef = yield* $(SynchronizedRef.make(response.accessToken));
const updateAccessToken = Effect.tap(
authorizationRequest,
({ accessToken }) =>
SynchronizedRef.update(accessTokenRef, () => accessToken).pipe(
Effect.tap(() => Effect.logDebug(accessToken)),
),
);
yield* $(
Effect.scheduleForked(
Effect.void,
Schedule.modifyDelayEffect(
Schedule.fixed(Duration.seconds(response.expiresIn)),
() =>
Effect.map(updateAccessToken, ({ expiresIn }) =>
Duration.seconds(expiresIn),
),
),
),
);
return accessTokenRef;
}),
).pipe(Layer.provide(AuthorizationRequestResolverLive));I tried some approaches without success unfortunately. Is it possible?
