trait SubtypeAwareElemApi extends ElemApi
Extension to ElemApi that makes querying for sub-types of the element type easy.
For example, XML Schema can be modeled with an object hierarchy, starting with some XsdElem super-type which mixes in trait SubtypeAwareElemApi, among other query traits. The object hierarchy could contain sub-classes of XsdElem such as XsdRootElem, GlobalElementDeclaration, etc. Then the SubtypeAwareElemApi trait makes it easy to query for all or some global element declarations, etc.
There is no magic in these traits: it is just ElemApi and ElemLike underneath. It is only the syntactic convenience that makes the difference.
The query methods of this trait take a sub-type as first value parameter. It is intentional that this is a value parameter, and not a second type parameter, since it is conceptually the most important parameter of these query methods. (If it were a second type parameter instead, the article http://hacking-scala.org/post/73854628325/advanced-type-constraints-with-type-classes would show how to make that solution robust, using some @NotNothing annotation.)
The sub-type parameter could have been a java.lang.Class
object, except that type erasure would make it less attractive
(when doing pattern matching against that type). Hence the use of a ClassTag
parameter, which undoes type erasure
for non-generic types, if available implicitly. So ClassTag
is used as a better java.lang.Class
, yet without
polluting the public API with an implicit ClassTag
parameter. (Instead, the ClassTag is made implicit inside the
method implementations.)
- Alphabetic
- By Inheritance
- SubtypeAwareElemApi
- ElemApi
- AnyElemApi
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Type Members
- abstract type ThisElem <: SubtypeAwareElemApi
The element type itself.
The element type itself. It must be restricted to a sub-type of the query API trait in question.
Concrete element classes will restrict this type to that element class itself.
- Definition Classes
- SubtypeAwareElemApi → ElemApi → AnyElemApi
Abstract Value Members
- abstract def \(p: (ThisElem) ⇒ Boolean): IndexedSeq[ThisElem]
Shorthand for
filterChildElems(p)
.Shorthand for
filterChildElems(p)
. Use this shorthand only if the predicate is a short expression.- Definition Classes
- ElemApi
- abstract def \\(p: (ThisElem) ⇒ Boolean): IndexedSeq[ThisElem]
Shorthand for
filterElemsOrSelf(p)
.Shorthand for
filterElemsOrSelf(p)
. Use this shorthand only if the predicate is a short expression.- Definition Classes
- ElemApi
- abstract def \\!(p: (ThisElem) ⇒ Boolean): IndexedSeq[ThisElem]
Shorthand for
findTopmostElemsOrSelf(p)
.Shorthand for
findTopmostElemsOrSelf(p)
. Use this shorthand only if the predicate is a short expression.- Definition Classes
- ElemApi
- abstract def filterChildElems(p: (ThisElem) ⇒ Boolean): IndexedSeq[ThisElem]
Returns the child elements obeying the given predicate.
Returns the child elements obeying the given predicate. This method could be defined as:
def filterChildElems(p: ThisElem => Boolean): immutable.IndexedSeq[ThisElem] = this.findAllChildElems.filter(p)
- Definition Classes
- ElemApi
- abstract def filterChildElemsOfType[B <: ThisElem](subType: ClassTag[B])(p: (B) ⇒ Boolean): IndexedSeq[B]
Returns the child elements of the given sub-type obeying the given predicate.
- abstract def filterElems(p: (ThisElem) ⇒ Boolean): IndexedSeq[ThisElem]
Returns the descendant elements obeying the given predicate, in document order.
Returns the descendant elements obeying the given predicate, in document order. This method could be defined as:
this.findAllChildElems flatMap (_.filterElemsOrSelf(p))
- Definition Classes
- ElemApi
- abstract def filterElemsOfType[B <: ThisElem](subType: ClassTag[B])(p: (B) ⇒ Boolean): IndexedSeq[B]
Returns the descendant elements of the given sub-type obeying the given predicate.
- abstract def filterElemsOrSelf(p: (ThisElem) ⇒ Boolean): IndexedSeq[ThisElem]
Returns the descendant-or-self elements obeying the given predicate, in document order.
Returns the descendant-or-self elements obeying the given predicate, in document order. This method could be defined as:
def filterElemsOrSelf(p: ThisElem => Boolean): immutable.IndexedSeq[ThisElem] = Vector(this).filter(p) ++ (this.findAllChildElems flatMap (_.filterElemsOrSelf(p)))
It can be proven that the result is equivalent to
findAllElemsOrSelf filter p
.- Definition Classes
- ElemApi
- abstract def filterElemsOrSelfOfType[B <: ThisElem](subType: ClassTag[B])(p: (B) ⇒ Boolean): IndexedSeq[B]
Returns the descendant-or-self elements of the given sub-type obeying the given predicate.
- abstract def findAllChildElems: IndexedSeq[ThisElem]
Core method that returns all child elements, in the correct order.
Core method that returns all child elements, in the correct order. Other operations can be defined in terms of this one.
- Definition Classes
- ElemApi
- abstract def findAllChildElemsOfType[B <: ThisElem](subType: ClassTag[B]): IndexedSeq[B]
Returns all child elements of the given sub-type, in the correct order.
- abstract def findAllElems: IndexedSeq[ThisElem]
Returns all descendant elements (not including this element), in document order.
Returns all descendant elements (not including this element), in document order. This method could be defined as
filterElems { e => true }
. Equivalent tofindAllElemsOrSelf.drop(1)
.- Definition Classes
- ElemApi
- abstract def findAllElemsOfType[B <: ThisElem](subType: ClassTag[B]): IndexedSeq[B]
Returns all descendant elements of the given sub-type (not including this element).
- abstract def findAllElemsOrSelf: IndexedSeq[ThisElem]
Returns this element followed by all descendant elements (that is, the descendant-or-self elements), in document order.
Returns this element followed by all descendant elements (that is, the descendant-or-self elements), in document order. This method could be defined as
filterElemsOrSelf { e => true }
.- Definition Classes
- ElemApi
- abstract def findAllElemsOrSelfOfType[B <: ThisElem](subType: ClassTag[B]): IndexedSeq[B]
Returns all descendant-or-self elements of the given sub-type.
- abstract def findChildElem(p: (ThisElem) ⇒ Boolean): Option[ThisElem]
Returns the first found child element obeying the given predicate, if any, wrapped in an
Option
.Returns the first found child element obeying the given predicate, if any, wrapped in an
Option
. This method could be defined asfilterChildElems(p).headOption
.- Definition Classes
- ElemApi
- abstract def findChildElemOfType[B <: ThisElem](subType: ClassTag[B])(p: (B) ⇒ Boolean): Option[B]
Returns the first found child element of the given sub-type obeying the given predicate, if any, wrapped in an
Option
. - abstract def findElem(p: (ThisElem) ⇒ Boolean): Option[ThisElem]
Returns the first found (topmost) descendant element obeying the given predicate, if any, wrapped in an
Option
.Returns the first found (topmost) descendant element obeying the given predicate, if any, wrapped in an
Option
. This method could be defined asfilterElems(p).headOption
.- Definition Classes
- ElemApi
- abstract def findElemOfType[B <: ThisElem](subType: ClassTag[B])(p: (B) ⇒ Boolean): Option[B]
Returns the first found (topmost) descendant element of the given sub-type obeying the given predicate, if any, wrapped in an
Option
. - abstract def findElemOrSelf(p: (ThisElem) ⇒ Boolean): Option[ThisElem]
Returns the first found (topmost) descendant-or-self element obeying the given predicate, if any, wrapped in an
Option
.Returns the first found (topmost) descendant-or-self element obeying the given predicate, if any, wrapped in an
Option
. This method could be defined asfilterElemsOrSelf(p).headOption
.- Definition Classes
- ElemApi
- abstract def findElemOrSelfOfType[B <: ThisElem](subType: ClassTag[B])(p: (B) ⇒ Boolean): Option[B]
Returns the first found (topmost) descendant-or-self element of the given sub-type obeying the given predicate, if any, wrapped in an
Option
. - abstract def findTopmostElems(p: (ThisElem) ⇒ Boolean): IndexedSeq[ThisElem]
Returns the descendant elements obeying the given predicate that have no ancestor obeying the predicate.
Returns the descendant elements obeying the given predicate that have no ancestor obeying the predicate. This method could be defined as:
this.findAllChildElems flatMap (_.findTopmostElemsOrSelf(p))
- Definition Classes
- ElemApi
- abstract def findTopmostElemsOfType[B <: ThisElem](subType: ClassTag[B])(p: (B) ⇒ Boolean): IndexedSeq[B]
Returns the descendant elements of the given sub-type obeying the given predicate that have no ancestor of the given sub-type obeying the predicate.
- abstract def findTopmostElemsOrSelf(p: (ThisElem) ⇒ Boolean): IndexedSeq[ThisElem]
Returns the descendant-or-self elements obeying the given predicate, such that no ancestor obeys the predicate.
Returns the descendant-or-self elements obeying the given predicate, such that no ancestor obeys the predicate. This method could be defined as:
def findTopmostElemsOrSelf(p: ThisElem => Boolean): immutable.IndexedSeq[ThisElem] = if (p(this)) Vector(this) else (this.findAllChildElems flatMap (_.findTopmostElemsOrSelf(p)))
- Definition Classes
- ElemApi
- abstract def findTopmostElemsOrSelfOfType[B <: ThisElem](subType: ClassTag[B])(p: (B) ⇒ Boolean): IndexedSeq[B]
Returns the descendant-or-self elements of the given sub-type obeying the given predicate, such that no ancestor of the given sub-type obeys the predicate.
- abstract def getChildElem(p: (ThisElem) ⇒ Boolean): ThisElem
Returns the single child element obeying the given predicate, and throws an exception otherwise.
Returns the single child element obeying the given predicate, and throws an exception otherwise. This method could be defined as
findChildElem(p).get
.- Definition Classes
- ElemApi
- abstract def getChildElemOfType[B <: ThisElem](subType: ClassTag[B])(p: (B) ⇒ Boolean): B
Returns the single child element of the given sub-type obeying the given predicate, and throws an exception otherwise.
- abstract def thisElem: ThisElem
This element itself.
This element itself.
- Definition Classes
- AnyElemApi
Concrete Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##(): Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @native() @throws(classOf[java.lang.CloneNotSupportedException])
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- def finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable])
- final def getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @throws(classOf[java.lang.InterruptedException])