/*
 * Copyright 2017-present Open Networking Laboratory
 *
 * 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.onosproject.store.primitives.impl;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;

import org.onosproject.store.service.AsyncAtomicIdGenerator;

/**
 * {@link AsyncAtomicIdGenerator} that executes asynchronous callbacks on a user provided
 * {@link Executor}.
 */
public class ExecutingAsyncAtomicIdGenerator extends ExecutingDistributedPrimitive implements AsyncAtomicIdGenerator {
    private final AsyncAtomicIdGenerator delegateIdGenerator;

    public ExecutingAsyncAtomicIdGenerator(
            AsyncAtomicIdGenerator delegateIdGenerator, Executor orderedExecutor, Executor threadPoolExecutor) {
        super(delegateIdGenerator, orderedExecutor, threadPoolExecutor);
        this.delegateIdGenerator = delegateIdGenerator;
    }

    @Override
    public CompletableFuture<Long> nextId() {
        return asyncFuture(delegateIdGenerator.nextId());
    }
}
