///|
/// 剪切环(环形缓冲区)
pub struct KillRing {
  items : Array[String]
  mut current_index : Int
  max_size : Int
}

///|
pub fn KillRing::new(max_size? : Int = 20) -> KillRing {
  { items: [], current_index: -1, max_size }
}

///|
/// 添加文本到剪切环
pub fn KillRing::add(self : KillRing, text : String) -> Unit {
  if text == "" {
    return
  }
  // 如果与上一个相同,通常不重复添加
  if self.items.length() > 0 && self.items[0] == text {
    return
  }
  self.items.insert(0, text)
  if self.items.length() > self.max_size {
    ignore(self.items.pop())
  }
  self.current_index = 0
}

///|
/// 获取最近的文本
pub fn KillRing::yank(self : KillRing) -> String? {
  match self.items {
    [] => None
    [head, ..] => {
      self.current_index = 0
      Some(head)
    }
  }
}

///|
/// 循环切换
pub fn KillRing::yank_pop(self : KillRing) -> String? {
  if self.items.length() <= 1 {
    None
  } else {
    self.current_index = (self.current_index + 1) % self.items.length()
    Some(self.items[self.current_index])
  }
}