-
-
Notifications
You must be signed in to change notification settings - Fork 244
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Co-authored-by: Tim Smart <tim.smart@arisechurch.com>
- Loading branch information
Showing
13 changed files
with
947 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
--- | ||
"effect": minor | ||
--- | ||
|
||
add RcRef module | ||
|
||
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. | ||
|
||
```ts | ||
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); | ||
}); | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
"effect": minor | ||
--- | ||
|
||
add Duration.isZero, for checking if a Duration is zero |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
--- | ||
"effect": minor | ||
--- | ||
|
||
add RcMap module | ||
|
||
An `RcMap` can contain multiple reference counted resources that can be indexed | ||
by a key. The resources are lazily acquired on the first call to `get` and | ||
released when the last reference is released. | ||
|
||
Complex keys can extend `Equal` and `Hash` to allow lookups by value. | ||
|
||
```ts | ||
import { Effect, RcMap } from "effect"; | ||
|
||
Effect.gen(function* () { | ||
const map = yield* RcMap.make({ | ||
lookup: (key: string) => | ||
Effect.acquireRelease(Effect.succeed(`acquired ${key}`), () => | ||
Effect.log(`releasing ${key}`), | ||
), | ||
}); | ||
|
||
// Get "foo" from the map twice, which will only acquire it once | ||
// It will then be released once the scope closes. | ||
yield* RcMap.get(map, "foo").pipe( | ||
Effect.andThen(RcMap.get(map, "foo")), | ||
Effect.scoped, | ||
); | ||
}); | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
/** | ||
* @since 3.5.0 | ||
*/ | ||
import type * as Cause from "./Cause.js" | ||
import type * as Duration from "./Duration.js" | ||
import type * as Effect from "./Effect.js" | ||
import * as internal from "./internal/rcMap.js" | ||
import { type Pipeable } from "./Pipeable.js" | ||
import type * as Scope from "./Scope.js" | ||
import type * as Types from "./Types.js" | ||
|
||
/** | ||
* @since 3.5.0 | ||
* @category type ids | ||
*/ | ||
export const TypeId: unique symbol = internal.TypeId | ||
|
||
/** | ||
* @since 3.5.0 | ||
* @category type ids | ||
*/ | ||
export type TypeId = typeof TypeId | ||
|
||
/** | ||
* @since 3.5.0 | ||
* @category models | ||
*/ | ||
export interface RcMap<in K, out A, out E = never> extends Pipeable { | ||
readonly [TypeId]: RcMap.Variance<K, A, E> | ||
} | ||
|
||
/** | ||
* @since 3.5.0 | ||
* @category models | ||
*/ | ||
export declare namespace RcMap { | ||
/** | ||
* @since 3.5.0 | ||
* @category models | ||
*/ | ||
export interface Variance<K, A, E> { | ||
readonly _K: Types.Contravariant<K> | ||
readonly _A: Types.Covariant<A> | ||
readonly _E: Types.Covariant<E> | ||
} | ||
} | ||
|
||
/** | ||
* An `RcMap` can contain multiple reference counted resources that can be indexed | ||
* by a key. The resources are lazily acquired on the first call to `get` and | ||
* released when the last reference is released. | ||
* | ||
* Complex keys can extend `Equal` and `Hash` to allow lookups by value. | ||
* | ||
* @since 3.5.0 | ||
* @category models | ||
* @param capacity The maximum number of resources that can be held in the map. | ||
* @param idleTimeToLive When the reference count reaches zero, the resource will be released after this duration. | ||
* @example | ||
* import { Effect, RcMap } from "effect" | ||
* | ||
* Effect.gen(function*() { | ||
* const map = yield* RcMap.make({ | ||
* lookup: (key: string) => | ||
* Effect.acquireRelease( | ||
* Effect.succeed(`acquired ${key}`), | ||
* () => Effect.log(`releasing ${key}`) | ||
* ) | ||
* }) | ||
* | ||
* // Get "foo" from the map twice, which will only acquire it once. | ||
* // It will then be released once the scope closes. | ||
* yield* RcMap.get(map, "foo").pipe( | ||
* Effect.andThen(RcMap.get(map, "foo")), | ||
* Effect.scoped | ||
* ) | ||
* }) | ||
*/ | ||
export const make: { | ||
<K, A, E, R>( | ||
options: { | ||
readonly lookup: (key: K) => Effect.Effect<A, E, R> | ||
readonly idleTimeToLive?: Duration.DurationInput | undefined | ||
readonly capacity?: undefined | ||
} | ||
): Effect.Effect<RcMap<K, A, E>, never, Scope.Scope | R> | ||
<K, A, E, R>( | ||
options: { | ||
readonly lookup: (key: K) => Effect.Effect<A, E, R> | ||
readonly idleTimeToLive?: Duration.DurationInput | undefined | ||
readonly capacity: number | ||
} | ||
): Effect.Effect<RcMap<K, A, E | Cause.ExceededCapacityException>, never, Scope.Scope | R> | ||
} = internal.make | ||
|
||
/** | ||
* @since 3.5.0 | ||
* @category combinators | ||
*/ | ||
export const get: { | ||
<K>(key: K): <A, E>(self: RcMap<K, A, E>) => Effect.Effect<A, E, Scope.Scope> | ||
<K, A, E>(self: RcMap<K, A, E>, key: K): Effect.Effect<A, E, Scope.Scope> | ||
} = internal.get |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
/** | ||
* @since 3.5.0 | ||
*/ | ||
import type * as Duration from "./Duration.js" | ||
import type * as Effect from "./Effect.js" | ||
import * as internal from "./internal/rcRef.js" | ||
import { type Pipeable } from "./Pipeable.js" | ||
import type * as Scope from "./Scope.js" | ||
import type * as Types from "./Types.js" | ||
|
||
/** | ||
* @since 3.5.0 | ||
* @category type ids | ||
*/ | ||
export const TypeId: unique symbol = internal.TypeId | ||
|
||
/** | ||
* @since 3.5.0 | ||
* @category type ids | ||
*/ | ||
export type TypeId = typeof TypeId | ||
|
||
/** | ||
* @since 3.5.0 | ||
* @category models | ||
*/ | ||
export interface RcRef<out A, out E = never> extends Pipeable { | ||
readonly [TypeId]: RcRef.Variance<A, E> | ||
} | ||
|
||
/** | ||
* @since 3.5.0 | ||
* @category models | ||
*/ | ||
export declare namespace RcRef { | ||
/** | ||
* @since 3.5.0 | ||
* @category models | ||
*/ | ||
export interface Variance<A, E> { | ||
readonly _A: Types.Covariant<A> | ||
readonly _E: Types.Covariant<E> | ||
} | ||
} | ||
|
||
/** | ||
* 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. | ||
* | ||
* @since 3.5.0 | ||
* @category constructors | ||
* @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 | ||
* ) | ||
* }) | ||
*/ | ||
export const make: <A, E, R>( | ||
options: { | ||
readonly acquire: Effect.Effect<A, E, R> | ||
/** | ||
* When the reference count reaches zero, the resource will be released | ||
* after this duration. | ||
*/ | ||
readonly idleTimeToLive?: Duration.DurationInput | undefined | ||
} | ||
) => Effect.Effect<RcRef<A, E>, never, R | Scope.Scope> = internal.make | ||
|
||
/** | ||
* @since 3.5.0 | ||
* @category combinators | ||
*/ | ||
export const get: <A, E>(self: RcRef<A, E>) => Effect.Effect<A, E, Scope.Scope> = internal.get |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.