package edu.uci.ics.pregelix.api.util;

import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;

import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
import edu.uci.ics.pregelix.api.graph.MessageCombiner;
import edu.uci.ics.pregelix.api.graph.MsgList;

@SuppressWarnings({ "rawtypes", "unchecked" })
public class DefaultMessageCombiner<I extends WritableComparable, M extends Writable> extends
        MessageCombiner<I, M, MsgList> {
    private MsgList<M> msgList;

    @Override
    public void init(MsgList providedMsgList) {
        this.msgList = providedMsgList;
        this.msgList.clearElements();
    }

    @Override
    public void stepPartial(I vertexIndex, M msg) throws HyracksDataException {
        msgList.addElement(msg);
    }

    @Override
    public void stepFinal(I vertexIndex, MsgList partialAggregate) throws HyracksDataException {
        msgList.addAllElements(partialAggregate);
    }

    @Override
    public MsgList finishPartial() {
        return msgList;
    }

    @Override
    public MsgList<M> finishFinal() {
        return msgList;
    }

}
