/*
 * Copyright 2017-2021 Dromara.org

 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.dromara.hmily.core.hook;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Function;
import org.dromara.hmily.repository.spi.entity.HmilyParticipantUndo;

/**
 * The enum Undo hook.
 */
public enum UndoHook {
    
    /**
     * Instance undo hook.
     */
    INSTANCE;
    
    private final List<Function<HmilyParticipantUndo, Boolean>> consumers = new CopyOnWriteArrayList<>();
    
    /**
     * Register.
     *
     * @param function the function
     */
    public void register(final Function<HmilyParticipantUndo, Boolean> function) {
        consumers.add(function);
    }
    
    
    /**
     * Run boolean.
     *
     * @param undo the undo
     * @return the boolean
     */
    public boolean run(final HmilyParticipantUndo undo) {
        for (Function<HmilyParticipantUndo, Boolean> each : consumers) {
            return each.apply(undo);
        }
        return false;
    }
    
}
