fork download
  1. import scala.xml
  2.  
  3. case class NodeID(id: Long)
  4.  
  5. def id: NodeID
  6. def title: String
  7. }
  8.  
  9. case class HTMLNode(id: NodeID, title: String, body: xml.Elem) extends Node
  10. case class PortalNode(id: NodeID, title: String, links: Seq[NodeID]) extends Node
  11.  
  12. ////////////////////////////////////////////////////////////////////////////////
  13.  
  14. trait HTMLRenderer[N <: Node] { this: N =>
  15. def asHTML: xml.Elem
  16. }
  17.  
  18. trait HTMLNodeHTMLRenderer extends HTMLRenderer[HTMLNode] { this: HTMLNode =>
  19. override def asHTML = body
  20. }
  21.  
  22. trait PortalNodeHTMLRenderer extends HTMLRenderer[PortalNode] { this: PortalNode =>
  23. override def asHTML = <ul>{for (link <- links) yield <li>{link}</li>}</ul>
  24. }
  25.  
  26. ////////////////////////////////////////////////////////////////////////////////
  27.  
  28. object Main extends App {
  29. val htmlNode = new HTMLNode(NodeID(1), "Hello, world!", <strong>Woo!</strong>) with HTMLNodeHTMLRenderer
  30. println(htmlNode.asHTML)
  31.  
  32. val portalNode = new PortalNode(NodeID(1), "Hello!", Seq(NodeID(2), NodeID(3))) with PortalNodeHTMLRenderer
  33. println(portalNode.asHTML)
  34. }
  35.  
Success #stdin #stdout 0.4s 382080KB
stdin
Standard input is empty
stdout
<strong>Woo!</strong>
<ul><li>NodeID(2)</li><li>NodeID(3)</li></ul>