MorphicSetFactory.java

package edu.udel.cis.vsl.tass.morph;

import java.util.LinkedHashSet;

public class MorphicSetFactory<T extends Morphic> extends
		MorphicFactory<MorphicSet<T>> {

	private MorphicFactoryIF<? super T> elementFactory;

	public MorphicSetFactory(MorphicFactoryIF<? super T> elementFactory) {
		this.elementFactory = elementFactory;
	}

	public MorphicFactoryIF<? super T> elementFactory() {
		return elementFactory;
	}

	public MorphicSet<T> newSet() {
		return new MorphicSet<T>();
	}

	public MorphicSet<T> newSet(LinkedHashSet<T> elements) {
		return new MorphicSet<T>(elements);
	}

	public MorphicSet<T> newSet(MorphicSet<T> oldSet) {
		return new MorphicSet<T>(oldSet);
	}

	@Override
	protected void canonicalizeChildren(MorphicSet<T> set) {
		set.canonicalizeChildren(elementFactory);
	}

	public MorphicSet<T> add(MorphicSet<T> set, T element) {
		if (!set.isCommitted()) {
			set.add(element);
			return set;
		} else if (!set.contains(element)) {
			LinkedHashSet<T> newElements = new LinkedHashSet<T>(set.elements());

			newElements.add(element);
			return newSet(newElements);
		} else {
			return set;
		}
	}
}