src/Pure/Concurrent/par_list.scala
changeset 75393 87ebf5a50283
parent 73512 e52a9b208481
child 76537 cdbe20024038
equal deleted inserted replaced
75388:b3ca4a6ed74b 75393:87ebf5a50283
     6 
     6 
     7 
     7 
     8 package isabelle
     8 package isabelle
     9 
     9 
    10 
    10 
    11 object Par_List
    11 object Par_List {
    12 {
    12   def managed_results[A, B](
    13   def managed_results[A, B](f: A => B, xs: List[A], sequential: Boolean = false)
    13     f: A => B,
    14       : List[Exn.Result[B]] =
    14     xs: List[A],
    15   {
    15     sequential: Boolean = false
       
    16   ) : List[Exn.Result[B]] = {
    16     if (sequential || xs.isEmpty || xs.tail.isEmpty) xs.map(x => Exn.capture { f(x) })
    17     if (sequential || xs.isEmpty || xs.tail.isEmpty) xs.map(x => Exn.capture { f(x) })
    17     else {
    18     else {
    18       val state = Synchronized[(List[Future[B]], Boolean)]((Nil, false))
    19       val state = Synchronized[(List[Future[B]], Boolean)]((Nil, false))
    19 
    20 
    20       def cancel_other(self: Int = -1): Unit =
    21       def cancel_other(self: Int = -1): Unit =
    44   }
    45   }
    45 
    46 
    46   def map[A, B](f: A => B, xs: List[A], sequential: Boolean = false): List[B] =
    47   def map[A, B](f: A => B, xs: List[A], sequential: Boolean = false): List[B] =
    47     Exn.release_first(managed_results(f, xs, sequential = sequential))
    48     Exn.release_first(managed_results(f, xs, sequential = sequential))
    48 
    49 
    49   def get_some[A, B](f: A => Option[B], xs: List[A]): Option[B] =
    50   def get_some[A, B](f: A => Option[B], xs: List[A]): Option[B] = {
    50   {
       
    51     class Found(val res: B) extends Exception
    51     class Found(val res: B) extends Exception
    52     val results =
    52     val results =
    53       managed_results(
    53       managed_results(
    54         (x: A) => f(x) match { case None => () case Some(y) => throw new Found(y) }, xs)
    54         (x: A) => f(x) match { case None => () case Some(y) => throw new Found(y) }, xs)
    55     results.collectFirst({ case Exn.Exn(found: Found) => found.res }) match {
    55     results.collectFirst({ case Exn.Exn(found: Found) => found.res }) match {