///|
/// 示例 2:M/M/1 排队系统
///
/// 单服务台排队模型:顾客按间隔到达,服务台逐一服务。
/// 使用 Process 层创建到达进程和服务进程,统计系统指标。
fn main {
  let env = @core.new_env(until=100.0)
  let mut served : Int = 0
  let mut queue_len : Int = 0
  let mut max_queue : Int = 0
  let server = @resource.new_exclusive(name="server")
  ignore(
    @process.process(env, name="arrival", behavior=fn(p) {
      queue_len = queue_len + 1
      if queue_len > max_queue {
        max_queue = queue_len
      }
      ignore(
        server.request(pid=p.id(), callback=fn() {
          queue_len = queue_len - 1
          served = served + 1
          server.release()
        }),
      )
      @process.Timeout(duration=10.0, next=fn() {
        queue_len = queue_len + 1
        if queue_len > max_queue {
          max_queue = queue_len
        }
        ignore(
          server.request(pid=p.id(), callback=fn() {
            queue_len = queue_len - 1
            served = served + 1
            server.release()
          }),
        )
        @process.Done
      })
    }),
  )
  env.run()
  println("=== M/M/1 排队系统仿真结果 ===")
  println("仿真时长: \{env.now()}")
  println("已服务顾客数: \{served}")
  println("最大排队长度: \{max_queue}")
}