/**
* Copyright 2004-2016 Riccardo Solmi. All rights reserved.
* This file is part of the Whole Platform.
*
* The Whole Platform is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Whole Platform is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>.
*/
package org.whole.lang.iterators;
import org.whole.lang.comparators.IEntityComparator;
import org.whole.lang.comparators.ObjectIdentityComparator;
import org.whole.lang.model.IEntity;
import org.whole.lang.reflect.FeatureDescriptor;
import org.whole.lang.reflect.ILanguageKit;
import org.whole.lang.util.BindingUtils;
import org.whole.lang.util.IDataTypeWrapper;
import org.whole.lang.util.IRunnable;
import org.whole.lang.visitors.IVisitor;
/**
*
* @author Riccardo Solmi
*/
public class IteratorFactory {
public static <E extends IEntity> IEntityIterator<E> emptyIterator() {
return new EmptyIterator<E>();
}
public static <E extends IEntity> IEntityIterator<E> failureIterator(Throwable failure) {
return new FailureIterator<E>(failure);
}
public static <E extends IEntity> IEntityIterator<E> variableIterator(String varName) {
return BindingUtils.hasEnvironmentPart(varName) ? new VariableIterator<E>(varName) : new LocalVariableIterator<E>(varName);
}
public static <E extends IEntity> IEntityIterator<E> outerVariableIterator(String varName) {
return BindingUtils.hasEnvironmentPart(varName) ? new OuterVariableIterator<E>(varName) : new OuterLocalVariableIterator<E>(varName);
}
public static <E extends IEntity> IEntityIterator<E> constantIterator(E constant, boolean useClone) {
return new ConstantIterator<E>(constant, useClone);
}
public static <E extends IEntity> ConstantChildIterator<E> constantChildIterator(IEntity constant) {
return new ConstantChildIterator<E>(constant);
}
public static <E extends IEntity> ConstantComposeIterator<E> constantComposeIterator(IEntity constant, IEntityIterator<E> iterator) {
return new ConstantComposeIterator<E>(constant, iterator);
}
public static <E extends IEntity> IEntityIterator<E> entityCollectionIterator(Iterable<E> entityCollectionIterable) {
return collectionIterator(entityCollectionIterable, IDataTypeWrapper.identity);
}
public static <E extends IEntity> IEntityIterator<E> javaCollectionIterator(Iterable<?> collectionIterable) {
return collectionIterator(collectionIterable, IDataTypeWrapper.envSpecificValue);
}
public static <E extends IEntity> IEntityIterator<E> collectionIterator(Iterable<?> collectionIterable, IDataTypeWrapper elementWrapper) {
return new CollectionIterator<E>(elementWrapper, collectionIterable);
}
public static <E extends IEntity> IEntityIterator<E> singleValuedRunnableIterator(IRunnable runnable, IEntityIterator<?>... argsIterators) {
return new SingleValuedRunnableIterator<E>(runnable, argsIterators);
}
public static <E extends IEntity> IEntityIterator<E> multiValuedRunnableIterator(IRunnable runnable, IEntityIterator<?>... argsIterators) {
return new MultiValuedRunnableIterator<E>(runnable, argsIterators);
}
public static IEntityIterator<IEntity> aspectIterator() {
return new AspectIterator();
}
public static <E extends IEntity> IEntityIterator<E> selfIterator() {
return new SelfIterator<E>();
}
public static IEntityIterator<IEntity> rootIterator() {
return new RootIterator();
}
public static IEntityIterator<IEntity> fragmentRootIterator() {
return new FragmentRootIterator();
}
public static <E extends IEntity> IEntityIterator<E> parentIterator() {
return new ParentIterator<E>();
}
public static <E extends IEntity> IEntityIterator<E> ancestorIterator() {
return new AncestorIterator<E>(false);
}
public static <E extends IEntity> IEntityIterator<E> ancestorOrSelfIterator() {
return new AncestorIterator<E>(true);
}
public static IEntityIterator<IEntity> ancestorReverseIterator() {
return new AncestorReverseIterator();
}
public static IEntityIterator<IEntity> ancestorOrSelfReverseIterator() {
return new AncestorOrSelfReverseIterator();
}
public static IEntityIterator<IEntity> inverseAdjacentIterator() {
return new InverseAdjacentIterator();
}
public static IEntityIterator<IEntity> inverseReachableIterator(boolean includeSelf) {
DistinctScope<IEntity> distinctScope = distinctScope(ObjectIdentityComparator.instance);
return distinctScope.withIterator(inverseReachableIterator(includeSelf, distinctScope));
}
public static IEntityIterator<IEntity> inverseReachableIterator(boolean includeSelf, DistinctScope<IEntity> distinctScope) {
return new InverseReachableIterator(includeSelf, distinctScope);
}
public static IEntityIterator<IEntity> featureByNameIterator(String fdUri) {
return new FeatureByNameIterator(fdUri);
}
public static IEntityIterator<IEntity> featureByNameIterator(FeatureDescriptor fd) {
return new FeatureByNameIterator(fd);
}
public static IEntityIterator<IEntity> featureByIndexIterator(int index) {
return new FeatureByIndexIterator(index);
}
public static <E extends IEntity> IEntityIterator<E> childIterator() {
return new ChildIterator<E>();
}
public static <E extends IEntity> IEntityIterator<E> childIterator(int firstIndex) {
return new ChildIterator<E>(firstIndex);
}
public static <E extends IEntity> IEntityIterator<E> childReverseIterator() {
return new ChildReverseIterator<E>();
}
public static <E extends IEntity> IEntityIterator<E> childReverseIterator(int firstIndex) {
return new ChildReverseIterator<E>(firstIndex);
}
public static <E extends IEntity> IEntityIterator<E> descendantIterator() {
return new DescendantIterator<E>(false);
}
public static <E extends IEntity> IEntityIterator<E> descendantOrSelfIterator() {
return new DescendantIterator<E>(true);
}
public static <E extends IEntity> IEntityIterator<E> descendantOrSelfReverseIterator() {
return new DescendantReverseIterator<E>(true);
}
public static <E extends IEntity> IEntityIterator<E> followingSiblingIterator() {
return new FollowingSiblingIterator<E>(false);
}
public static <E extends IEntity> IEntityIterator<E> precedingSiblingIterator() {
return new PrecedingSiblingIterator<E>(false);
}
public static <E extends IEntity> IEntityIterator<E> followingSiblingOrSelfIterator() {
return new FollowingSiblingIterator<E>(true);
}
public static <E extends IEntity> IEntityIterator<E> precedingSiblingOrSelfIterator() {
return new PrecedingSiblingIterator<E>(true);
}
public static <E extends IEntity> IEntityIterator<E> followingIterator() {
return new FollowingIterator<E>(false);
}
public static <E extends IEntity> IEntityIterator<E> precedingIterator() {
return new PrecedingIterator<E>(false);
}
public static <E extends IEntity> IEntityIterator<E> followingOrSelfIterator() {
return new FollowingIterator<E>(true);
}
public static <E extends IEntity> IEntityIterator<E> precedingOrSelfIterator() {
return new PrecedingIterator<E>(true);
}
public static <E extends IEntity> IEntityIterator<E> adjacentIterator() {
return new AdjacentIterator<E>();
}
public static <E extends IEntity> IEntityIterator<E> adjacentIterator(int firstIndex) {
return new AdjacentIterator<E>(firstIndex);
}
public static <E extends IEntity> IEntityIterator<E> reachableIterator(boolean includeSelf) {
DistinctScope<E> distinctScope = distinctScope(ObjectIdentityComparator.instance);
return distinctScope.withIterator(reachableIterator(includeSelf, distinctScope));
}
public static <E extends IEntity> IEntityIterator<E> reachableIterator(boolean includeSelf, DistinctScope<E> distinctScope) {
return new ReachableIterator<E>(includeSelf, distinctScope);
}
public static <E extends IEntity> IEntityIterator<E> childOrAdjacentIterator() {
return new ChildOrAdjacentIterator<E>();
}
public static <E extends IEntity> IEntityIterator<E> childOrAdjacentIterator(int firstIndex) {
return new ChildOrAdjacentIterator<E>(firstIndex);
}
public static <E extends IEntity> IEntityIterator<E> descendantOrReachableIterator() {
DistinctScope<E> distinctScope = distinctScope(ObjectIdentityComparator.instance);
return distinctScope.withIterator(descendantOrReachableIterator(false, distinctScope));
}
public static <E extends IEntity> IEntityIterator<E> descendantOrReachableIterator(boolean includeSelf, DistinctScope<E> distinctScope) {
return new DescendantOrReachableIterator<E>(includeSelf, distinctScope);
}
public static <E extends IEntity> ScannerIterator<E> scannerIterator(IEntityIterator<E> iterator) {
return new ScannerIterator<E>(iterator);
}
public static <E extends IEntity> MatcherIterator<E> matcherIterator(IEntityIterator<E> iterator) {
return new MatcherIterator<E>(iterator);
}
public static <E extends IEntity> AbstractPatternFilterIterator<E> filterIterator(IEntityIterator<E> iterator, IVisitor filterPredicate) {
return matcherIterator(iterator).withPattern(filterPredicate);
}
public static <E extends IEntity> AbstractPatternFilterIterator<E> filterIterator(IEntityIterator<E> iterator, IEntity filterPattern) {
return matcherIterator(iterator).withPattern(filterPattern);
}
public static AbstractPatternFilterIterator<IEntity> patternMatcherIterator(IEntity pattern) {
return filterIterator(selfIterator(), pattern);
}
public static <E extends IEntity> IfIterator<E> ifIterator(IVisitor predicate, IEntityIterator<E> doIterator) {
return new IfIterator<E>(filterIterator(selfIterator(), predicate), doIterator);
}
public static <E extends IEntity> ForIterator<E> forIterator(IEntityIterator<? extends IEntity> forIterator, IEntityIterator<E> doIterator) {
return new ForIterator<E>(forIterator, doIterator);
}
public static IEntityIterator<IEntity> functionApplicationIterator(String functionUri) {
return new FunctionApplicationIterator(functionUri);
}
public static IEntityIterator<IEntity> recursiveFunctionApplicationIterator() {
return new RecursiveFunctionApplicationIterator();
}
public static <E extends IEntity> IEntityIterator<E> templateInterpreterIterator(IEntity template) {
return new TemplateInterpreterIterator<E>(template);
}
@SafeVarargs
public static <E extends IEntity> ChooseByOrderIterator<E> chooseIterator(IEntityIterator<? extends E>... iteratorChain) {
return new ChooseByOrderIterator<E>(iteratorChain);
}
public static <E extends IEntity> ChooseByTypeIterator<E> chooseIterator(ILanguageKit languageKit) {
return new ChooseByTypeIterator<E>(languageKit);
}
@SafeVarargs
public static <E extends IEntity> SequenceIterator<E> blockIterator(IEntityIterator<? extends E>... iteratorChain) {
return new BlockIterator<E>(iteratorChain);
}
@SafeVarargs
public static <E extends IEntity> SequenceIterator<E> sequenceIterator(IEntityIterator<? extends E>... iteratorChain) {
return new SequenceIterator<E>(iteratorChain);
}
@SafeVarargs
public static <E extends IEntity> ComposeIterator<E> composeIterator(IEntityIterator<E> iterator, IEntityIterator<? extends IEntity>... nestedIterators) {
return new ComposeIterator<E>(iterator, nestedIterators);
}
public static <E extends IEntity> FilterByIndexRangeIterator<E> filterByIndexIterator(IEntityIterator<E> iterator, int index) {
return new FilterByIndexRangeIterator<E>(iterator, index, index);
}
public static <E extends IEntity> FilterByIndexRangeIterator<E> filterByIndexRangeIterator(IEntityIterator<E> iterator, int startIndex, int endIndex) {
return new FilterByIndexRangeIterator<E>(iterator, startIndex, endIndex);
}
public static <E extends IEntity> FilterByIndexRangeIterator<E> filterByIndexRangeIterator() {
return new FilterByIndexRangeIterator<E>();
}
public static <E extends IEntity> DistinctScope<E> distinctScope() {
return new FilterByDistinctIterator<E>();
}
public static <E extends IEntity> DistinctScope<E> distinctScope(IEntityComparator<IEntity> comparator) {
return new FilterByDistinctIterator<E>(comparator);
}
public static <E extends IEntity> IEntityIterator<E> sort(IEntityIterator<E> iterator) {
return new SortIterator<E>(iterator);
}
public static <E extends IEntity> IEntityIterator<E> sort(IEntityIterator<E> iterator, IEntityComparator<E> comparator) {
return new SortIterator<E>(iterator, comparator);
}
@SafeVarargs
public static IEntityIterator<IEntity> unionAllIterator(IEntityIterator<? extends IEntity>... iteratorChain) {
return new UnionAllIterator(iteratorChain);
}
@SafeVarargs
public static AbstractCollectIterator unionIterator(IEntityIterator<? extends IEntity>... iteratorChain) {
return new UnionIterator(iteratorChain);
}
@SafeVarargs
public static AbstractCollectIterator intersectIterator(IEntityIterator<? extends IEntity>... iteratorChain) {
return new IntersectIterator(iteratorChain);
}
@SafeVarargs
public static AbstractCollectIterator exceptIterator(IEntityIterator<? extends IEntity>... iteratorChain) {
return new ExceptIterator(iteratorChain);
}
public static <E extends IEntity> ScannerIterator<E> ancestorScannerIterator() {
return scannerIterator(IteratorFactory.<E>ancestorIterator());
}
public static <E extends IEntity> ScannerIterator<E> childScannerIterator() {
return scannerIterator(IteratorFactory.<E>childIterator());
}
public static <E extends IEntity> ScannerIterator<E> childReverseScannerIterator() {
return scannerIterator(IteratorFactory.<E>childReverseIterator());
}
public static <E extends IEntity> ScannerIterator<E> descendantOrSelfScannerIterator() {
return scannerIterator(IteratorFactory.<E>descendantOrSelfIterator());
}
public static <E extends IEntity> ScannerIterator<E> descendantOrSelfReverseScannerIterator() {
return scannerIterator(IteratorFactory.<E>descendantOrSelfReverseIterator());
}
public static <E extends IEntity> MatcherIterator<E> ancestorMatcherIterator() {
return matcherIterator(IteratorFactory.<E>ancestorIterator());
}
public static <E extends IEntity> MatcherIterator<E> ancestorOrSelfMatcherIterator() {
return matcherIterator(IteratorFactory.<E>ancestorOrSelfIterator());
}
public static <E extends IEntity> MatcherIterator<E> childMatcherIterator() {
return matcherIterator(IteratorFactory.<E>childIterator());
}
public static <E extends IEntity> MatcherIterator<E> childReverseMatcherIterator() {
return matcherIterator(IteratorFactory.<E>childReverseIterator());
}
public static <E extends IEntity> MatcherIterator<E> descendantOrSelfMatcherIterator() {
return matcherIterator(IteratorFactory.<E>descendantOrSelfIterator());
}
public static <E extends IEntity> MatcherIterator<E> descendantOrSelfReverseMatcherIterator() {
return matcherIterator(IteratorFactory.<E>descendantOrSelfReverseIterator());
}
}