transformation removeclassesinwhile;

modeltype ECORE uses 'http://www.eclipse.org/emf/2002/Ecore';

mapping main(model: ecore::EPackage) : ecore::EPackage {
	init {
		result := model.deepclone().oclAsType(ecore::EPackage);
    	while_expr(result);
	}
	
}

query while_expr(model: ecore::EPackage): OclVoid {

    while (model.eClassifiers->size() > 0) {
        --dump(model.eClassifiers);
        map patch(model, model.eClassifiers->size());
    }; 

    return null;
}

mapping patch(inout pac:ecore::EPackage, in sz : Integer): ecore::EPackage {
    init {
        var firstElem := pac.eClassifiers->first();
        var classifiers := pac.eClassifiers;
        pac.eClassifiers := classifiers->excluding(firstElem)->asOrderedSet();
    }
    
        name := pac.name;
}
