一次性隐式转换GenTraversableOnce和Option

时间:2014-06-04 14:33:20

标签: scala playframework-2.0 implicit-conversion

我正在开设一个包含HTML正文内容,<head>内容和结尾内容的课程。我希望能够轻松地将后两个表单前置并附加到文档生成时,由trait Resource推广。

现在,代码类似于此问题底部的代码,我可以multipartHtml :+ resourcemultipartHtml ++ optionResourcemultipartHtml ++ resourcesresource +: multipartHtml(对于您可能的类型)推断。我已将以下内容添加到MultipartHtml伴侣对象中,可以resources ++ multipartHtml

implicit class RichResources(resources: GenTraversableOnce[Resource]) {
  def ++(that: MultipartHtml): MultipartHtml = resources.foldRight(that)(_ +: _)
}

但这不会让我optionResource ++ multipartHtml,因为Option不是GenTraversableOnce

除了重复Option的内容之外,是否有更好的方法可以一次性捕获OptionGenTraversableOnce次转换?我尝试了implicit class RichResources[T <% GenTraversableOnce](resources: T[Resource])implicit class RichResources[T[_] <% GenTraversableOnce[_](resources: T[Resource]),没有运气。如果还有其他方法,除了implicit class之外,我还会接触其他方法来完成此结果。

以下是更多上下文代码:

import play.api.templates.Html

case class MultipartHtml(bodyMarkup: Html, headTags: Seq[String], footerTags: Seq[String]) {
  import MultipartHtml._

  def ++(resources: GenTraversableOnce[Resource]): MultipartHtml = resources.foldLeft(this)(_ :+ _)

  def :+(resource: Resource): MultipartHtml = resource match {
    case s: HeadTag => MultipartHtml(bodyMarkup, (headTags :+ s.toString).distinct, footerTags)
    case s: ScriptTag => MultipartHtml(bodyMarkup, headTags, (footerTags :+ s.toString).distinct)
    case _ => this
  }

  def +:(resource: Resource): MultipartHtml = resource match {
    case s: HeadTag => MultipartHtml(bodyMarkup, (s.toString +: headTags).distinct, footerTags)
    case s: ScriptTag => MultipartHtml(bodyMarkup, headTags, (s.toString +: footerTags).distinct)
    case _ => this
  }

}

object MultipartHtml {
  /** A resource that can be imported in the HTML head or footer*/
  trait Resource

  // ... case classes implementing Resource
}

0 个答案:

没有答案