Hyperlinkv0.8.0-beta.28

TxReentrantLock

TxReentrantLock.releaseWriteconsteffect/TxReentrantLock.ts:306
(self: TxReentrantLock): Effect.Effect<number>

Releases one write lock held by the current fiber.

When to use

Use to leave a manually acquired write lock.

Details

Returns the remaining number of write locks held by this fiber.

Example (Releasing a write lock)

import { Effect, TxReentrantLock } from "effect"

const program = Effect.gen(function*() {
  const lock = yield* TxReentrantLock.make()
  yield* TxReentrantLock.acquireWrite(lock)
  const remaining = yield* TxReentrantLock.releaseWrite(lock)
  console.log(remaining) // 0
})
mutations
export const releaseWrite = (self: TxReentrantLock): Effect.Effect<number> =>
  Effect.withFiber((fiber) =>
    Effect.gen(function*() {
      const state = yield* TxRef.get(self.stateRef)
      const fiberId = fiber.id

      if (Option.isNone(state.writer) || state.writer.value[0] !== fiberId) return 0

      const newCount = state.writer.value[1] - 1
      const newWriter = newCount <= 0
        ? Option.none<readonly [number, number]>()
        : Option.some([fiberId, newCount] as const)

      yield* TxRef.set(self.stateRef, { ...state, writer: newWriter })
      return newCount
    }).pipe(Effect.tx)
  )
Referenced by 2 symbols