56 lines
1.4 KiB
TypeScript
56 lines
1.4 KiB
TypeScript
/**
|
|
* @since 2.0.0
|
|
*/
|
|
import * as Context from "./Context.js"
|
|
import type * as Effect from "./Effect.js"
|
|
import type * as FiberRef from "./FiberRef.js"
|
|
import * as core from "./internal/core.js"
|
|
|
|
/**
|
|
* @since 2.0.0
|
|
*/
|
|
export const TestSizedTypeId: unique symbol = Symbol.for("effect/TestSized")
|
|
|
|
/**
|
|
* @since 2.0.0
|
|
*/
|
|
export type TestSizedTypeId = typeof TestSizedTypeId
|
|
|
|
/**
|
|
* @since 2.0.0
|
|
*/
|
|
export interface TestSized {
|
|
readonly [TestSizedTypeId]: TestSizedTypeId
|
|
readonly fiberRef: FiberRef.FiberRef<number>
|
|
readonly size: Effect.Effect<number>
|
|
withSize(size: number): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
|
|
}
|
|
|
|
/**
|
|
* @since 2.0.0
|
|
*/
|
|
export const TestSized: Context.Tag<TestSized, TestSized> = Context.GenericTag("effect/TestSized")
|
|
|
|
/** @internal */
|
|
class SizedImpl implements TestSized {
|
|
readonly [TestSizedTypeId]: TestSizedTypeId = TestSizedTypeId
|
|
constructor(readonly fiberRef: FiberRef.FiberRef<number>) {}
|
|
get size(): Effect.Effect<number> {
|
|
return core.fiberRefGet(this.fiberRef)
|
|
}
|
|
withSize(size: number) {
|
|
return <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
|
|
core.fiberRefLocally(this.fiberRef, size)(effect)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @since 2.0.0
|
|
*/
|
|
export const make = (size: number): TestSized => new SizedImpl(core.fiberRefUnsafeMake(size))
|
|
|
|
/**
|
|
* @since 2.0.0
|
|
*/
|
|
export const fromFiberRef = (fiberRef: FiberRef.FiberRef<number>): TestSized => new SizedImpl(fiberRef)
|