Skip to content
Effect 4.0 is here. One ecosystem. Zero dependencies.

RcRef

9 exports Since v3.5.0 Source

Combinators

Since v3.5.0

Signature

declare const get: <A, E>(self: RcRef<A, E>) => Effect.Effect<A, E, Scope.Scope>

Signature

declare const invalidate: <A, E>(self: RcRef<A, E>) => Effect.Effect<void>

Constructors

Since v3.5.0

Create an RcRef from an acquire Effect.

An RcRef wraps a reference counted resource that can be acquired and released multiple times.

The resource is lazily acquired on the first call to get and released when the last reference is released.

Signature

declare const make: <A, E, R>(options: {
readonly acquire: Effect.Effect<A, E, R>;
readonly idleTimeToLive?: Duration.DurationInput;
}) => Effect.Effect<RcRef<A, E>, never, R | Scope.Scope>

Example

import { Effect, RcRef } from "effect"
Effect.gen(function*() {
const ref = yield* RcRef.make({
acquire: Effect.acquireRelease(
Effect.succeed("foo"),
() => Effect.log("release foo")
)
})
// will only acquire the resource once, and release it
// when the scope is closed
yield* RcRef.get(ref).pipe(
Effect.andThen(RcRef.get(ref)),
Effect.scoped
)
})

Models

Since v3.5.0

RcRef

interface
Since v3.5.0

Signature

interface RcRef<out A, out E = never> extends Effect<A, E, Scope.Scope>, Readable<A, E, Scope.Scope> {
readonly [ignoreSymbol]?: RcRefUnifyIgnore;
readonly [TypeId]: Variance<A, E>;
readonly [typeSymbol]?: unknown;
readonly [unifySymbol]?: RcRefUnify<RcRef<A, E>>;
}

RcRefUnify

interface
Since v3.8.0

Signature

interface RcRefUnify<A extends {
[typeSymbol]?: any;
}> extends EffectUnify<A> {
RcRef?: () => A[typeof typeSymbol] extends RcRef<A0, E0> | _ ? RcRef<A0, E0> : never;
}
Since v3.8.0

Signature

interface RcRefUnifyIgnore extends EffectUnifyIgnore {
Effect?: true;
}

Type Ids

Since v3.5.0

Signature

declare const TypeId: unique symbol
Since v3.5.0

Signature

type TypeId = typeof TypeId