summaryrefslogblamecommitdiff
path: root/src/library/scala/Responder.scala
blob: eb8260dc9ab81fda7b16a3c114b6f807485217b1 (plain) (tree)
1
2
3
4
5
6
7
8
9

                                                                          
                                                                          
                                                                          



                                                                          
 

             

                                                             
                          


                      
                        
              
   
                                                    

                  
                                                                          
     

                                            

   

                                                                
     
                                                
 
                                                     
    

                                            
                                    

          
 
                                                       
                                      
 
                                                                           
                                                           
                     

 
                                                                    



                                                                     
  
                          

                      
              
   
                                                   
                                                   
 
                                 
 
                                          
 

                                            
                                          
     

   

                                                           
                                                  
     

   

                                                  
                                                         
     
   

                                     
 
/*                     __                                               *\
**     ________ ___   / /  ___     Scala API                            **
**    / __/ __// _ | / /  / _ |    (c) 2005-2013, LAMP/EPFL             **
**  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **
** /____/\___/_/ |_/____/_/ | |                                         **
**                          |/                                          **
\*                                                                      */


package scala

/** This object contains utility methods to build responders.
 *
 *  @author Martin Odersky
 *  @author Burak Emir
 *  @version 1.0
 *
 *  @see class Responder
 *  @since 2.1
 */
@deprecated("this object will be removed", "2.11.0")
object Responder {

  /** Creates a responder that answer continuations with the constant `a`.
   */
  def constant[A](x: A) = new Responder[A] {
    def respond(k: A => Unit) = k(x)
  }

  /** Executes `x` and returns `'''true'''`, useful as syntactic
   *  convenience in for comprehensions.
   */
  def exec[A](x: => Unit): Boolean = { x; true }

  /** Runs a responder, returning an optional result.
  */
  def run[A](r: Responder[A]): Option[A] = {
    var result: Option[A] = None
    r.foreach(x => result = Some(x))
    result
  }

  def loop[A](r: Responder[Unit]): Responder[Nothing] =
    for (_ <- r; y <- loop(r)) yield y

  def loopWhile[A](cond: => Boolean)(r: Responder[Unit]): Responder[Unit] =
    if (cond) for (_ <- r; y <- loopWhile(cond)(r)) yield y
    else constant(())
}

/** Instances of responder are the building blocks of small programs
 *  written in continuation passing style. By using responder classes
 *  in for comprehensions, one can embed domain-specific languages in
 *  Scala while giving the impression that programs in these DSLs are
 *  written in direct style.
 *
 *  @author Martin Odersky
 *  @author Burak Emir
 *  @version 1.0
 *  @since 2.1
 */
@deprecated("this class will be removed", "2.11.0")
abstract class Responder[+A] extends Serializable {

  def respond(k: A => Unit): Unit

  def foreach(k: A => Unit) { respond(k) }

  def map[B](f: A => B) = new Responder[B] {
    def respond(k: B => Unit) {
      Responder.this.respond(x => k(f(x)))
    }
  }

  def flatMap[B](f: A => Responder[B]) = new Responder[B] {
    def respond(k: B => Unit) {
      Responder.this.respond(x => f(x).respond(k))
    }
  }

  def filter(p: A => Boolean) = new Responder[A] {
    def respond(k: A => Unit) {
      Responder.this.respond(x => if (p(x)) k(x) else ())
    }
  }

  override def toString = "Responder"
}