All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scalaz.xml.QName.scala Maven / Gradle / Ivy

There is a newer version: 7.1.17
Show newest version
package scalaz
package xml


sealed trait QName {
  import QName._

  /// qName
  val name: Str
  /// qURI
  val uri: Option[Str]
  /// qPrefix
  val prefix: Option[Str]

  import CData._

  def sname: String =
    name.mkString

  def setName(a: Str): QName =
    qname(a, uri, prefix)

  def withName(a: Str => Str): QName =
    qname(a(name), uri, prefix)

  def setUri(s: Str): QName =
    qname(name, Some(s), prefix)

  def setNoUri: QName =
    qname(name, None, prefix)

  def withUri(a: Str => Str): QName =
    qname(name, uri map a, prefix)

  def uriOr(u: => Str): Str =
    uri getOrElse u

  def hasUri: Boolean =
    uri.isDefined

  def prefixOr(p: => Str): Str =
    prefix getOrElse p

  def hasPrefix: Boolean =
    prefix.isDefined

  def setPrefix(p: Str): QName =
    qname(name, uri, Some(p))

  def setNoPrefix: QName =
    qname(name, uri, None)

  def withPrefix(a: Str => Str): QName =
    qname(name, uri, prefix map a)

  /// findChildren
  def findChildren(e: Element): List[Element] =
    e filterChildren (q => Equal[QName].equal(q.name, this))

  /// findChild
  def findChild(e: Element): Option[Element] =
    findChildren(e).headOption

  /// lookupAttr
  def lookupAttr(as: List[Attr]): Option[Str] =
    Attr.lookup(this, as)

  def findAttr(e: Element): Option[Str] =
    e findAttr this

  def element(attribs: List[Attr] = Nil, content: List[Content] = Nil, line: Option[Line] = None): Element =
    Element.element(this, attribs, content, line)

  def contentElement(attribs: List[Attr] = Nil, content: List[Content] = Nil, line: Option[Line] = None): Content =
    Content.elem(element(attribs, content, line))

  def elem(attribs: Attr*): Element =
    element(attribs.toList)

}

trait QNames {
  type Str =
  List[Char]

  /// QName
  def qname(name: Str, uri: Option[Str] = None, prefix: Option[Str] = None): QName = {
    val n = name
    val u = uri
    val p = prefix
    new QName {
      val name = n
      val uri = u
      val prefix = p
    }
  }

  def qnames(name: String, uri: Option[Str] = None, prefix: Option[Str] = None): QName =
    qname(name.toList, uri, prefix)

  /// blank_name
  def blankQname: QName =
    qname(Nil)

  import std.AllInstances._

  implicit val QNameOrder: Order[QName] = new Order[QName] {
    def order(q1: QName, q2: QName) =
      Order[Str].order(q1.name, q2.name) match {
        case Ordering.EQ =>
          (q1.uri, q2.uri) match {
            case (None, None) => Order[Option[Str]].order(q1.prefix, q2.prefix)
            case (u1, u2) => Order[Option[Str]].order(u1, u2)
          }
        case x => x
      }
  }

  implicit val QNameShow: Show[QName] = new Show[QName] {
    override def shows(q: QName) =
      ("QName{name=" + q.name.mkString + (q.uri match {
        case None => ""
        case Some(u) => ",uri=" + u.mkString
      }) + (q.prefix match {
        case None => ""
        case Some(p) => ",prefix=" + p.mkString
      }) + "}")
  }

}

object QName extends QNames {

  import Lens._
  import StoreT._

  val nameQNameL: QName @> Str =
    lens(x => store(x.name)(b => qname(b, x.uri, x.prefix)))

  val uriQNameL: QName @> Option[Str] =
    lens(x => store(x.uri)(b => qname(x.name, b, x.prefix)))

  val prefixQNameL: QName @> Option[Str] =
    lens(x => store(x.prefix)(b => qname(x.name, x.uri, b)))

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy