equal
deleted
inserted
replaced
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 { |