View Javadoc
1   package de.fhdw.wtf.context.model.collections;
2   
3   import de.fhdw.wtf.context.model.Anything;
4   import de.fhdw.wtf.context.model.collections.functors.EquivalenceRelation;
5   import de.fhdw.wtf.context.model.collections.functors.Function;
6   import de.fhdw.wtf.context.model.collections.functors.Operator;
7   import de.fhdw.wtf.context.model.collections.functors.Predicate;
8   
9   /**
10   * An interface to represent an abstraction over ImmutableCollections. Every operation provides a new
11   * ImmutableCollection. This empowers a functional programming style.
12   * 
13   * @param <T>
14   *            All elements of this immutable collection have to by of type T which is a subtype to Anything.
15   */
16  public interface ImmutableCollection<T extends Anything> extends Collection<T> {
17  	
18  	/**
19  	 * Provides a new Collection with the given elment added.
20  	 * 
21  	 * @param element
22  	 *            The newly added Element.
23  	 * @return Provides a new Collection with a new element added.
24  	 */
25  	ImmutableCollection<T> add(T element);
26  	
27  	/**
28  	 * Provides the first element of this collection.
29  	 * 
30  	 * @return The element of the front of this collection.
31  	 */
32  	T front();
33  	
34  	/**
35  	 * Provides a new collection without the first element.
36  	 * 
37  	 * @return Another collection without the first element of this collection.
38  	 */
39  	ImmutableCollection<T> tail();
40  	
41  	/**
42  	 * Provides anew collection with the elements of this collection in a reverse order.
43  	 * 
44  	 * @return Another reversed collection.
45  	 */
46  	ImmutableCollection<T> reverse();
47  	
48  	/**
49  	 * Applies a given function to any element of this collection and provides a collection of the results of the
50  	 * function.
51  	 * 
52  	 * @param <U>
53  	 *            The result type of the function.
54  	 * @param function
55  	 *            A unary function, which can be applied to any element of the collection.
56  	 * @return Provides a collection of the single results of the function.
57  	 */
58  	<U extends Anything> ImmutableCollection<U> map(Function<T, U> function);
59  	
60  	/**
61  	 * This method aggregates the elements of this collection to a single result by a given Aggregation Function.
62  	 * 
63  	 * @param <U>
64  	 *            The result type of the aggregation.
65  	 * @param aggregation
66  	 *            A binary operation +: U x T -> U.
67  	 * @return Provides the aggregation result of the operation.
68  	 */
69  	<U extends Anything> U reduce(Operator<T, U> aggregation);
70  	
71  	/**
72  	 * This method performs an aggregation of different equivalence classes of this collection. First the collection is
73  	 * divided into multiple sub-collections by an equivalence relation. Then these sub-collection are aggregated by the
74  	 * given aggregation function. The result is a collection of these results.
75  	 * 
76  	 * @param <U>
77  	 *            The result type of the aggregation.
78  	 * @param equi
79  	 *            An equivalence relation which divides this collection into smaller parts.
80  	 * @param aggregation
81  	 *            A binary operation +: U x T -> U.
82  	 * @return A Collection of the results of the different aggregations.
83  	 */
84  	<U extends Anything> ImmutableCollection<U> reduceEquivalent(EquivalenceRelation<T> equi, Operator<T, U> aggregation);
85  	
86  	/**
87  	 * Provides a new Collection, where each element of the new collection suffices the predicate.
88  	 * 
89  	 * @param predicate
90  	 *            A predicate for an element T.
91  	 * @return Produces a new collection with elements of this collection, which suffice the predicate.
92  	 */
93  	ImmutableCollection<T> filter(Predicate<T> predicate);
94  	
95  	/**
96  	 * This operation searches for the first element of this collection, which suffices the Predicate. If no element is
97  	 * found, a NoSuchElementException is thrown.
98  	 * 
99  	 * @param predicate
100 	 *            A predicate for an element of T.
101 	 * @return Provides the first found element which suffices the predicate.
102 	 */
103 	T find(Predicate<T> predicate);
104 	
105 }