src/Pure/library.scala
changeset 80274 cff00b3dddf5
parent 80272 9f89b3c41460
child 80440 dfadcfdf8dad
equal deleted inserted replaced
80273:f55a11cd3b71 80274:cff00b3dddf5
   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