42 lines
2.2 KiB
JavaScript
42 lines
2.2 KiB
JavaScript
import * as Context from "../Context.js";
|
|
import { pipe } from "../Function.js";
|
|
import * as effect from "./core-effect.js";
|
|
import * as core from "./core.js";
|
|
import * as fiberRuntime from "./fiberRuntime.js";
|
|
import * as layer_ from "./layer.js";
|
|
import * as schedule_ from "./schedule.js";
|
|
import * as scopedRef from "./scopedRef.js";
|
|
/** @internal */
|
|
const ReloadableSymbolKey = "effect/Reloadable";
|
|
/** @internal */
|
|
export const ReloadableTypeId = /*#__PURE__*/Symbol.for(ReloadableSymbolKey);
|
|
const reloadableVariance = {
|
|
/* c8 ignore next */
|
|
_A: _ => _
|
|
};
|
|
/** @internal */
|
|
export const auto = (tag, options) => layer_.scoped(reloadableTag(tag), pipe(layer_.build(manual(tag, {
|
|
layer: options.layer
|
|
})), core.map(Context.unsafeGet(reloadableTag(tag))), core.tap(reloadable => fiberRuntime.acquireRelease(pipe(reloadable.reload, effect.ignoreLogged, schedule_.schedule_Effect(options.schedule), fiberRuntime.forkDaemon), core.interruptFiber))));
|
|
/** @internal */
|
|
export const autoFromConfig = (tag, options) => layer_.scoped(reloadableTag(tag), pipe(core.context(), core.flatMap(env => pipe(layer_.build(auto(tag, {
|
|
layer: options.layer,
|
|
schedule: options.scheduleFromConfig(env)
|
|
})), core.map(Context.unsafeGet(reloadableTag(tag)))))));
|
|
/** @internal */
|
|
export const get = tag => core.flatMap(reloadableTag(tag), reloadable => scopedRef.get(reloadable.scopedRef));
|
|
/** @internal */
|
|
export const manual = (tag, options) => layer_.scoped(reloadableTag(tag), pipe(core.context(), core.flatMap(env => pipe(scopedRef.fromAcquire(pipe(layer_.build(options.layer), core.map(Context.unsafeGet(tag)))), core.map(ref => ({
|
|
[ReloadableTypeId]: reloadableVariance,
|
|
scopedRef: ref,
|
|
reload: pipe(scopedRef.set(ref, pipe(layer_.build(options.layer), core.map(Context.unsafeGet(tag)))), core.provideContext(env))
|
|
}))))));
|
|
/** @internal */
|
|
export const reloadableTag = tag => {
|
|
return Context.GenericTag(`effect/Reloadable<${tag.key}>`);
|
|
};
|
|
/** @internal */
|
|
export const reload = tag => core.flatMap(reloadableTag(tag), reloadable => reloadable.reload);
|
|
/** @internal */
|
|
export const reloadFork = tag => core.flatMap(reloadableTag(tag), reloadable => pipe(reloadable.reload, effect.ignoreLogged, fiberRuntime.forkDaemon, core.asVoid));
|
|
//# sourceMappingURL=reloadable.js.map
|