All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scalaz.concurrent.Chan.scala Maven / Gradle / Ivy

The newest version!
package org.specs2.internal.scalaz
package concurrent

import MVar._
import effect.IO

sealed trait Chan[A] {
  def read: IO[A]
  def write(a: A): IO[Unit]
}

object Chan {
  private[concurrent] type ChStream[A] = MVar[ChItem[A]]

  def newChan[A]: IO[Chan[A]] =
    for {
      hole     <- newEmptyMVar[ChItem[A]]
      readVar  <- newMVar(hole)
      writeVar <- newMVar(hole)
    } yield new ChanImpl[A](readVar, writeVar)
}

import Chan._
private[this] case class ChItem[A](a: A, end: ChStream[A])
private[this] class ChanImpl[A](readVar: MVar[ChStream[A]], writeVar: MVar[ChStream[A]]) extends Chan[A] {
  def read = 
    readVar.modify(readEnd => 
      for {
        item <- readEnd.read
      } yield (item.end, item.a))

  def write(a: A) = 
    for {
      newHole <- newEmptyMVar[ChItem[A]]
      _       <- 
        for {
          oldHole <- writeVar.take
          _       <- oldHole.put(ChItem(a, newHole))
          _       <- writeVar.put(newHole)
        } yield ()
    } yield ()
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy