283 case List(x) => x |
283 case List(x) => x |
284 case _ => error(message) |
284 case _ => error(message) |
285 } |
285 } |
286 |
286 |
287 |
287 |
288 /* data update */ |
|
289 |
|
290 object Update { |
|
291 sealed abstract class Op[A] |
|
292 case class Delete[A](name: String) extends Op[A] |
|
293 case class Insert[A](item: A) extends Op[A] |
|
294 |
|
295 def data[A <: Name.T](old_data: Name.Data[A], updates: List[Op[A]]): Name.Data[A] = |
|
296 updates.foldLeft(old_data) { |
|
297 case (map, Delete(name)) => map - name |
|
298 case (map, Insert(item)) => map + (item.name -> item) |
|
299 } |
|
300 |
|
301 val empty: Update = Update() |
|
302 |
|
303 def make[A](a: Name.Data[A], b: Name.Data[A], kind: Int = 0): Update = |
|
304 if (a eq b) empty |
|
305 else { |
|
306 val delete = List.from(for ((x, y) <- a.iterator if !b.get(x).contains(y)) yield x) |
|
307 val insert = List.from(for ((x, y) <- b.iterator if !a.get(x).contains(y)) yield x) |
|
308 Update(delete = delete, insert = insert, kind = kind) |
|
309 } |
|
310 } |
|
311 |
|
312 sealed case class Update( |
|
313 delete: List[String] = Nil, |
|
314 insert: List[String] = Nil, |
|
315 kind: Int = 0 |
|
316 ) { |
|
317 def deletes: Boolean = delete.nonEmpty |
|
318 def inserts: Boolean = insert.nonEmpty |
|
319 def defined: Boolean = deletes || inserts |
|
320 lazy val domain: Set[String] = delete.toSet ++ insert |
|
321 } |
|
322 |
|
323 |
|
324 /* proper values */ |
288 /* proper values */ |
325 |
289 |
326 def proper_bool(b: Boolean): Option[Boolean] = |
290 def proper_bool(b: Boolean): Option[Boolean] = |
327 if (!b) None else Some(b) |
291 if (!b) None else Some(b) |
328 |
292 |