5 */ |
5 */ |
6 |
6 |
7 package isabelle |
7 package isabelle |
8 |
8 |
9 |
9 |
10 object Logger |
10 object Logger { |
11 { |
|
12 def make(log_file: Option[Path]): Logger = |
11 def make(log_file: Option[Path]): Logger = |
13 log_file match { case Some(file) => new File_Logger(file) case None => No_Logger } |
12 log_file match { case Some(file) => new File_Logger(file) case None => No_Logger } |
14 |
13 |
15 def make(progress: Progress): Logger = |
14 def make(progress: Progress): Logger = |
16 new Logger { def apply(msg: => String): Unit = progress.echo(msg) } |
15 new Logger { def apply(msg: => String): Unit = progress.echo(msg) } |
17 } |
16 } |
18 |
17 |
19 trait Logger |
18 trait Logger { |
20 { |
|
21 def apply(msg: => String): Unit |
19 def apply(msg: => String): Unit |
22 |
20 |
23 def timeit[A](message: String = "", enabled: Boolean = true)(e: => A): A = |
21 def timeit[A](message: String = "", enabled: Boolean = true)(e: => A): A = |
24 Timing.timeit(message, enabled, apply(_))(e) |
22 Timing.timeit(message, enabled, apply(_))(e) |
25 } |
23 } |
26 |
24 |
27 object No_Logger extends Logger |
25 object No_Logger extends Logger { |
28 { |
|
29 def apply(msg: => String): Unit = {} |
26 def apply(msg: => String): Unit = {} |
30 } |
27 } |
31 |
28 |
32 class File_Logger(path: Path) extends Logger |
29 class File_Logger(path: Path) extends Logger { |
33 { |
|
34 def apply(msg: => String): Unit = synchronized { File.append(path, msg + "\n") } |
30 def apply(msg: => String): Unit = synchronized { File.append(path, msg + "\n") } |
35 |
31 |
36 override def toString: String = path.toString |
32 override def toString: String = path.toString |
37 } |
33 } |