/** * @since 2.0.0 */ import type * as Effect from "./Effect.js" import * as internal from "./internal/subscriptionRef.js" import type * as Option from "./Option.js" import type * as PubSub from "./PubSub.js" import * as Ref from "./Ref.js" import type * as Stream from "./Stream.js" import type { Subscribable } from "./Subscribable.js" import * as Synchronized from "./SynchronizedRef.js" import type * as Types from "./Types.js" import type * as Unify from "./Unify.js" /** * @since 2.0.0 * @category symbols */ export const SubscriptionRefTypeId: unique symbol = internal.SubscriptionRefTypeId /** * @since 2.0.0 * @category symbols */ export type SubscriptionRefTypeId = typeof SubscriptionRefTypeId /** * A `SubscriptionRef` is a `Ref` that can be subscribed to in order to * receive the current value as well as all changes to the value. * * @since 2.0.0 * @category models */ export interface SubscriptionRef extends SubscriptionRef.Variance, Synchronized.SynchronizedRef, Subscribable { /** @internal */ readonly ref: Ref.Ref /** @internal */ readonly pubsub: PubSub.PubSub /** @internal */ readonly semaphore: Effect.Semaphore /** * A stream containing the current value of the `Ref` as well as all changes * to that value. */ readonly changes: Stream.Stream readonly [Unify.typeSymbol]?: unknown readonly [Unify.unifySymbol]?: SubscriptionRefUnify readonly [Unify.ignoreSymbol]?: SubscriptionRefUnifyIgnore } /** * @category models * @since 3.8.0 */ export interface SubscriptionRefUnify extends Synchronized.SynchronizedRefUnify { SubscriptionRef?: () => Extract> } /** * @category models * @since 3.8.0 */ export interface SubscriptionRefUnifyIgnore extends Synchronized.SynchronizedRefUnifyIgnore { SynchronizedRef?: true } /** * @since 2.0.0 */ export declare namespace SubscriptionRef { /** * @since 2.0.0 * @category models */ export interface Variance { readonly [SubscriptionRefTypeId]: { readonly _A: Types.Invariant } } } /** * @since 2.0.0 * @category getters */ export const get: (self: SubscriptionRef) => Effect.Effect = internal.get /** * @since 2.0.0 * @category utils */ export const getAndSet: { /** * @since 2.0.0 * @category utils */ (value: A): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ (self: SubscriptionRef, value: A): Effect.Effect } = Ref.getAndSet /** * @since 2.0.0 * @category utils */ export const getAndUpdate: { /** * @since 2.0.0 * @category utils */ (f: (a: A) => A): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ (self: SubscriptionRef, f: (a: A) => A): Effect.Effect } = Ref.getAndUpdate /** * @since 2.0.0 * @category utils */ export const getAndUpdateEffect: { /** * @since 2.0.0 * @category utils */ (f: (a: A) => Effect.Effect): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ (self: SubscriptionRef, f: (a: A) => Effect.Effect): Effect.Effect } = Synchronized.getAndUpdateEffect /** * @since 2.0.0 * @category utils */ export const getAndUpdateSome: { /** * @since 2.0.0 * @category utils */ (pf: (a: A) => Option.Option): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ (self: SubscriptionRef, pf: (a: A) => Option.Option): Effect.Effect } = Ref.getAndUpdateSome /** * @since 2.0.0 * @category utils */ export const getAndUpdateSomeEffect: { /** * @since 2.0.0 * @category utils */ (pf: (a: A) => Option.Option>): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ ( self: SubscriptionRef, pf: (a: A) => Option.Option> ): Effect.Effect } = Synchronized.getAndUpdateSomeEffect /** * Creates a new `SubscriptionRef` with the specified value. * * @since 2.0.0 * @category constructors */ export const make: (value: A) => Effect.Effect> = internal.make /** * @since 2.0.0 * @category utils */ export const modify: { /** * @since 2.0.0 * @category utils */ (f: (a: A) => readonly [B, A]): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ (self: SubscriptionRef, f: (a: A) => readonly [B, A]): Effect.Effect } = internal.modify /** * @since 2.0.0 * @category utils */ export const modifyEffect: { /** * @since 2.0.0 * @category utils */ (f: (a: A) => Effect.Effect): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ ( self: SubscriptionRef, f: (a: A) => Effect.Effect ): Effect.Effect } = internal.modifyEffect /** * @since 2.0.0 * @category utils */ export const modifySome: { /** * @since 2.0.0 * @category utils */ (fallback: B, pf: (a: A) => Option.Option): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ ( self: SubscriptionRef, fallback: B, pf: (a: A) => Option.Option ): Effect.Effect } = Ref.modifySome /** * @since 2.0.0 * @category utils */ export const modifySomeEffect: { /** * @since 2.0.0 * @category utils */ ( fallback: B, pf: (a: A) => Option.Option> ): (self: Synchronized.SynchronizedRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ ( self: Synchronized.SynchronizedRef, fallback: B, pf: (a: A) => Option.Option> ): Effect.Effect } = Synchronized.modifySomeEffect /** * @since 2.0.0 * @category utils */ export const set: { /** * @since 2.0.0 * @category utils */ (value: A): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ (self: SubscriptionRef, value: A): Effect.Effect } = internal.set /** * @since 2.0.0 * @category utils */ export const setAndGet: { /** * @since 2.0.0 * @category utils */ (value: A): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ (self: SubscriptionRef, value: A): Effect.Effect } = Ref.setAndGet /** * @since 2.0.0 * @category utils */ export const update: { /** * @since 2.0.0 * @category utils */ (f: (a: A) => A): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ (self: SubscriptionRef, f: (a: A) => A): Effect.Effect } = Ref.update /** * @since 2.0.0 * @category utils */ export const updateEffect: { /** * @since 2.0.0 * @category utils */ (f: (a: A) => Effect.Effect): (self: Synchronized.SynchronizedRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ (self: Synchronized.SynchronizedRef, f: (a: A) => Effect.Effect): Effect.Effect } = Synchronized.updateEffect /** * @since 2.0.0 * @category utils */ export const updateAndGet: { /** * @since 2.0.0 * @category utils */ (f: (a: A) => A): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ (self: SubscriptionRef, f: (a: A) => A): Effect.Effect } = Ref.updateAndGet /** * @since 2.0.0 * @category utils */ export const updateAndGetEffect: { /** * @since 2.0.0 * @category utils */ (f: (a: A) => Effect.Effect): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ (self: SubscriptionRef, f: (a: A) => Effect.Effect): Effect.Effect } = Synchronized.updateAndGetEffect /** * @since 2.0.0 * @category utils */ export const updateSome: { /** * @since 2.0.0 * @category utils */ (f: (a: A) => Option.Option): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ (self: SubscriptionRef, f: (a: A) => Option.Option): Effect.Effect } = Ref.updateSome /** * @since 2.0.0 * @category utils */ export const updateSomeEffect: { /** * @since 2.0.0 * @category utils */ (pf: (a: A) => Option.Option>): (self: Synchronized.SynchronizedRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ ( self: Synchronized.SynchronizedRef, pf: (a: A) => Option.Option> ): Effect.Effect } = Synchronized.updateSomeEffect /** * @since 2.0.0 * @category utils */ export const updateSomeAndGet: { /** * @since 2.0.0 * @category utils */ (pf: (a: A) => Option.Option): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ (self: SubscriptionRef, pf: (a: A) => Option.Option): Effect.Effect } = Ref.updateSomeAndGet /** * @since 2.0.0 * @category utils */ export const updateSomeAndGetEffect: { /** * @since 2.0.0 * @category utils */ (pf: (a: A) => Option.Option>): (self: SubscriptionRef) => Effect.Effect /** * @since 2.0.0 * @category utils */ ( self: SubscriptionRef, pf: (a: A) => Option.Option> ): Effect.Effect } = Synchronized.updateSomeAndGetEffect