Class LazyCollection<E>

  • Type Parameters:
    E - the collection element type
    All Implemented Interfaces:
    java.lang.Iterable<E>, java.util.Collection<E>
    Direct Known Subclasses:
    LazyBag, LazyList, LazyOrderedSet, LazySet

    public abstract class LazyCollection<E>
    extends java.lang.Object
    implements java.util.Collection<E>
    Immutable Collection that supports lazy evaluation. Based on the OCL 2.2 specification (formal/2010-02-01).
    • Field Detail

      • dataSource

        protected java.lang.Iterable<E> dataSource
        The inner data source for this collection. Is set to null when cache is complete.
      • cache

        protected java.util.Collection<E> cache
        Element cache.
      • occurrences

        protected java.util.Map<E,​java.lang.Integer> occurrences
        Cached element occurrence map.
    • Constructor Detail

      • LazyCollection

        public LazyCollection​(java.lang.Iterable<E> dataSource)
        Creates a LazyCollection around dataSource.
        Parameters:
        dataSource - the underlying collection
      • LazyCollection

        public LazyCollection()
        Creates an empty LazyCollection.
    • Method Detail

      • createCache

        protected void createCache()
        Creates the cache collections.
      • add

        public boolean add​(E o)
        Unsupported.
        Specified by:
        add in interface java.util.Collection<E>
        Parameters:
        o - the element to add
        Returns:
        nothing
        Throws:
        java.lang.UnsupportedOperationException
      • addAll

        public boolean addAll​(java.util.Collection<? extends E> c)
        Unsupported.
        Specified by:
        addAll in interface java.util.Collection<E>
        Parameters:
        c - the collection to add
        Returns:
        nothing
        Throws:
        java.lang.UnsupportedOperationException
      • clear

        public void clear()
        Unsupported.
        Specified by:
        clear in interface java.util.Collection<E>
        Throws:
        java.lang.UnsupportedOperationException
      • contains

        public boolean contains​(java.lang.Object o)
        Specified by:
        contains in interface java.util.Collection<E>
      • containsAll

        public boolean containsAll​(java.util.Collection<?> c)
        Specified by:
        containsAll in interface java.util.Collection<E>
      • containsAny

        public boolean containsAny​(java.util.Collection<?> c)
        Checks if this collection contains any of the elements in the specified collection.
        Parameters:
        c - collection to be checked for containment in this collection.
        Returns:
        true if this collection contains any of the elements in the specified collection.
      • isEmpty

        public boolean isEmpty()
        Specified by:
        isEmpty in interface java.util.Collection<E>
      • iterator

        public java.util.Iterator<E> iterator()
        Specified by:
        iterator in interface java.util.Collection<E>
        Specified by:
        iterator in interface java.lang.Iterable<E>
      • remove

        public boolean remove​(java.lang.Object o)
        Unsupported.
        Specified by:
        remove in interface java.util.Collection<E>
        Parameters:
        o - the element to remove
        Returns:
        nothing
        Throws:
        java.lang.UnsupportedOperationException
      • removeAll

        public boolean removeAll​(java.util.Collection<?> c)
        Unsupported.
        Specified by:
        removeAll in interface java.util.Collection<E>
        Parameters:
        c - the collection to remove
        Returns:
        nothing
        Throws:
        java.lang.UnsupportedOperationException
      • retainAll

        public boolean retainAll​(java.util.Collection<?> c)
        Unsupported.
        Specified by:
        retainAll in interface java.util.Collection<E>
        Parameters:
        c - the collection to retain
        Returns:
        nothing
        Throws:
        java.lang.UnsupportedOperationException
      • size

        public int size()
        Specified by:
        size in interface java.util.Collection<E>
      • toArray

        public java.lang.Object[] toArray()
        Specified by:
        toArray in interface java.util.Collection<E>
      • toArray

        public <T> T[] toArray​(T[] a)
        Specified by:
        toArray in interface java.util.Collection<E>
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
      • asString

        public abstract java.lang.String asString​(ExecEnv env)
        Evaluates the collection as an OCL String.
        Parameters:
        env - the execution environment
        Returns:
        the String representation of this LazyCollection.
      • appendElements

        protected java.lang.StringBuffer appendElements​(java.lang.StringBuffer buf,
                                                        ExecEnv env)
        Appends the elements of this collection to buf.
        Parameters:
        buf - the StringBuffer to add the elements' string representation to
        env - the execution environment
        Returns:
        buf
      • includes

        public boolean includes​(java.lang.Object object)
        Returns true if object is an element of self, false otherwise.
        Parameters:
        object - the object to check for
        Returns:
        true if object is an element of self, false otherwise.
      • excludes

        public boolean excludes​(java.lang.Object object)
        Returns true if object is not an element of self, false otherwise.
        Parameters:
        object - the object to check for
        Returns:
        true if object is not an element of self, false otherwise.
      • count

        public int count​(java.lang.Object object)
        Returns the number of times that object occurs in the collection self.
        Parameters:
        object - the object to check for
        Returns:
        The number of times that object occurs in the collection self.
      • includesAll

        public boolean includesAll​(java.util.Collection<?> c2)
        Does self contain all the elements of c2 ?
        Parameters:
        c2 - the collection to check
        Returns:
        true iff self contains all elements of c2.
      • excludesAll

        public boolean excludesAll​(java.util.Collection<?> c2)
        Does self contain none of the elements of c2 ?
        Parameters:
        c2 - the collection to check
        Returns:
        true iff self contains no elements of c2.
      • notEmpty

        public boolean notEmpty()
        Is self not the empty collection?
        Returns:
        false iff self contains no elements.
      • max

        public E max()
        The element with the maximum value of all elements in self. Elements must be of a type supporting the max operation. The max operation - supported by the elements - must take one parameter of type E and be both associative and commutative. Integer and Real fulfill this condition.
        Returns:
        The element with the maximum value of all elements in self.
      • min

        public E min()
        The element with the minimum value of all elements in self. Elements must be of a type supporting the min operation. The min operation - supported by the elements - must take one parameter of type T and be both associative and commutative. Integer and Real fulfill this condition.
        Returns:
        The element with the minimum value of all elements in self.
      • sum

        public E sum()
        The addition of all elements in self. Elements must be of a type supporting the + operation. The + operation must take one parameter of type E and be both associative: (a+b)+c = a+(b+c), and commutative: a+b = b+a. Integer and Real fulfill this condition.
        Returns:
        self->iterate( elem; acc : E = 0 | acc + elem )
      • product

        public <T> LazySet<Tuple> product​(java.lang.Iterable<T> c2)
        The cartesian product operation of self and c2.

        Lazy operation.

        Type Parameters:
        T - the element type
        Parameters:
        c2 - the other factor in the cartesian product
        Returns:
        self->iterate (e1; acc: Set(Tuple(first: T, second: T2)) = Set{} |
        c2->iterate (e2; acc2: Set(Tuple(first: T, second: T2)) = acc |
        acc2->including (Tuple{first = e1, second = e2}) ) )
      • asBag

        public LazyBag<E> asBag()
        Returns the Bag containing all the elements from self, including duplicates.

        Lazy operation.

        Returns:
        The Bag containing all the elements from self, including duplicates.
      • asSequence

        public LazyList<E> asSequence()
        Returns a Sequence that contains all the elements from self, in undefined order.

        Lazy operation.

        Returns:
        A Sequence that contains all the elements from self, in undefined order.
      • asSet

        public LazySet<E> asSet()
        Returns the Set containing all the elements from self, with duplicated removed.

        Lazy operation.

        Returns:
        The Set containing all the elements from self, with duplicated removed.
      • asOrderedSet

        public LazyOrderedSet<E> asOrderedSet()
        Returns an OrderedSet that contains all the elements from self, in undefined order, with duplicates removed.

        Lazy operation.

        Returns:
        An OrderedSet that contains all the elements from self, in undefined order, with duplicates removed.
      • including

        public abstract LazyCollection<E> including​(E object)
        Returns the collection containing all elements of self plus object.

        Lazy operation.

        Parameters:
        object - the object to include
        Returns:
        The collection containing all elements of self plus object.
      • including

        public abstract LazyCollection<E> including​(E object,
                                                    int index)
        Returns the collection containing all elements of self plus object.

        Lazy operation.

        Parameters:
        object - the object to include
        index - the index at which to insert coll (starting at 1)
        Returns:
        The collection containing all elements of self plus object.
      • includingAll

        public abstract LazyCollection<E> includingAll​(java.util.Collection<? extends E> coll)
        Returns the collection containing all elements of self plus coll.

        Lazy operation.

        Parameters:
        coll - the collection to include
        Returns:
        The collection containing all elements of self plus coll.
      • includingAll

        public abstract LazyCollection<E> includingAll​(java.util.Collection<? extends E> coll,
                                                       int index)
        Returns the collection containing all elements of self plus coll.

        Lazy operation.

        Parameters:
        coll - the collection to include
        index - the index at which to insert coll (starting at 1)
        Returns:
        The collection containing all elements of self plus coll.
      • excluding

        public abstract LazyCollection<E> excluding​(java.lang.Object object)
        Returns the collection containing all elements of self apart from all occurrences of object.

        Lazy operation.

        Parameters:
        object - the object to exclude
        Returns:
        The collection containing all elements of self apart from all occurrences of object.
      • excludingAll

        public abstract LazyCollection<E> excludingAll​(java.util.Collection<?> coll)
        Returns the collection containing all elements of self minus coll.

        Lazy operation.

        Parameters:
        coll - the collection to exclude
        Returns:
        The collection containing all elements of self minus coll.
      • includingRange

        public abstract LazyCollection<E> includingRange​(E first,
                                                         E last)
        Returns the collection containing all elements of self plus the collection of first running to last.

        Lazy operation.

        Parameters:
        first - the first object of the range to include
        last - the last object of the range to include
        Returns:
        The collection containing all elements of self plus the collection of first running to last
      • forAll

        public boolean forAll​(CodeBlock condition)
        Checks if condition holds for all elements in the underlying collection.
        Parameters:
        condition - the condition function
        Returns:
        true iff condition holds for all elements in the underlying collection.
      • forAll2

        public boolean forAll2​(CodeBlock condition)
        Checks if condition holds for all element pairs in the cartesian product of the underlying collection.
        Parameters:
        condition - the condition function
        Returns:
        true iff condition holds for all element pairs in the cartesian product of the underlying collection.
      • exists

        public boolean exists​(CodeBlock condition)
        Checks if condition holds for at least one element in the underlying collection.
        Parameters:
        condition - the condition function
        Returns:
        true iff condition holds for at least one element in the underlying collection.
      • exists2

        public boolean exists2​(CodeBlock condition)
        Checks if condition holds for at least one element pair in the cartesian product of the underlying collection.
        Parameters:
        condition - the condition function
        Returns:
        true iff condition holds for at least one element pair in the cartesian product of the underlying collection.
      • iterate

        public <T> T iterate​(T initialValue,
                             CodeBlock updater)
        Builds an accumulated value by calling the updater function for each element in the underlying collection and the previous accumulated value.
        Type Parameters:
        T - the element type
        Parameters:
        initialValue - the initial accumulated value
        updater - the updater function
        Returns:
        The accumulated value
      • isUnique

        public boolean isUnique​(CodeBlock body)
        Results in true if body evaluates to a different value for each element in the source collection; otherwise, result is false.
        Parameters:
        body - the code to execute on each element
        Returns:
        true if body evaluates to a different value for each element in the source collection.
      • any

        public E any​(CodeBlock body)
              throws java.util.NoSuchElementException
        Returns any element in the source collection for which body evaluates to true. If there is more than one element for which body is true, one of them is returned. There must be at least one element fulfilling body.
        Parameters:
        body - the function to evaluate on each element
        Returns:
        any element in the source collection for which body evaluates to true.
        Throws:
        java.util.NoSuchElementException - if there is no element in the source collection for which body is true.
      • one

        public boolean one​(CodeBlock body)
        Results in true if there is exactly one element in the source collection for which body is true.
        Parameters:
        body - the function to evaluate on each element
        Returns:
        true if there is exactly one element in the source collection for which body is true.
      • sortedBy

        public abstract LazyCollection<E> sortedBy​(CodeBlock body)
        Results in the Collection containing all elements of the source collection. The element for which body has the lowest value comes first, and so on. The type of the body expression must have the < operation defined. The < operation must return a Boolean value and must be transitive (i.e., if a < b and b < c then a < c).
        Parameters:
        body - the function to evaluate on each element
        Returns:
        the sorted collection
      • mappedBy

        public java.util.Map<java.lang.Object,​LazySet<E>> mappedBy​(CodeBlock body)
        Returns a Map indexed by the return value(s) x of the body expression, containing the Set of elements for which the body expression returns x.
        Parameters:
        body - the function to evaluate on each element
        Returns:
        the Map
      • mappedBySingle

        public java.util.Map<java.lang.Object,​E> mappedBySingle​(CodeBlock body)
        Returns a Map indexed by the return value(s) x of the body expression, containing a single element for which the body expression returns x.
        Parameters:
        body - the function to evaluate on each element
        Returns:
        the Map