<K = unknown>(options: {
readonly permits: number
}): PartitionedSemaphore<K>Constructs a PartitionedSemaphore synchronously, outside of Effect.
When to use
Use when you need to construct a partitioned semaphore synchronously outside
an Effect workflow.
Details
Negative permit counts are clamped to 0. Non-finite permit counts create
an unbounded semaphore whose acquire and release operations complete
immediately.
export const const makeUnsafe: <K = unknown>(options: {
readonly permits: number
}) => PartitionedSemaphore<K>
Constructs a PartitionedSemaphore synchronously, outside of Effect.
When to use
Use when you need to construct a partitioned semaphore synchronously outside
an Effect workflow.
Details
Negative permit counts are clamped to 0. Non-finite permit counts create
an unbounded semaphore whose acquire and release operations complete
immediately.
makeUnsafe = <function (type parameter) K in <K = unknown>(options: {
readonly permits: number;
}): PartitionedSemaphore<K>
K = unknown>(options: {
readonly permits: number
}
options: {
readonly permits: numberpermits: number
}): interface PartitionedSemaphore<in K>A PartitionedSemaphore controls access to a shared permit pool while
tracking waiters by partition key.
When to use
Use to coordinate shared permits across partition keys so waiting groups make
progress without one group monopolizing the pool.
Details
Waiting permits are distributed across partitions in round-robin order.
PartitionedSemaphore<function (type parameter) K in <K = unknown>(options: {
readonly permits: number;
}): PartitionedSemaphore<K>
K> => {
const const maxPermits: numbermaxPermits = var Math: MathAn intrinsic object that provides basic mathematics functionality and constants.
Math.Math.max(...values: number[]): numberReturns the larger of a set of supplied numeric expressions.
max(0, options: {
readonly permits: number
}
options.permits: numberpermits)
if (!var Number: NumberConstructorAn object that represents a number of any kind. All JavaScript numbers are 64-bit floating-point numbers.
Number.NumberConstructor.isFinite(number: unknown): booleanReturns true if passed value is finite.
Unlike the global isFinite, Number.isFinite doesn't forcibly convert the parameter to a
number. Only finite values of the type number, result in true.
isFinite(const maxPermits: numbermaxPermits)) {
return {
[const PartitionedTypeId: PartitionedTypeIdRuntime type identifier used to mark values that implement
PartitionedSemaphore.
Details
This marker is part of the runtime representation of partitioned semaphore
values.
Literal type of the PartitionedSemaphore runtime type identifier.
When to use
Use to type fields that store the exact PartitionedSemaphore runtime marker.
Details
Use this type when declaring fields that must contain the exact
PartitionedTypeId marker value.
PartitionedTypeId]: const PartitionedTypeId: PartitionedTypeIdRuntime type identifier used to mark values that implement
PartitionedSemaphore.
Details
This marker is part of the runtime representation of partitioned semaphore
values.
Literal type of the PartitionedSemaphore runtime type identifier.
When to use
Use to type fields that store the exact PartitionedSemaphore runtime marker.
Details
Use this type when declaring fields that must contain the exact
PartitionedTypeId marker value.
PartitionedTypeId,
PartitionedSemaphore<in K>.capacity: numbercapacity: const maxPermits: numbermaxPermits,
PartitionedSemaphore<in K>.available: Effect.Effect<number, never, never>(property) PartitionedSemaphore<in K>.available: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
available: import EffectEffect.succeed(const maxPermits: numbermaxPermits),
PartitionedSemaphore<K>.take: (key: K, permits: number) => Effect.Effect<void>take: () => import EffectEffect.void,
PartitionedSemaphore<K>.release: (permits: number) => Effect.Effect<number>release: () => import EffectEffect.succeed(const maxPermits: numbermaxPermits),
PartitionedSemaphore<K>.withPermits: (key: K, permits: number) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>withPermits: () => (effect: Effect.Effect<A, E, R>(parameter) effect: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
effect) => effect: Effect.Effect<A, E, R>(parameter) effect: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
effect,
PartitionedSemaphore<K>.withPermit: (key: K) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>withPermit: () => (effect: Effect.Effect<A, E, R>(parameter) effect: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
effect) => effect: Effect.Effect<A, E, R>(parameter) effect: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
effect,
PartitionedSemaphore<K>.withPermitsIfAvailable: (permits: number) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<Option.Option<A>, E, R>withPermitsIfAvailable: () => (effect: Effect.Effect<A, E, R>(parameter) effect: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
effect) => import EffectEffect.asSome(effect: Effect.Effect<A, E, R>(parameter) effect: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
effect)
}
}
let let totalPermits: numbertotalPermits = const maxPermits: numbermaxPermits
let let waitingPermits: numberwaitingPermits = 0
type type Waiter = {
permits: number
readonly resume: () => void
}
Waiter = {
permits: numberpermits: number
readonly resume: () => voidresume: () => void
}
const const partitions: MutableHashMap.MutableHashMap<
K,
Set<Waiter>
>
const partitions: {
backing: Map<K, V>;
buckets: Map<number, NonEmptyArray<K>>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
partitions = import MutableHashMapMutableHashMap.empty<function (type parameter) K in <K = unknown>(options: {
readonly permits: number;
}): PartitionedSemaphore<K>
K, interface Set<T>Set<type Waiter = {
permits: number
readonly resume: () => void
}
Waiter>>()
let let iterator: anyiterator = const partitions: MutableHashMap.MutableHashMap<
K,
Set<Waiter>
>
const partitions: {
backing: Map<K, V>;
buckets: Map<number, NonEmptyArray<K>>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
partitions[var Symbol: SymbolConstructorSymbol.SymbolConstructor.iterator: typeof Symbol.iteratorA method that returns the default iterator for an object. Called by the semantics of the
for-of statement.
iterator]()
const const releaseUnsafe: (
permits: number
) => number
releaseUnsafe = (permits: numberpermits: number): number => {
while (permits: numberpermits > 0) {
if (let waitingPermits: numberwaitingPermits === 0) {
let totalPermits: numbertotalPermits = var Math: MathAn intrinsic object that provides basic mathematics functionality and constants.
Math.Math.min(...values: number[]): numberReturns the smaller of a set of supplied numeric expressions.
min(const maxPermits: numbermaxPermits, let totalPermits: numbertotalPermits + permits: numberpermits)
return let totalPermits: numbertotalPermits
}
let let state: anystate = let iterator: anyiterator.next()
if (let state: anystate.done) {
let iterator: anyiterator = const partitions: MutableHashMap.MutableHashMap<
K,
Set<Waiter>
>
const partitions: {
backing: Map<K, V>;
buckets: Map<number, NonEmptyArray<K>>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
partitions[var Symbol: SymbolConstructorSymbol.SymbolConstructor.iterator: typeof Symbol.iteratorA method that returns the default iterator for an object. Called by the semantics of the
for-of statement.
iterator]()
let state: anystate = let iterator: anyiterator.next()
if (let state: anystate.done) {
return let totalPermits: numbertotalPermits
}
}
const const waiter: anywaiter = let state: anystate.value[1].values().next().value
if (const waiter: anywaiter === var undefinedundefined) {
continue
}
const waiter: anyconst waiter: {
permits: number;
resume: () => void;
}
waiter.permits -= 1
let waitingPermits: numberwaitingPermits -= 1
if (const waiter: anyconst waiter: {
permits: number;
resume: () => void;
}
waiter.permits === 0) {
const waiter: anyconst waiter: {
permits: number;
resume: () => void;
}
waiter.resume()
}
permits: numberpermits -= 1
}
return let totalPermits: numbertotalPermits
}
const const take: (
key: K,
permits: number
) => Effect.Effect<void>
take = (key: K = unknownkey: function (type parameter) K in <K = unknown>(options: {
readonly permits: number;
}): PartitionedSemaphore<K>
K, permits: numberpermits: number): import EffectEffect.type Effect.Effect = /*unresolved*/ anyEffect<void> => {
if (permits: numberpermits <= 0) {
return import EffectEffect.void
}
return import EffectEffect.callback<void>((resume: anyresume) => {
if (const maxPermits: numbermaxPermits < permits: numberpermits) {
resume: anyresume(import EffectEffect.never)
return
}
if (let totalPermits: numbertotalPermits >= permits: numberpermits) {
let totalPermits: numbertotalPermits -= permits: numberpermits
resume: anyresume(import EffectEffect.void)
return
}
const const needed: numberneeded = permits: numberpermits - let totalPermits: numbertotalPermits
const const taken: numbertaken = permits: numberpermits - const needed: numberneeded
if (let totalPermits: numbertotalPermits > 0) {
let totalPermits: numbertotalPermits = 0
}
let waitingPermits: numberwaitingPermits += const needed: numberneeded
const const waiters: anywaiters = import OptionOption.getOrElse(
import MutableHashMapMutableHashMap.get(const partitions: MutableHashMap.MutableHashMap<
K,
Set<Waiter>
>
const partitions: {
backing: Map<K, V>;
buckets: Map<number, NonEmptyArray<K>>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
partitions, key: K = unknownkey),
() => {
const const set: Set<Waiter>set = new var Set: SetConstructor
new <Waiter>(iterable?: Iterable<Waiter> | null | undefined) => Set<Waiter> (+1 overload)
Set<type Waiter = {
permits: number
readonly resume: () => void
}
Waiter>()
import MutableHashMapMutableHashMap.set(const partitions: MutableHashMap.MutableHashMap<
K,
Set<Waiter>
>
const partitions: {
backing: Map<K, V>;
buckets: Map<number, NonEmptyArray<K>>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
partitions, key: K = unknownkey, const set: Set<Waiter>set)
return const set: Set<Waiter>set
}
)
const const entry: Waiterconst entry: {
permits: number;
resume: () => void;
}
entry: type Waiter = {
permits: number
readonly resume: () => void
}
Waiter = {
permits: numberpermits: const needed: numberneeded,
resume: () => voidresume: () => {
const cleanup: () => voidcleanup()
resume: anyresume(import EffectEffect.void)
}
}
const const cleanup: () => voidcleanup = () => {
const waiters: anywaiters.delete(const entry: Waiterconst entry: {
permits: number;
resume: () => void;
}
entry)
if (const waiters: anywaiters.size === 0) {
import MutableHashMapMutableHashMap.remove(const partitions: MutableHashMap.MutableHashMap<
K,
Set<Waiter>
>
const partitions: {
backing: Map<K, V>;
buckets: Map<number, NonEmptyArray<K>>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
partitions, key: K = unknownkey)
}
}
const waiters: anywaiters.add(const entry: Waiterconst entry: {
permits: number;
resume: () => void;
}
entry)
return import EffectEffect.sync(() => {
const cleanup: () => voidcleanup()
let waitingPermits: numberwaitingPermits -= const entry: Waiterconst entry: {
permits: number;
resume: () => void;
}
entry.permits: numberpermits
if (const taken: numbertaken > 0) {
const releaseUnsafe: (
permits: number
) => number
releaseUnsafe(const taken: numbertaken)
}
})
})
}
const const withPermits: (
key: K,
permits: number
) => <A, E, R>(
effect: Effect.Effect<A, E, R>
) => Effect.Effect<A, E, R>
withPermits =
(key: K = unknownkey: function (type parameter) K in <K = unknown>(options: {
readonly permits: number;
}): PartitionedSemaphore<K>
K, permits: numberpermits: number) => <function (type parameter) A in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>A, function (type parameter) E in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>E, function (type parameter) R in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>R>(effect: Effect.Effect<A, E, R>(parameter) effect: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
effect: import EffectEffect.type Effect.Effect = /*unresolved*/ anyEffect<function (type parameter) A in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>A, function (type parameter) E in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>E, function (type parameter) R in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>R>): import EffectEffect.type Effect.Effect = /*unresolved*/ anyEffect<function (type parameter) A in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>A, function (type parameter) E in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>E, function (type parameter) R in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>R> => {
if (permits: numberpermits <= 0) {
return effect: Effect.Effect<A, E, R>(parameter) effect: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
effect
}
const const takePermits: Effect.Effect<
void,
never,
never
>
const takePermits: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
takePermits = const take: (
key: K,
permits: number
) => Effect.Effect<void>
take(key: K = unknownkey, permits: numberpermits)
return import EffectEffect.uninterruptibleMask((restore: <AX, EX, RX>(
effect: Effect<AX, EX, RX>
) => Effect<AX, EX, RX>
restore) =>
import EffectEffect.flatMap(
restore: <AX, EX, RX>(
effect: Effect<AX, EX, RX>
) => Effect<AX, EX, RX>
restore(const takePermits: Effect.Effect<
void,
never,
never
>
const takePermits: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
takePermits),
() =>
import EffectEffect.ensuring(
restore: <AX, EX, RX>(
effect: Effect<AX, EX, RX>
) => Effect<AX, EX, RX>
restore(effect: Effect.Effect<A, E, R>(parameter) effect: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
effect),
import EffectEffect.sync(() => {
const releaseUnsafe: (
permits: number
) => number
releaseUnsafe(permits: numberpermits)
})
)
)
)
}
const const tryTake: (
permits: number
) => boolean
tryTake = (permits: numberpermits: number): boolean => {
if (permits: numberpermits <= 0) {
return true
}
if (const maxPermits: numbermaxPermits < permits: numberpermits || let totalPermits: numbertotalPermits < permits: numberpermits) {
return false
}
let totalPermits: numbertotalPermits -= permits: numberpermits
return true
}
return {
[const PartitionedTypeId: PartitionedTypeIdRuntime type identifier used to mark values that implement
PartitionedSemaphore.
Details
This marker is part of the runtime representation of partitioned semaphore
values.
Literal type of the PartitionedSemaphore runtime type identifier.
When to use
Use to type fields that store the exact PartitionedSemaphore runtime marker.
Details
Use this type when declaring fields that must contain the exact
PartitionedTypeId marker value.
PartitionedTypeId]: const PartitionedTypeId: PartitionedTypeIdRuntime type identifier used to mark values that implement
PartitionedSemaphore.
Details
This marker is part of the runtime representation of partitioned semaphore
values.
Literal type of the PartitionedSemaphore runtime type identifier.
When to use
Use to type fields that store the exact PartitionedSemaphore runtime marker.
Details
Use this type when declaring fields that must contain the exact
PartitionedTypeId marker value.
PartitionedTypeId,
PartitionedSemaphore<in K>.capacity: numbercapacity: const maxPermits: numbermaxPermits,
PartitionedSemaphore<in K>.available: Effect.Effect<number, never, never>(property) PartitionedSemaphore<in K>.available: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
available: import EffectEffect.sync(() => let totalPermits: numbertotalPermits),
PartitionedSemaphore<K>.take: (key: K, permits: number) => Effect.Effect<void>take,
PartitionedSemaphore<K>.release: (permits: number) => Effect.Effect<number>release: (permits: numberpermits) => import EffectEffect.sync(() => const releaseUnsafe: (
permits: number
) => number
releaseUnsafe(permits: numberpermits)),
PartitionedSemaphore<K>.withPermits: (key: K, permits: number) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>withPermits,
PartitionedSemaphore<K>.withPermit: (key: K) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>withPermit: (key: K = unknownkey) => const withPermits: (
key: K,
permits: number
) => <A, E, R>(
effect: Effect.Effect<A, E, R>
) => Effect.Effect<A, E, R>
withPermits(key: K = unknownkey, 1),
PartitionedSemaphore<K>.withPermitsIfAvailable: (permits: number) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<Option.Option<A>, E, R>withPermitsIfAvailable:
(permits: numberpermits) => <function (type parameter) A in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<Option.Option<A>, E, R>A, function (type parameter) E in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<Option.Option<A>, E, R>E, function (type parameter) R in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<Option.Option<A>, E, R>R>(effect: Effect.Effect<A, E, R>(parameter) effect: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
effect: import EffectEffect.type Effect.Effect = /*unresolved*/ anyEffect<function (type parameter) A in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<Option.Option<A>, E, R>A, function (type parameter) E in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<Option.Option<A>, E, R>E, function (type parameter) R in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<Option.Option<A>, E, R>R>): import EffectEffect.type Effect.Effect = /*unresolved*/ anyEffect<import OptionOption.type Option.Option = /*unresolved*/ anyOption<function (type parameter) A in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<Option.Option<A>, E, R>A>, function (type parameter) E in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<Option.Option<A>, E, R>E, function (type parameter) R in <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<Option.Option<A>, E, R>R> => {
if (permits: numberpermits <= 0) {
return import EffectEffect.asSome(effect: Effect.Effect<A, E, R>(parameter) effect: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
effect)
}
return import EffectEffect.suspend(() => {
if (!const tryTake: (
permits: number
) => boolean
tryTake(permits: numberpermits)) {
return import EffectEffect.succeed(import OptionOption.none())
}
return import EffectEffect.ensuring(
import EffectEffect.asSome(effect: Effect.Effect<A, E, R>(parameter) effect: {
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
effect),
import EffectEffect.sync(() => {
const releaseUnsafe: (
permits: number
) => number
releaseUnsafe(permits: numberpermits)
})
)
})
}
}
}