From 60bc28829bed07dbaf858fbd2934e91fb75b885d Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Fri, 11 Mar 2016 17:18:57 +0000 Subject: [PATCH] Add Append & Remove instances for Option --- main/settings/src/main/scala/sbt/Append.scala | 5 +++ main/settings/src/main/scala/sbt/Remove.scala | 5 +++ sbt/src/sbt-test/project/append/build.sbt | 33 +++++++++++++++++++ sbt/src/sbt-test/project/append/test | 1 + sbt/src/sbt-test/project/remove/build.sbt | 12 +++++-- 5 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 sbt/src/sbt-test/project/append/build.sbt create mode 100644 sbt/src/sbt-test/project/append/test diff --git a/main/settings/src/main/scala/sbt/Append.scala b/main/settings/src/main/scala/sbt/Append.scala index b558aab02..c2716d703 100644 --- a/main/settings/src/main/scala/sbt/Append.scala +++ b/main/settings/src/main/scala/sbt/Append.scala @@ -56,4 +56,9 @@ object Append { def appendValues(a: Map[A, B], b: Map[X, Y]): Map[A, B] = a ++ b def appendValue(a: Map[A, B], b: (X, Y)): Map[A, B] = a + b } + implicit def appendOption[T]: Sequence[Seq[T], Option[T], Option[T]] = + new Sequence[Seq[T], Option[T], Option[T]] { + def appendValue(a: Seq[T], b: Option[T]): Seq[T] = b.fold(a)(a :+ _) + def appendValues(a: Seq[T], b: Option[T]): Seq[T] = b.fold(a)(a :+ _) + } } diff --git a/main/settings/src/main/scala/sbt/Remove.scala b/main/settings/src/main/scala/sbt/Remove.scala index 50c97ee88..ac33e0b67 100644 --- a/main/settings/src/main/scala/sbt/Remove.scala +++ b/main/settings/src/main/scala/sbt/Remove.scala @@ -17,4 +17,9 @@ object Remove { def removeValue(a: Seq[T], b: V): Seq[T] = a filterNot b.== def removeValues(a: Seq[T], b: Seq[V]): Seq[T] = a diff b } + implicit def removeOption[T]: Sequence[Seq[T], Option[T], Option[T]] = + new Sequence[Seq[T], Option[T], Option[T]] { + def removeValue(a: Seq[T], b: Option[T]): Seq[T] = b.fold(a)(a filterNot _.==) + def removeValues(a: Seq[T], b: Option[T]): Seq[T] = b.fold(a)(a filterNot _.==) + } } diff --git a/sbt/src/sbt-test/project/append/build.sbt b/sbt/src/sbt-test/project/append/build.sbt new file mode 100644 index 000000000..d48fdd77c --- /dev/null +++ b/sbt/src/sbt-test/project/append/build.sbt @@ -0,0 +1,33 @@ +val intsTask = taskKey[Seq[Int]]("A seq of ints task") +val intsSetting = settingKey[Seq[Int]]("A seq of ints setting") +val intsFromScalaV = settingKey[Seq[Int]]("a seq of ints from scalaVersion") + +scalaVersion := "2.11.6" + +intsTask := Nil +intsTask += 3 +intsTask ++= Seq(1, 2) +intsTask += Option(6) +intsTask ++= Option(7) + +intsSetting := Nil +intsSetting += 3 +intsSetting ++= Seq(1, 2) +intsSetting += Option(6) +intsSetting ++= Option(7) + +intsFromScalaV := Nil +intsFromScalaV += { if (scalaVersion.value == "2.11.6") 3 else 5 } +intsFromScalaV ++= { if (scalaVersion.value == "2.11.6") Seq(1, 2) else Seq(4) } +intsFromScalaV += { if (scalaVersion.value == "2.11.6") Option(6) else None } +intsFromScalaV ++= { if (scalaVersion.value == "2.11.6") Option(7) else None } + +val check = taskKey[Unit]("Runs the check") +check := { + assertEquals("intsTask", intsTask.value, Seq(3, 1, 2, 6, 7)) + assertEquals("intsSetting", intsSetting.value, Seq(3, 1, 2, 6, 7)) + assertEquals("intsFromScalaV", intsFromScalaV.value, Seq(3, 1, 2, 6, 7)) +} + +def assertEquals[T](label: String, actual: T, expect: T) = + assert(actual == expect, s"$label should be $expect but is $actual") diff --git a/sbt/src/sbt-test/project/append/test b/sbt/src/sbt-test/project/append/test new file mode 100644 index 000000000..15675b169 --- /dev/null +++ b/sbt/src/sbt-test/project/append/test @@ -0,0 +1 @@ +> check diff --git a/sbt/src/sbt-test/project/remove/build.sbt b/sbt/src/sbt-test/project/remove/build.sbt index 0b967394c..d3ae2985d 100644 --- a/sbt/src/sbt-test/project/remove/build.sbt +++ b/sbt/src/sbt-test/project/remove/build.sbt @@ -4,17 +4,23 @@ val intsFromScalaV = settingKey[Seq[Int]]("a seq of ints from scalaVersion") scalaVersion := "2.11.6" -intsTask := Seq(1, 2, 3, 4, 5) +intsTask := Seq(1, 2, 3, 4, 5, 6, 7) intsTask -= 3 intsTask --= Seq(1, 2) +intsTask -= Option(6) +intsTask --= Option(7) -intsSetting := Seq(1, 2, 3, 4, 5) +intsSetting := Seq(1, 2, 3, 4, 5, 6, 7) intsSetting -= 3 intsSetting --= Seq(1, 2) +intsSetting -= Option(6) +intsSetting --= Option(7) -intsFromScalaV := Seq(1, 2, 3, 4, 5) +intsFromScalaV := Seq(1, 2, 3, 4, 5, 6, 7) intsFromScalaV -= { if (scalaVersion.value == "2.11.6") 3 else 5 } intsFromScalaV --= { if (scalaVersion.value == "2.11.6") Seq(1, 2) else Seq(4) } +intsFromScalaV -= { if (scalaVersion.value == "2.11.6") Option(6) else None } +intsFromScalaV --= { if (scalaVersion.value == "2.11.6") Option(7) else None } val check = taskKey[Unit]("Runs the check") check := {