fork download
  1. import scala.collection.mutable
  2.  
  3. class Index[K, V](fn: V => K) {
  4. private val elements = new mutable.HashMap[K, mutable.Set[V]] with mutable.MultiMap[K, V]
  5.  
  6. def +=(element: V) = {
  7. val key = fn(element)
  8. elements.addBinding(key, element)
  9. }
  10.  
  11. def -=(element: V) = {
  12. val key = fn(element)
  13. elements.removeBinding(key, element)
  14. }
  15.  
  16. def get(key: K): Set[V] =
  17. elements.get(key).map(_.toSet) getOrElse Set.empty
  18. }
  19.  
  20. trait IndexedSet[V] extends mutable.Set[V] {
  21. private val indices = mutable.ListBuffer.empty[Index[_, V]]
  22.  
  23. def addIndex[K](fn: V => K): Index[K, V] = {
  24. val index = new Index(fn)
  25. for (elem <- this) {
  26. index += elem
  27. }
  28. indices += index
  29. index
  30. }
  31.  
  32. abstract override def +=(elem: V) = {
  33. for (index <- indices) {
  34. index += elem
  35. }
  36. super.+=(elem)
  37. }
  38.  
  39. abstract override def -=(elem: V) = {
  40. for (index <- indices) {
  41. index -= elem
  42. }
  43. super.-=(elem)
  44. }
  45. }
  46.  
  47. object Main extends App {
  48. val set = new mutable.HashSet[Int] with IndexedSet[Int]
  49. val index = set.addIndex(_ % 2 == 0)
  50. for (i <- 1 to 20) {
  51. set += i
  52. }
  53. println(index.get(true))
  54. println(index.get(false))
  55. }
Success #stdin #stdout 0.42s 322240KB
stdin
Standard input is empty
stdout
Set(10, 14, 20, 6, 2, 12, 18, 16, 8, 4)
Set(5, 1, 9, 13, 17, 7, 3, 11, 19, 15)