/*  Title:      Pure/Tools/print_operation.scala
    Author:     Makarius
Print operations as asynchronous query.
*/
package isabelle
object Print_Operation
{
  def print_operations(session: Session): List[(String, String)] =
    session.get_protocol_handler("isabelle.Print_Operation$Handler") match {
      case Some(handler: Handler) => handler.get
      case _ => Nil
    }
  /* protocol handler */
  class Handler extends Session.Protocol_Handler
  {
    private val print_operations = Synchronized[List[(String, String)]](Nil)
    override def init(session: Session): Unit =
      session.protocol_command(Markup.PRINT_OPERATIONS)
    def get: List[(String, String)] = print_operations.value
    private def put(msg: Prover.Protocol_Output): Boolean =
    {
      val ops =
      {
        import XML.Decode._
        list(pair(string, string))(Symbol.decode_yxml(msg.text))
      }
      print_operations.change(_ => ops)
      true
    }
    val functions = List(Markup.PRINT_OPERATIONS -> put _)
  }
}