clarified signature: prefer explicit combinator;
authorwenzelm
Fri, 23 Jun 2023 14:43:15 +0200
changeset 78198 c268def0784b
parent 78197 7ba63bd216af
child 78199 d6e6618db929
child 78200 264f2b69d09c
child 78203 928ef137758c
clarified signature: prefer explicit combinator;
src/Pure/ROOT.scala
src/Pure/Thy/store.scala
src/Pure/Tools/build_job.scala
src/Pure/Tools/build_process.scala
src/Pure/library.scala
--- a/src/Pure/ROOT.scala	Fri Jun 23 13:51:23 2023 +0200
+++ b/src/Pure/ROOT.scala	Fri Jun 23 14:43:15 2023 +0200
@@ -13,6 +13,8 @@
     Library.using(a)(f)
   def using_option[A <: AutoCloseable, B](opt: Option[A])(f: A => B): Option[B] =
     Library.using_option(opt)(f)
+  def using_optional[A <: AutoCloseable, B](opt: Option[A])(f: Option[A] => B): B =
+    Library.using_optional(opt)(f)
 
   val space_explode = Library.space_explode _
   val split_lines = Library.split_lines _
--- a/src/Pure/Thy/store.scala	Fri Jun 23 13:51:23 2023 +0200
+++ b/src/Pure/Thy/store.scala	Fri Jun 23 14:43:15 2023 +0200
@@ -316,8 +316,8 @@
         path = dir + file if path.is_file
       } yield path.file.delete
 
-    for (db <- maybe_open_heaps_database()) {
-      using(db)(ML_Heap.clean_entry(_, name))
+    using_optional(maybe_open_heaps_database()) { database =>
+      database.foreach(ML_Heap.clean_entry(_, name))
     }
 
     if (init) {
--- a/src/Pure/Tools/build_job.scala	Fri Jun 23 13:51:23 2023 +0200
+++ b/src/Pure/Tools/build_job.scala	Fri Jun 23 14:43:15 2023 +0200
@@ -453,11 +453,8 @@
           val heap = store.output_heap(session_name)
           if (process_result.ok && store_heap && heap.is_file) {
             val slice = Space.MiB(options.real("build_database_slice")).bytes
-            val digest = {
-              val database = store.maybe_open_heaps_database()
-              try { ML_Heap.store(database, heap, slice = slice) }
-              finally { database.foreach(_.close()) }
-            }
+            val digest =
+              using_optional(store.maybe_open_heaps_database())(ML_Heap.store(_, heap, slice))
             SHA1.shasum(digest, session_name)
           }
           else SHA1.no_shasum
--- a/src/Pure/Tools/build_process.scala	Fri Jun 23 13:51:23 2023 +0200
+++ b/src/Pure/Tools/build_process.scala	Fri Jun 23 14:43:15 2023 +0200
@@ -906,13 +906,10 @@
     val cancelled = progress.stopped || !ancestor_results.forall(_.ok)
 
     if (!skipped && !cancelled) {
-      val database = store.maybe_open_heaps_database()
-      try {
-        for (db <- database) {
-          ML_Heap.restore(db, store.output_heap(session_name), cache = store.cache.compress)
-        }
+      using_optional(store.maybe_open_heaps_database()) { database =>
+        database.foreach(
+          ML_Heap.restore(_, store.output_heap(session_name), cache = store.cache.compress))
       }
-      finally { database.foreach(_.close()) }
     }
 
     val result_name = (session_name, worker_uuid, build_uuid)
--- a/src/Pure/library.scala	Fri Jun 23 13:51:23 2023 +0200
+++ b/src/Pure/library.scala	Fri Jun 23 14:43:15 2023 +0200
@@ -23,6 +23,16 @@
   def using_option[A <: AutoCloseable, B](opt: Option[A])(f: A => B): Option[B] =
     opt.map(a => using(a)(f))
 
+  def using_optional[A <: AutoCloseable, B](opt: Option[A])(f: Option[A] => B): B = {
+    try { f(opt) }
+    finally {
+      opt match {
+        case Some(a) if a != null => a.close()
+        case _ =>
+      }
+    }
+  }
+
 
   /* integers */