Package

zio

stm

Permalink

package stm

Visibility
  1. Public
  2. All

Type Members

  1. final class STM[+E, +A] extends AnyVal

    Permalink

    STM[E, A] represents an effect that can be performed transactionally, resulting in a failure E or a value A.

    STM[E, A] represents an effect that can be performed transactionally, resulting in a failure E or a value A.

    def transfer(receiver: TRef[Int],
                 sender: TRef[Int], much: Int): UIO[Int] =
      STM.atomically {
        for {
          balance <- sender.get
          _       <- STM.check(balance >= much)
          _       <- receiver.update(_ + much)
          _       <- sender.update(_ - much)
          newAmnt <- receiver.get
        } yield newAmnt
      }
    
      val action: UIO[Int] =
        for {
          t <- STM.atomically(TRef.make(0).zip(TRef.make(20000)))
          (receiver, sender) = t
          balance <- transfer(receiver, sender, 1000)
        } yield balance

    Software Transactional Memory is a technique which allows composition of arbitrary atomic operations. It is the software analog of transactions in database systems.

    The API is lifted directly from the Haskell package Control.Concurrent.STM although the implementation does not resemble the Haskell one at all. http://hackage.haskell.org/package/stm-2.5.0.0/docs/Control-Concurrent-STM.html

    STM in Haskell was introduced in: Composable memory transactions, by Tim Harris, Simon Marlow, Simon Peyton Jones, and Maurice Herlihy, in ACM Conference on Principles and Practice of Parallel Programming 2005. https://www.microsoft.com/en-us/research/publication/composable-memory-transactions/

    See also: Lock Free Data Structures using STMs in Haskell, by Anthony Discolo, Tim Harris, Simon Marlow, Simon Peyton Jones, Satnam Singh) FLOPS 2006: Eighth International Symposium on Functional and Logic Programming, Fuji Susono, JAPAN, April 2006 https://www.microsoft.com/en-us/research/publication/lock-free-data-structures-using-stms-in-haskell/

  2. final class TArray[A] extends AnyVal

    Permalink

    Wraps array of TRef and adds methods for convenience.

    Wraps array of TRef and adds methods for convenience. Caution: most of methods are not stack-safe.

  3. final class TPromise[E, A] extends AnyVal

    Permalink
  4. class TQueue[A] extends AnyRef

    Permalink
  5. class TRef[A] extends AnyRef

    Permalink

    A variable that can be modified as part of a transactional effect.

  6. final class TSemaphore extends AnyVal

    Permalink

Value Members

  1. object STM

    Permalink
  2. object TArray

    Permalink
  3. object TPromise

    Permalink
  4. object TQueue

    Permalink
  5. object TRef

    Permalink
  6. object TSemaphore

    Permalink

Ungrouped