如何实施" archivable"采集?

时间:2015-01-12 21:00:51

标签: scala data-structures collections

我想在Scala中使用以下规范实现元素集合:

  • 每个项目都有唯一标识符(UUID)
  • 收集包含一个"活跃" part(表现得像Set[A])和"存档" part(a Set[UUID]
  • 元素已归档"基于函数archivable: A => Boolean
  • "存档"元素从" active"中删除部分标识符放入"存档"部分
  • 归档开销应该是常数或摊销(日志很好,但不是线性的)
  • 集合无法实例化为无效状态,即应该归档的元素处于活动状态,但是在有限的时间段内它可能处于无效状态(如果需要交换正确性)用于管理费用)
  • 尽可能少的代码和样板

只要活动元素在更新之前无法存档,这是一个相对较好的暂定实现。

class ItemsCollection[A](archivable: A => Boolean)(private val _active: Map[UUID, A], private val _archived: Set[UUID]) {
  private def this(items: Iterable[A] = Seq.empty[A]) = this(items filterNot archiveable map (t => (t.id -> t)) toMap, items filter archiveable map (_.id) toSet)

  def active = _active.values
  def archived = _archived

  def +(item: A): ItemsCollection =
    if(archivable(item)) {
      new ItemsCollection(_active - item.id, _archived + item.id)
    } else {
      new ItemsCollection(_active + (item.id -> item), _archived)
  }
}

适用于:

def archivedByPriority(item: A): Boolean = item.priority == Low

不会合作:

def archivedByTimestamp(item: A): Boolean = item.timestamp + 1.hour < DateTime.now()

我也非常乐意接受有关这是否是实现此类集合的正确方法的反馈,以及在Scala中是否有更为惯用的方法。

0 个答案:

没有答案