aboutsummaryrefslogtreecommitdiff
path: root/library/src
diff options
context:
space:
mode:
authorFelix Mulder <felix.mulder@gmail.com>2016-11-30 14:21:51 +0100
committerFelix Mulder <felix.mulder@gmail.com>2016-11-30 16:55:59 +0100
commit5c607cd402001b57721afef8153d9bec5e68c933 (patch)
tree9965e195914374899c523c9b375a374804bfd52f /library/src
parent3f7614ae60263c937f7b2d97f45ef6e7c803ec01 (diff)
downloaddotty-5c607cd402001b57721afef8153d9bec5e68c933.tar.gz
dotty-5c607cd402001b57721afef8153d9bec5e68c933.tar.bz2
dotty-5c607cd402001b57721afef8153d9bec5e68c933.zip
Add basic Show capability
Diffstat (limited to 'library/src')
-rw-r--r--library/src/dotty/Show.scala88
1 files changed, 88 insertions, 0 deletions
diff --git a/library/src/dotty/Show.scala b/library/src/dotty/Show.scala
new file mode 100644
index 000000000..123fffdc7
--- /dev/null
+++ b/library/src/dotty/Show.scala
@@ -0,0 +1,88 @@
+package dotty
+
+import scala.annotation.implicitNotFound
+
+@implicitNotFound("No member of type class Show could be found for ${T}")
+trait Show[-T] {
+ def show(t: T): String
+}
+
+object Show {
+ implicit class ShowValue[V](val v: V) extends AnyVal {
+ def show(implicit ev: Show[V] = null): String =
+ if (ev != null) ev.show(v)
+ else v.toString
+ }
+
+ implicit val stringShow = new Show[String] {
+ //charEscapeSeq ::= ‘\‘ (‘b‘ | ‘t‘ | ‘n‘ | ‘f‘ | ‘r‘ | ‘"‘ | ‘'‘ | ‘\‘)
+ def show(str: String) =
+ "\"" +
+ str
+ .replaceAll("\b", "\\\\b")
+ .replaceAll("\t", "\\\\t")
+ .replaceAll("\n", "\\\\n")
+ .replaceAll("\f", "\\\\f")
+ .replaceAll("\r", "\\\\r")
+ .replaceAll("\'", "\\\\'")
+ .replaceAll("\"", "\\\\\"") +
+ "\""
+ }
+
+ implicit val intShow = new Show[Int] {
+ def show(i: Int) = i.toString
+ }
+
+ implicit val floatShow = new Show[Float] {
+ def show(f: Float) = f + "f"
+ }
+
+ implicit val doubleShow = new Show[Double] {
+ def show(d: Double) = d.toString
+ }
+
+ implicit val charShow = new Show[Char] {
+ def show(c: Char) = "'" + (c match {
+ case '\b' => "\\b"
+ case '\t' => "\\t"
+ case '\n' => "\\n"
+ case '\f' => "\\f"
+ case '\r' => "\\r"
+ case '\'' => "\\'"
+ case '\"' => "\\\""
+ case c => c
+ }) + "'"
+ }
+
+ object List {
+ implicit def showList[T](implicit st: Show[T]) = new Show[List[T]] {
+ def show(xs: List[T]) =
+ if (xs.isEmpty) "Nil"
+ else "List(" + xs.map(_.show).mkString(", ") + ")"
+ }
+
+ implicit val showNil = new Show[List[Nothing]] {
+ def show(xs: List[Nothing]) = "Nil"
+ }
+ }
+
+ object Option {
+ implicit def showOption[T](implicit st: Show[T]) = new Show[Option[T]] {
+ def show(ot: Option[T]): String = ot match {
+ case Some(t) => "Some("+ st.show(t) + ")"
+ case none => "None"
+ }
+ }
+
+ implicit val showNone = new Show[Option[Nothing]] {
+ def show(n: Option[Nothing]) = "None"
+ }
+ }
+
+ object Map {
+ implicit def showMap[K, V](implicit sk: Show[K], sv: Show[V]) = new Show[Map[K, V]] {
+ def show(m: Map[K, V]) =
+ "Map(" + m.map { case (k, v) => sk.show(k) + " -> " + sv.show(v) } .mkString (", ") + ")"
+ }
+ }
+}